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>
<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}}==
|