Towers of Hanoi: Difference between revisions

Content added Content deleted
m (→‎{{header|Haskell}}: Tidied monoid version. Removed an import line which is redundant in GHC 8)
Line 2,247: Line 2,247:


or, defining it as a monoid, and adding some output:
or, defining it as a monoid, and adding some output:
<lang haskell>import Data.Monoid ((<>), mempty)
<lang haskell>-------------------------- HANOI -------------------------
import Data.List (intercalate, transpose)


hanoi :: Int -> t -> t -> t -> [[t]]
hanoi :: Int -> String -> String -> String -> [(String, String)]
hanoi 0 _ _ _ = mempty
hanoi 0 _ _ _ = mempty
hanoi n l r m = hanoi (n - 1) l m r <> [[l, r]] <> hanoi (n - 1) m r l
hanoi n l r m = hanoi (n - 1) l m r <> [(l, r)] <> hanoi (n - 1) m r l



--------------------------- TEST -------------------------
main :: IO ()
main = putStrLn $ showHanoi 5


------------------------- DISPLAY ------------------------
showHanoi :: Int -> String
showHanoi :: Int -> String
showHanoi n =
showHanoi n =
unlines $
unlines $
fmap
intercalate " -> " <$>
(\(from, to) -> concat [justifyRight 5 ' ' from, " -> ", to])
transpose
((justifyLeft 6 ' ' <$>) <$> transpose (hanoi n "left" "right" "mid"))
(hanoi n "left" "right" "mid")


justifyLeft :: Int -> Char -> String -> String
justifyRight :: Int -> Char -> String -> String
justifyLeft n c s = take n (s <> replicate n c)
justifyRight n c = (drop . length) <*> (replicate n c <>)</lang>

-- TEST -------------------------------------------------------------
main :: IO ()
main = putStrLn $ showHanoi 5</lang>
{{Out}}
{{Out}}
<pre>left -> right
<pre> left -> right
left -> mid
left -> mid
right -> mid
right -> mid
left -> right
left -> right
mid -> left
mid -> left
mid -> right
mid -> right
left -> right
left -> right
left -> mid
left -> mid
right -> mid
right -> mid
right -> left
right -> left
mid -> left
mid -> left
right -> mid
right -> mid
left -> right
left -> right
left -> mid
left -> mid
right -> mid
right -> mid
left -> right
left -> right
mid -> left
mid -> left
mid -> right
mid -> right
left -> right
left -> right
mid -> left
mid -> left
right -> mid
right -> mid
right -> left
right -> left
mid -> left
mid -> left
mid -> right
mid -> right
left -> right
left -> right
left -> mid
left -> mid
right -> mid
right -> mid
left -> right
left -> right
mid -> left
mid -> left
mid -> right
mid -> right
left -> right</pre>
left -> right</pre>


=={{header|HolyC}}==
=={{header|HolyC}}==