100 doors: Difference between revisions

Content deleted Content added
Added Transact-SQL solution
Line 11,879: Line 11,879:
for(%a = 1; %a <= 100; %a++)
for(%a = 1; %a <= 100; %a++)
echo("Door #" @ %a @ " is" SPC %door[%current] ? "Open" : "Closed" @ ".");</lang>
echo("Door #" @ %a @ " is" SPC %door[%current] ? "Open" : "Closed" @ ".");</lang>

=={{header|Transact-SQL}}==
<lang sql>
WITH OneToTen (N)
AS ( SELECT N
FROM ( VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)
) V(N)
)
, InitDoors (Num, IsOpen)
AS ( SELECT 1
+ 1 * Units.N
+ 10 * Tens.N As Num
, Convert(Bit, 0) As IsOpen
FROM OneToTen As Units
CROSS JOIN OneToTen As Tens
) -- This part could be easier with a tally table or equivalent table-valued function
, States (NbStep, Num, IsOpen)
AS ( SELECT 0 As NbStep
, Num
, IsOpen
FROM InitDoors As InitState
UNION ALL
SELECT 1 + NbStep
, Num
, CASE Num % (1 + NbStep)
WHEN 0 THEN ~IsOpen
ELSE IsOpen
END
FROM States
WHERE NbStep < 100
)
SELECT Num As DoorNumber
, Concat( 'Door number ', Num, ' is '
, CASE IsOpen
WHEN 1 THEN ' open'
ELSE ' closed'
END ) As Result -- Concat needs SQL Server 2012
FROM States
WHERE NbStep = 100
ORDER By Num
; -- Fortunately, maximum recursion is 100 in SQL Server.
-- For more doors, the MAXRECURSION hint should be used.
-- More doors would also need an InitDoors with more rows.
</lang>


=={{header|True BASIC}}==
=={{header|True BASIC}}==