100 doors: Difference between revisions

Content added Content deleted
(Added Vala, fixed alphabetization)
Line 460: Line 460:
}
}
}</lang>
}</lang>

=={{header|Batch File}}==

'''unoptimized'''
<lang dos>
@echo off
setlocal enableDelayedExpansion
:: 0 = closed
:: 1 = open
:: SET /A treats undefined variable as 0
:: Negation operator ! must be escaped because delayed expansion is enabled
for /l %%p in (1 1 100) do for /l %%d in (%%p %%p 100) do set /a "door%%d=^!door%%d"
for /l %%d in (1 1 100) do if !door%%d!==1 (
echo door %%d is open
) else echo door %%d is closed
</lang>

'''optimized'''
<lang dos>
@echo off
setlocal enableDelayedExpansion
set /a square=1, incr=3
for /l %%d in (1 1 100) do (
if %%d neq !square! (echo door %%d is closed) else (
echo door %%d is open
set /a square+=incr, incr+=2
)
)
</lang>


=={{header|BASIC}}==
=={{header|BASIC}}==
Line 523: Line 494:
END IF
END IF
NEXT i</lang>
NEXT i</lang>

=={{header|Batch File}}==

'''unoptimized'''
<lang dos>
@echo off
setlocal enableDelayedExpansion
:: 0 = closed
:: 1 = open
:: SET /A treats undefined variable as 0
:: Negation operator ! must be escaped because delayed expansion is enabled
for /l %%p in (1 1 100) do for /l %%d in (%%p %%p 100) do set /a "door%%d=^!door%%d"
for /l %%d in (1 1 100) do if !door%%d!==1 (
echo door %%d is open
) else echo door %%d is closed
</lang>

'''optimized'''
<lang dos>
@echo off
setlocal enableDelayedExpansion
set /a square=1, incr=3
for /l %%d in (1 1 100) do (
if %%d neq !square! (echo door %%d is closed) else (
echo door %%d is open
set /a square+=incr, incr+=2
)
)
</lang>


=={{header|BBC BASIC}}==
=={{header|BBC BASIC}}==
Line 1,565: Line 1,565:
(X, false)-> io:format("Door ~p: close~n",[X]) end,
(X, false)-> io:format("Door ~p: close~n",[X]) end,
[Out(X,F(X)) || X <- lists:seq(1,100)].</lang>
[Out(X,F(X)) || X <- lists:seq(1,100)].</lang>

=={{header|Euphoria}}==
unoptimised
<lang Euphoria>-- doors.ex
include std/console.e
sequence doors
doors = repeat( 0, 100 ) -- 1 to 100, initialised to false

for pass = 1 to 100 do
for door = pass to 100 by pass do
--printf( 1, "%d", doors[door] )
--printf( 1, "%d", not doors[door] )
doors[door] = not doors[door]
end for
end for

sequence oc

for i = 1 to 100 do
if doors[i] then
oc = "open"
else
oc = "closed"
end if
printf( 1, "door %d is %s\n", { i, oc } )
end for
</lang>


=={{header|Euler Math Toolbox}}==
=={{header|Euler Math Toolbox}}==
Line 1,623: Line 1,596:
door 100 is open
door 100 is open
</lang>
</lang>

=={{header|Euphoria}}==
unoptimised
<lang Euphoria>-- doors.ex
include std/console.e
sequence doors
doors = repeat( 0, 100 ) -- 1 to 100, initialised to false

for pass = 1 to 100 do
for door = pass to 100 by pass do
--printf( 1, "%d", doors[door] )
--printf( 1, "%d", not doors[door] )
doors[door] = not doors[door]
end for
end for

sequence oc

for i = 1 to 100 do
if doors[i] then
oc = "open"
else
oc = "closed"
end if
printf( 1, "door %d is %s\n", { i, oc } )
end for
</lang>

