結果

問題 No.9002 FizzBuzz(テスト用)
ユーザー your_name
提出日時 2016-11-17 19:41:10
言語 Haskell
(9.10.1)
結果
AC  
実行時間 2 ms / 5,000 ms
コード長 1,475 bytes
コンパイル時間 8,792 ms
コンパイル使用メモリ 169,088 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-11-26 03:08:29
合計ジャッジ時間 8,745 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 4
権限があれば一括ダウンロードができます
コンパイルメッセージ
Loaded package environment from /home/judge/.ghc/x86_64-linux-9.8.2/environments/default
[1 of 2] Compiling Main             ( Main.hs, Main.o )
[2 of 2] Linking a.out

ソースコード

diff #

data FizzBuzz =
  Numero Int
  | Fizz
  | Buzz
  | FizzBuzz

instance Show FizzBuzz where
  show (Numero x) = show x
  show Fizz       = "Fizz"
  show Buzz       = "Buzz"
  show FizzBuzz   = "FizzBuzz"

type Max = Int
type Current = Int

data Counter = Counter {
  max :: Max
  , current :: Current
  } deriving (Show, Eq)

class Next n where
  next :: n -> n

counter :: Max -> Counter
counter m = Counter m 1

instance Next Counter where
  next ct@(Counter m c)
    | match ct  = Counter m 1
    | otherwise = Counter m (c + 1)

match :: Counter -> Bool
match (Counter m c)
  | m == c    = True
  | otherwise = False

data Runner = Runner Counter Counter Counter

instance Next Runner where
  next (Runner i f b) = Runner (next i) (next f) (next b)

runner :: Int -> Runner
runner m = Runner (counter m) (counter 3) (counter 5)

fin :: Runner -> Bool
fin (Runner i _ _) = match i

run :: Runner -> [FizzBuzz]
run r
  | fin r     = [fizzbuzz r]
  | otherwise = (fizzbuzz r) : (run $ next r)

fizzbuzz :: Runner -> FizzBuzz
fizzbuzz (Runner i f b) = case (match f, match b) of
  (True, True)   -> FizzBuzz
  (False, True)  -> Buzz
  (True, False)  -> Fizz
  (_, _)         -> Numero $ current i

readInput :: IO String -> IO Int
readInput io = fmap read io

showResult :: [FizzBuzz] -> IO ()
showResult = mapM_ print

app :: IO String -> IO ()
app io = do
  s <- readInput io
  r <- return $ runner s
  r' <- return $ run r
  showResult r'

main :: IO ()
main = app getLine
0