Inverse FizzBuzz with Haskell

Programming Haskell

Inverse FizzBuzz

Inverse FizzBuzzについてはこちらを参照 逆FizzBuzz問題 (Inverse FizzBuzz) - 猫とC#について書くmatarilloの雑記

簡単に言うとFizzBuzzの列が与えられた時に、その列を生成する数列を返すという問題です。

にわかHaskellerですが、Haskellで書いてみたので誰かが添削してくれることを願って残しておきます

方針

少し考えれば分かりますがFizzBuzzのパターンは7種類しかありません。

data FizzBuzz = Fizz | Buzz | FizzBuzz deriving (Eq, Show)
type Pattern = (Int,[FizzBuzz])

patterns :: [Pattern]
patterns = [
    (6,[Fizz,Fizz])
    ,(3,[Fizz,Buzz,Fizz,Fizz])
    ,(9,[Fizz,Buzz,Fizz,FizzBuzz])
    ,(12,[Fizz,FizzBuzz])
    ,(5,[Buzz,Fizz,Fizz])
    ,(10,[Buzz,Fizz,FizzBuzz])
    ,(15,[FizzBuzz])
  ]

ですので最初の数FizzBuzzを調べるだけで、数列の始まりは簡単に判明します。

上の性質に着目して

  1. FizzBuzz列の最初と上記のパターンを比較して始まりの数を取得
  2. 始まりの数からのFizzBuzz列を生成して、与えられたFizzBuzz列と一致させる

という方針で解いています。

真のHaskellerによる美しい解答

はこちら

Inverse FizzBuzz #Haskell - Qiita

Comments