Towers of Hanoi: Difference between revisions

→‎{{header|Haskell}}: writing it as a monoid, and adding some output
(Added Kotlin)
(→‎{{header|Haskell}}: writing it as a monoid, and adding some output)
Line 1,669:
<lang haskell>hanoiIO n = mapM_ f $ hanoi n 1 2 3 where
f (x,y) = putStrLn $ "Move " ++ show x ++ " to " ++ show y</lang>
Oror, instead, one can of course also program imperatively, using the IO monad directly:
<lang haskell>hanoiM :: Integer -> IO ()
hanoiM n = hanoiM' n 1 2 3 where
Line 1,677:
putStrLn $ "Move " ++ show a ++ " to " ++ show b
hanoiM' (n-1) c b a</lang>
 
or, writing it as a monoid, and adding some output:
<lang haskell>import Data.Monoid ((<>), mempty)
import Data.List (intercalate, transpose)
 
hanoi :: Int -> t -> t -> t -> [[t]]
hanoi n a b c =
if n > 0
then hanoi (n - 1) a c b <> [[a, b]] <> hanoi (n - 1) c b a
else mempty
 
-- TEST (hanoi 5) -------------------------------------------------------------
main :: IO ()
main =
mapM_ putStrLn $
intercalate " -> " <$>
transpose
((justifyLeft 6 ' ' <$>) <$> transpose (hanoi 5 "left" "right" "mid"))
where
justifyLeft n c s = take n (s ++ replicate n c)</lang>
{{Out}}
<pre>left -> right
left -> mid
right -> mid
left -> right
mid -> left
mid -> right
left -> right
left -> mid
right -> mid
right -> left
mid -> left
right -> mid
left -> right
left -> mid
right -> mid
left -> right
mid -> left
mid -> right
left -> right
mid -> left
right -> mid
right -> left
mid -> left
mid -> right
left -> right
left -> mid
right -> mid
left -> right
mid -> left
mid -> right
left -> right</pre>
 
=={{header|Icon}} and {{header|Unicon}}==
9,659

edits