Difference between revisions of "Haskell Quiz/FizzBuzz/Solution Syzygies"
< Haskell Quiz | FizzBuzz
Jump to navigation
Jump to search
Tomjaguarpaw (talk | contribs) (Remove old, not very useful page) |
|||
Line 1: | Line 1: | ||
− | Fizz comes before Buzz comes before an integer. Fizz and Buzz stick to each other, but hide integers. |
||
− | |||
− | The lists for Fizz and Buzz are infinite, but zipping together with a finite list of integers, the result is finite. |
||
− | |||
− | <haskell> |
||
− | module Main where |
||
− | |||
− | main :: IO () |
||
− | main = mapM_ putStrLn $ zipWith3 join (loop 3 "Fizz") (loop 5 "Buzz") [1..100] |
||
− | where |
||
− | xor s t = if null s then t else s |
||
− | loop n s = cycle $ replicate (n-1) [] ++ [s] |
||
− | join s t n = xor (s ++ t) (show n) |
||
− | </haskell> |
||
− | |||
− | If one has enabled all warnings as errors, then the integers need an explicit type, as shown below. |
||
− | |||
− | The hiding logic can also be implemented by filtering for the first non-null element of a list: |
||
− | |||
− | <haskell> |
||
− | module Main where |
||
− | module Main where |
||
− | |||
− | main :: IO () |
||
− | main = sequence_ $ zipWith3 join (loop 3 "Fizz") (loop 5 "Buzz") [1..100 :: Int] |
||
− | where |
||
− | loop n s = cycle $ replicate (n-1) "" ++ [s] |
||
− | join s t n = putStrLn . head $ filter (not . null) [s ++ t, show n] |
||
− | </haskell> |