BuzzFib

ナイーブ.ちょっと書き換えた.FibBuzzだとおもったら、BuzzFibというらしい。

module Main where

import Data.List
import System.Environment

buzzfib :: [String]
buzzfib = "FibBuzz" : unfoldr phi (1,1,1,tail $ cycle $ take 5 $"Buzz":repeat "")
  where phi (a,b,c,z:zs) | b == c    = Just ("Fib"  ++  z,(b,a+b,c+1,zs))
                         | otherwise = Just (z <+> show c,(a,b  ,c+1,zs))
        "" <+> s = s
        s  <+> _ = s

main :: IO ()
main = putStr . unlines . flip take buzzfib . read . head =<< getArgs
% buzzfib 40
FibBuzz
Fib
Fib
Fib
4
FibBuzz
6
7
Fib
9
Buzz
11
12
Fib
14
Buzz
16
17
18
19
Buzz
Fib
22
23
24
Buzz
26
27
28
29
Buzz
31
32
33
Fib
Buzz
36
37
38
39