100 doors: Difference between revisions
(→{{header|Ada}}: Added optimized version) |
(Added optimization description) |
||
Line 4: | Line 4: | ||
Question: What state are the doors in after the last pass? Which are open, which are closed? [http://www.techinterview.org/Puzzles/fog0000000079.html] |
Question: What state are the doors in after the last pass? Which are open, which are closed? [http://www.techinterview.org/Puzzles/fog0000000079.html] |
||
'''Alternate:''' As noted in this page's [[Talk:100 doors|discussion page]], the only doors that remain open are whose numbers are perfect squares of integers. Opening only those doors is an optimization that may also be expressed. |
|||
=={{header|Ada}}== |
=={{header|Ada}}== |
||
===unoptimized=== |
|||
with Ada.Text_Io; use Ada.Text_Io; |
with Ada.Text_Io; use Ada.Text_Io; |
||
Line 29: | Line 32: | ||
end Doors; |
end Doors; |
||
===optimized=== |
|||
Optimized version: |
|||
with Ada.Text_Io; use Ada.Text_Io; |
with Ada.Text_Io; use Ada.Text_Io; |
||
Line 49: | Line 52: | ||
==[[MAXScript]]== |
==[[MAXScript]]== |
||
===unoptimized=== |
|||
[[Category:MAXScript]] |
[[Category:MAXScript]] |
||
doorsOpen = for i in 1 to 100 collect false |
doorsOpen = for i in 1 to 100 collect false |
||
Line 64: | Line 68: | ||
format ("Door % is open?: %\n") i doorsOpen[i] |
format ("Door % is open?: %\n") i doorsOpen[i] |
||
) |
) |
||
===optimized=== |
|||
Optimised version |
|||
for i in 1 to 100 do |
for i in 1 to 100 do |
||
( |
( |
||
Line 72: | Line 76: | ||
=={{header|Perl}}== |
=={{header|Perl}}== |
||
===unoptimized=== |
|||
my @doors; |
my @doors; |
||
for my $pass (1..100) { |
for my $pass (1..100) { |
||
Line 87: | Line 92: | ||
print "$_\t$doors[$_]\n" for 1..100; |
print "$_\t$doors[$_]\n" for 1..100; |
||
== |
=={{header|Python}}== |
||
===unoptimized=== |
|||
[[Category:Python]] |
|||
doorsOpen = [False for x in range(100)] |
doorsOpen = [False for x in range(100)] |
||
Revision as of 03:21, 17 October 2007
Problem: You have 100 doors in a row that are all initially closed. You make 100 passes by the doors, starting with the first door every time. The first time through, you visit every door and toggle the door (if the door is closed, you open it; if it is open, you close it). The second time you only visit every 2nd door (door #2, #4, #6, …). The third time, every 3rd door (door #3, #6, #9, …), etc, until you only visit the 100th door.
Question: What state are the doors in after the last pass? Which are open, which are closed? [1]
Alternate: As noted in this page's discussion page, the only doors that remain open are whose numbers are perfect squares of integers. Opening only those doors is an optimization that may also be expressed.
Ada
unoptimized
with Ada.Text_Io; use Ada.Text_Io; procedure Doors is type Door_State is (Closed, Open); type Door_List is array(Positive range 1..100) of Door_State; The_Doors : Door_List := (others => Closed); begin for I in 1..100 loop for J in The_Doors'range loop if J mod I = 0 then if The_Doors(J) = Closed then The_Doors(J) := Open; else The_Doors(J) := Closed; end if; end if; end loop; end loop; for I in The_Doors'range loop Put_Line(Integer'Image(I) & " is " & Door_State'Image(The_Doors(I))); end loop; end Doors;
optimized
with Ada.Text_Io; use Ada.Text_Io; with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions; procedure Doors_Optimized is Num : Float; begin for I in 1..100 loop Num := Sqrt(Float(I)); Put(Integer'Image(I) & " is "); if Float'Floor(Num) = Num then Put_Line("Opened"); else Put_Line("Closed"); end if; end loop; end Doors_Optimized;
MAXScript
unoptimized
doorsOpen = for i in 1 to 100 collect false for pass in 1 to 100 do ( for door in pass to 100 by pass do ( doorsOpen[door] = not doorsOpen[door] ) ) for i in 1 to doorsOpen.count do ( format ("Door % is open?: %\n") i doorsOpen[i] )
optimized
for i in 1 to 100 do ( root = pow i 0.5 format ("Door % is open?: %\n") i (root == (root as integer)) )
Perl
unoptimized
my @doors; for my $pass (1..100) { for (1..100) { if (0 == $_ % $pass) { if (1 == $doors[$_]) { $doors[$_] = 0; } else { $doors[$_] = 1; }; }; }; }; print "$_\t$doors[$_]\n" for 1..100;
Python
unoptimized
doorsOpen = [False for x in range(100)] for i in range(100): for j in range(i, 100, i+1): doorsOpen[j] = not doorsOpen[j] for k, l in enumerate(doorsOpen): print "Door", k+1, "is open?:", l
A version that only visits each door once.
for i in range(1, 101): root = i**0.5 print "Door", i, "is open?:", (root == int(root))