=={{header|F_Sharp|F#}}==
Requires #light in versions of F# prior to 2010 beta.
<lang fsharp>let answerDoors =
let ToggleNth n (lst:bool array) = // Toggle every n'th door
[(n-1) .. n .. 99] // For each appropriate door
|> Seq.iter (fun i -> lst.[i] <- not lst.[i]) // toggle it
let doors = Array.create 100 false // Initialize all doors to closed
Seq.iter (fun n -> ToggleNth n doors) [1..100] // toggle the appropriate doors for each pass
doors // Initialize all doors to closed
</lang>
Following is the solution using perfect squares. The coercions in PerfectSquare are, I believe, slightly different in versions prior to 2010 beta and, again, #light is required in those versions.
<lang fsharp>open System
let answer2 =
let PerfectSquare n =
let sqrt = int(Math.Sqrt(float n))
n = sqrt * sqrt
[| for i in 1..100 do yield PerfectSquare i |]</lang>


=={{header|Factor}}==
=={{header|Factor}}==
Line 1,759: Line 1,777:
END PROGRAM DOORS</lang>
END PROGRAM DOORS</lang>


=={{header|F_Sharp|F#}}==
Requires #light in versions of F# prior to 2010 beta.
<lang fsharp>let answerDoors =
let ToggleNth n (lst:bool array) = // Toggle every n'th door
[(n-1) .. n .. 99] // For each appropriate door
|> Seq.iter (fun i -> lst.[i] <- not lst.[i]) // toggle it
let doors = Array.create 100 false // Initialize all doors to closed
Seq.iter (fun n -> ToggleNth n doors) [1..100] // toggle the appropriate doors for each pass
doors // Initialize all doors to closed
</lang>
Following is the solution using perfect squares. The coercions in PerfectSquare are, I believe, slightly different in versions prior to 2010 beta and, again, #light is required in those versions.
<lang fsharp>open System
let answer2 =
let PerfectSquare n =
let sqrt = int(Math.Sqrt(float n))
n = sqrt * sqrt
[| for i in 1..100 do yield PerfectSquare i |]</lang>
=={{header|GAP}}==
=={{header|GAP}}==
<lang gap>doors := function(n)
<lang gap>doors := function(n)
Line 2,268: Line 2,269:
;Optimized
;Optimized
{{VI solution|LabVIEW_100_doors.png}}
{{VI solution|LabVIEW_100_doors.png}}

=={{header|Liberty BASIC}}==
<lang lb>dim doors(100)
for pass = 1 to 100
for door = pass to 100 step pass
doors(door) = not(doors(door))
next door
next pass
print "open doors ";
for door = 1 to 100
if doors(door) then print door;" ";
next door</lang>

=={{header|Logo}}==

<lang Logo>to doors
;Problem 100 Doors
;FMSLogo
;lrcvs 2010

make "door (vector 100 1)
for [p 1 100][setitem :p :door 0]
for [a 1 100 1][for [b :a 100 :a][make "x item :b :door
ifelse :x = 0 [setitem :b :door 1][setitem :b :door 0] ] ]
for [c 1 100][make "y item :c :door
ifelse :y = 0 [pr (list :c "Close)] [pr (list :c "Open)] ]
end</lang>


=={{header|Lhogho}}==
=={{header|Lhogho}}==
Line 2,332: Line 2,303:


doors</lang>
doors</lang>

=={{header|Liberty BASIC}}==
<lang lb>dim doors(100)
for pass = 1 to 100
for door = pass to 100 step pass
doors(door) = not(doors(door))
next door
next pass
print "open doors ";
for door = 1 to 100
if doors(door) then print door;" ";
next door</lang>

=={{header|Logo}}==

<lang Logo>to doors
;Problem 100 Doors
;FMSLogo
;lrcvs 2010

make "door (vector 100 1)
for [p 1 100][setitem :p :door 0]
for [a 1 100 1][for [b :a 100 :a][make "x item :b :door
ifelse :x = 0 [setitem :b :door 1][setitem :b :door 0] ] ]
for [c 1 100][make "y item :c :door
ifelse :y = 0 [pr (list :c "Close)] [pr (list :c "Open)] ]
end</lang>


=={{header|Lua}}==
=={{header|Lua}}==
Line 2,534: Line 2,535:
endfor
endfor
end</lang>
end</lang>

=={{header|Mirah}}==

<lang Mirah>import java.util.ArrayList

class Door
:state

def initialize
@state=false
end
def closed?; !@state; end
def open?; @state; end

def close; @state=false; end
def open; @state=true; end
def toggle
if closed?
open
else
close
end
end
def toString; Boolean.toString(@state); end
end
doors=ArrayList.new
1.upto(100) do
doors.add(Door.new)
end

1.upto(100) do |multiplier|
index = 0
doors.each do |door|
Door(door).toggle if (index+1)%multiplier == 0
index += 1
end
end

i = 0
doors.each do |door|
puts "Door #{i+1} is #{door}."
i+=1
end
</lang>


=={{header|MIPS Assembly}}==
=={{header|MIPS Assembly}}==
Line 2,647: Line 2,600:
addi $t1, $t1, 1
addi $t1, $t1, 1
bne $t1, 101 loop3
bne $t1, 101 loop3
</lang>

=={{header|Mirah}}==

<lang Mirah>import java.util.ArrayList

class Door
:state

def initialize
@state=false
end
def closed?; !@state; end
def open?; @state; end

def close; @state=false; end
def open; @state=true; end
def toggle
if closed?
open
else
close
end
end
def toString; Boolean.toString(@state); end
end
doors=ArrayList.new
1.upto(100) do
doors.add(Door.new)
end

1.upto(100) do |multiplier|
index = 0
doors.each do |door|
Door(door).toggle if (index+1)%multiplier == 0
index += 1
end
end

i = 0
doors.each do |door|
puts "Door #{i+1} is #{door}."
i+=1
end
</lang>
</lang>


Line 3,138: Line 3,139:
WriteLn('Close doors: ' + ACloseDoors);
WriteLn('Close doors: ' + ACloseDoors);
end. </lang>
end. </lang>

=={{header|PHP}}==
'''optimized'''
<lang php><?php
for ($i = 1; $i <= 100; $i++) {
$root = sqrt($i);
$state = ($root == ceil($root)) ? 'open' : 'closed';
echo "Door {$i}: {$state}\n";
}
?></lang>

'''unoptimized'''
<lang php><?php
$toggleState = array('open' => 'closed', 'closed' => 'open');
$doors = array_fill(1, 100, 'closed');
for ($pass = 1; $pass <= 100; ++$pass) {
for ($nr = 1; $nr <= 100; ++$nr) {
if ($nr % $pass == 0) {
$doors[$nr] = $toggleState[$doors[$nr]];
}
}
}
for ($nr = 1; $nr <= 100; ++$nr)
printf("Door %d is %s\n", $nr, $doors[$nr]);
?></lang>


=={{header|Perl}}==
=={{header|Perl}}==
Line 3,214: Line 3,190:


<lang perl6>say "Door $_ is ", <closed open>[.sqrt == .sqrt.floor] for 1..100;</lang>
<lang perl6>say "Door $_ is ", <closed open>[.sqrt == .sqrt.floor] for 1..100;</lang>

=={{header|PHP}}==
'''optimized'''
<lang php><?php
for ($i = 1; $i <= 100; $i++) {
$root = sqrt($i);
$state = ($root == ceil($root)) ? 'open' : 'closed';
echo "Door {$i}: {$state}\n";
}
?></lang>

'''unoptimized'''
<lang php><?php
$toggleState = array('open' => 'closed', 'closed' => 'open');
$doors = array_fill(1, 100, 'closed');
for ($pass = 1; $pass <= 100; ++$pass) {
for ($nr = 1; $nr <= 100; ++$nr) {
if ($nr % $pass == 0) {
$doors[$nr] = $toggleState[$doors[$nr]];
}
}
}
for ($nr = 1; $nr <= 100; ++$nr)
printf("Door %d is %s\n", $nr, $doors[$nr]);
?></lang>


=={{header|PicoLisp}}==
=={{header|PicoLisp}}==
Line 3,833: Line 3,834:


<lang Salmon>variable y:=1;for(x;1;x<101)"Door "~sprint(x)~" is "~(x==y*y?{++y;return"open";}:"closed")!;</lang>
<lang Salmon>variable y:=1;for(x;1;x<101)"Door "~sprint(x)~" is "~(x==y*y?{++y;return"open";}:"closed")!;</lang>

=={{header|Sather}}==
<lang sather>class MAIN is
main is
pass, door :INT;
doors :ARRAY{BOOL} := #(100);
loop
doors[0.upto!(99)] := false;
end;
pass := 0;
loop while!(pass < 100);
door := pass;
loop while! (door < 100);
doors[door] := ~doors[door];
door := door + pass + 1
end;
pass := pass + 1;
end;
loop
door := 0.upto!(99);
#OUT + (door+1) + " " + doors[door] + "\n";
end;
end;
end;</lang>


=={{header|SAS}}==
=={{header|SAS}}==
Line 3,888: Line 3,865:
println("open: " + o)
println("open: " + o)
println("closed: " + (1 to 100 filterNot o.contains))</lang>
println("closed: " + (1 to 100 filterNot o.contains))</lang>

=={{header|Sather}}==
<lang sather>class MAIN is
main is
pass, door :INT;
doors :ARRAY{BOOL} := #(100);
loop
doors[0.upto!(99)] := false;
end;
pass := 0;
loop while!(pass < 100);
door := pass;
loop while! (door < 100);
doors[door] := ~doors[door];
door := door + pass + 1
end;
pass := pass + 1;
end;
loop
door := 0.upto!(99);
#OUT + (door+1) + " " + doors[door] + "\n";
end;
end;
end;</lang>


=={{header|Scheme}}==
=={{header|Scheme}}==
Line 4,036: Line 4,037:
96 is closed 97 is closed 98 is closed 99 is closed 100 is open
96 is closed 97 is closed 98 is closed 99 is closed 100 is open
</pre>
</pre>

=={{header|SETL}}==
'''Unoptimized'''
<lang setl>program hundred_doors;

const toggle := {['open', 'closed'], ['closed', 'open']};

doorStates := ['closed'] * 100;

(for interval in [1..100])
doorStates := [if i mod interval = 0 then
toggle(prevState) else
prevState end:
prevState = doorStates(i)];
end;

(for finalState = doorStates(i))
print('door', i, 'is', finalState);
end;

end program;</lang>
If 'open' weren't a reserved word, we could omit the single quotes around it.

'''Optimized'''
Exploits the fact that squares are separated by successive odd numbers. Use array replication to insert the correct number of closed doors in between the open ones.
<lang setl>program hundred_doors;

doorStates := (+/ [['closed'] * oddNum with 'open': oddNum in [1,3..17]]);

(for finalState = doorStates(i))
print('door', i, 'is', finalState);
end;

end program;</lang>


=={{header|Slate}}==
=={{header|Slate}}==
Line 4,120: Line 4,155:
delay wait]]] fork.
delay wait]]] fork.
</lang>
</lang>

