/
ch-2.hs
30 lines (25 loc) · 840 Bytes
/
ch-2.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
module Challenge046_2
where
import Control.Monad.State.Lazy
starter :: [(Int , String)]
starter = zip [1..500] (take 500 $ repeat "open")
my_flip :: String -> String
my_flip s
|s == "open" = "closed"
|otherwise = "open"
changeDoorStatus :: [(Int , String)] -> Int -> [(Int , String)]
changeDoorStatus doornumbers i =
map (\(n , s ) -> if mod n i == 0 then ( n , my_flip s )
else ( n , s ) ) doornumbers
findOpenDoors :: Int -> State [(Int ,String)] [Int]
findOpenDoors n = do
allDoors <- get
if n == 501
then return ( map fst $ filter ( ("open" == ) . snd ) allDoors)
else do
put $ changeDoorStatus allDoors n
findOpenDoors ( n + 1 )
main :: IO ( )
main = do
openDoors <- return $ evalState (findOpenDoors 2 ) starter
mapM_ putStrLn $ map (\i -> "door " ++ show i ++ " is open!" ) openDoors