Skip to content

Instantly share code, notes, and snippets.

@tinco
Created May 4, 2012 21:39
Show Gist options
  • Save tinco/2597922 to your computer and use it in GitHub Desktop.
Save tinco/2597922 to your computer and use it in GitHub Desktop.
Inverse of FizzBuzz implementation in Haskell
isFizz i = mod i 3 == 0
isBuzz i = mod i 5 == 0
isFizzBuzz i = isFizz i && isBuzz i
isFizzOrBuzz i = isFizz i || isBuzz i
isNeither i = (not.isBuzz) i && (not.isFizz) i
toFizzBuzz i
| isFizzBuzz i = "FizzBuzz"
| isFizz i = "Fizz"
| isBuzz i = "Buzz"
fizzBuzz numbers = map toFizzBuzz $ filter isFizzOrBuzz numbers
testFizzBuzz s
| s == "FizzBuzz" = (\i -> isFizzBuzz i)
| s == "Fizz" = (\i -> isFizz i && (not.isBuzz) i)
| s == "Buzz" = (\i -> isBuzz i && (not.isFizz) i)
buzzFizz :: [String] -> [Int]
buzzFizz (v:alues) =
shortest results
where
shortest (x:xs) = foldl (\a b -> if length a > length b then b else a) x xs
shortest [] = []
results = filter (\r -> last r > 0) $ map (buzzFizz' (v:alues)) startNumbers
startNumbers = filter (testFizzBuzz v) [1..100]
buzzFizz' :: [String] -> Int -> [Int]
buzzFizz' (value:values) i =
if testFizzBuzz value i
then [i] ++ buzzFizz' values (i+1)
else if isNeither i
then [i] ++ (buzzFizz' (value:values) (i+1))
else [-1]
buzzFizz' [] i = []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment