ようこそ。睡眠不足なプログラマのチラ裏です。

Haskellで世界のナベアツ問題

※以前C#で書いたネタはこちら→FizzBuzz問題と世界のナベアツ
※後にPowerShellで書いたネタはこちら→PowerShellで世界のナベアツ問題


コンバット越前よろしく、
せっかくだから俺はHaskellで世界のナベアツ問題を書くゼ(ネタがないという意味で)

{- Haskellで世界のナベアツ -}
main : IO ()
main = return (nabeatsuOfWorld [1..40]) >>= print

{- 3の倍数と3の付く数字だけアホになり、8の倍数だけ気持ち良くなります -}
nabeatsuOfWorld : [Int] -> [String]
nabeatsuOfWorld [] = []
nabeatsuOfWorld (x:s)
  | x `mod` 3 ==  0   = (show x ++ "Aho")  :nabeatsuOfWorld(xs) -- 3の倍数でアホになる
  | find (show x) '3' = (show x ++ "Aho")  :nabeatsuOfWorld(xs) -- 3の付く数字でアホになる
  | x `mod` 8 ==  0   = (show x ++ "Ahan") :nabeatsuOfWorld(xs) -- 8の倍数で気持ち良くなる
  | otherwise         = show x             :nabeatsuOfWorld(xs)

find : String -> Char -> Bool
find [] _ = False
find (x:s) y = if (x == y) then True else find(xs) y

本物のHaskellerであれば、もっと簡潔明快で美しく書けるんだろうけど、
今の自分の力量ではこんなところで落ち着く。まぁそこそこ明快かと。


(追記)
アホ且つ気持ちいいが表現できていませんでしたね(^-^;)
修正版をあげておきます

{- Haskellで世界のナベアツ -}
main = return (nabeatsuOfWorld [1..40]) >>= print

{- 3の倍数と3の付く数字だけアホになり、8の倍数だけ気持ち良くなります -}
nabeatsuOfWorld :: [Int] -> [String]
nabeatsuOfWorld [] = []
nabeatsuOfWorld (x:xs)
  | aho x && ahan x  = (show x ++ "AhoAhan") : nabeatsuOfWorld(xs)  -- 3の倍数または3の付く数字または8の倍数で、アホ気持ち良くなる
  | aho x            = (show x ++ "Aho")     : nabeatsuOfWorld(xs)  -- 3の倍数または3の付く数字でアホになる
  | ahan x           = (show x ++ "Ahan")    : nabeatsuOfWorld(xs)  -- 8の倍数で気持ち良くなる
  | otherwise        = show x                : nabeatsuOfWorld(xs)

aho :: Int -> Bool
aho x  = x `mod` 3 ==  0 || find (show x) '3'

ahan :: Int -> Bool
ahan x  = x `mod` 8 ==  0

find :: String -> Char -> Bool
find [] _ = False
find (x:xs) y = if (x == y) then True else find(xs) y