fizzbuzz

http://chaton.practical-scheme.net/gauche/a/2012/08/09#entry-5023d040-7e774Pythonコードが分かりやすかったので、Haskellで書いてみました。

fizz = cycle ["", "", "fizz"]
buzz = cycle ["", "", "", "", "buzz"]

fizzbuzz n = [if xy == "" then show z else xy |
              (x, y, z) <- zip3 fizz buzz [1..n],
              let xy = x ++ y]

実行結果です。

$ ghci
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l fizzbuzz
[1 of 1] Compiling Main             ( fizzbuzz.hs, interpreted )
Ok, modules loaded: Main.
*Main> fizzbuzz 30
["1","2","fizz","4","buzz","fizz","7","8","fizz","buzz","11","fizz","13","14",
"fizzbuzz","16","17","fizz","19","buzz","fizz","22","23","fizz","buzz","26",
"fizz","28","29","fizzbuzz"]

ifのthenの方にxyを持ってきた方がいいかもしれないけど悩む。

if xy /= "" then xy else show z