Hatena::Grouphaskell

(200) Days of Haskell - Ruby 厨だけどハスケルやるよ

2011-09-28

(3) ハノイの塔を解く

| 15:53

自分で色々頑張った結果、できなかった。「過程を出力する」のができない。

軽く調べた感じ、方針。

  • 移動する過程を、文字列でも [(Char, Char)] でもいいので生成していく
  • 生成したデータを最後に出力する
module Main where
  hanoi :: Int -> IO()
  hanoi x = putStrLn $ hanoiMove(x, 'a', 'c', 'b')
  hanoiMove :: (Int, Char, Char, Char) -> [Char]
  hanoiMove (1, from, to, via) = [from] ++ " -> " ++ [to] ++ "\n"
  hanoiMove (height, from, to, via) =
    hanoiMove(height - 1,from, via, to) ++ 
    hanoiMove(1, from, to, via) ++ 
    hanoiMove(height - 1, via, to, from)
  
  -- sample
  main = hanoi 4

Ruby 厨時代が長かったため、インデントが半角2つなんだけれど、何か違和感…… 幅いくつが標準的なんだろう?

$ ghc hanoi.hs
[1 of 1] Compiling Main             ( hanoi.hs, hanoi.o )
Linking hanoi ...
$ ./hanoi 
a -> b
a -> c
b -> c
a -> b
c -> a
c -> b
a -> b
a -> c
b -> c
b -> a
c -> a
b -> c
a -> b
a -> c
b -> c

は、はい。

* * *

を大変参考にした、というかデータ構造以外一緒。

mapM_ って何だろう? と思ったので調べた。

次回は上記記事を写経する。

参考になりそう

本物のプログラマ~を目指そう。

あと、7つの言語なにがしのHaskellの課題、その他の言語の課題をHaskellで解く、とかをしたい。形だけHaskellの本を買う(死亡フラグ)よりあるものでできる限り頑張ろうという方針。