=={{header|SETL}}==
'''Unoptimized'''
<lang setl>program hundred_doors;

const toggle := {['open', 'closed'], ['closed', 'open']};

doorStates := ['closed'] * 100;

(for interval in [1..100])
doorStates := [if i mod interval = 0 then
toggle(prevState) else
prevState end:
prevState = doorStates(i)];
end;

(for finalState = doorStates(i))
print('door', i, 'is', finalState);
end;

end program;</lang>
If 'open' weren't a reserved word, we could omit the single quotes around it.

'''Optimized'''
Exploits the fact that squares are separated by successive odd numbers. Use array replication to insert the correct number of closed doors in between the open ones.
<lang setl>program hundred_doors;

doorStates := (+/ [['closed'] * oddNum with 'open': oddNum in [1,3..17]]);

(for finalState = doorStates(i))
print('door', i, 'is', finalState);
end;

end program;</lang>


=={{header|SNOBOL4}}==
=={{header|SNOBOL4}}==
Line 4,538: Line 4,539:
<1,4,9,16,25,36,49,64,81>
<1,4,9,16,25,36,49,64,81>
</pre>
</pre>

=={{header|Vala}}==
'''Unoptimized'''
<lang vala>int main() {
bool doors_open[101];
for(int i = 1; i < doors_open.length; i++) {
for(int j = 1; i*j < doors_open.length; j++) {
doors_open[i*j] = !doors_open[i*j];
}
stdout.printf("%d: %s\n", i, (doors_open[i] ? "open" : "closed"));
}
return 0;
}</lang>
Output:
<pre>1: open
2: closed
3: closed
4: open
5: closed
6: closed
7: closed
8: closed
9: open
10: closed
11: closed
...</pre>
'''Optimized'''
<lang vala>int main() {
int i = 1;
while(i*i <= 100) {
stdout.printf("${i*i} open\n");
i++;
}
return 0;
}</lang>
Output:
<pre>1 open
4 open
9 open
16 open
25 open
36 open
49 open
64 open
81 open
100 open</pre>


=={{header|VBScript}}==
=={{header|VBScript}}==