Advertisement
Guest User

FizzBuzz in F# without if/else

a guest
Jul 13th, 2014
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.52 KB | None | 0 0
  1. let fb nn =
  2.  
  3.     // + and - operator are defined in Set.
  4.     // operator for intersection of sets.
  5.     let inline ( |^| ) a b = Set.intersect a b
  6.    
  7.     // an ideal of Z ring  (Z = field of integers)
  8.     // http://en.wikipedia.org/wiki/Ideal_(ring_theory)
  9.     let nZ n =
  10.         seq { for i in 1 .. nn/n do yield i * n }
  11.         |> Set.ofSeq
  12.  
  13.     // sets from ideals
  14.     let all = nZ 1
  15.     let z3 = nZ 3
  16.     let z5 = nZ 5
  17.     let z15 = z3 |^| z5   // (15) is m.c.m(3,5)
  18.  
  19.     // no buzz, no fizz...
  20.     let onlynormal =
  21.         all - (z3 + z5)
  22.         |> Set.map (fun x -> (x, x.ToString()))
  23.        
  24.     // only "fizzes"
  25.     let fizzes =
  26.         z3 - z15 |> Set.map (fun x -> (x, "Fizz"))
  27.  
  28.     // only "buzzes"
  29.     let buzzes =
  30.         z5 - z15 |> Set.map (fun x -> (x, "Buzz"))
  31.  
  32.     // only "fizzbuzz"
  33.     let buzzfizzes =
  34.         Set.map ( fun x -> (x, "FizzBuzz")) z15
  35.  
  36.     // result
  37.     // Note: apparently automatically sorts when convert the set to a list
  38.     onlynormal + fizzes + buzzes + buzzfizzes
  39.     |> Set.toList
  40.     |> List.map (fun x -> snd x)
  41.  
  42. // -----------------------------------------------------------------------
  43. // -- check ---
  44. // first 102
  45. printfn "1 - 102: %A" (fb 102)
  46.  
  47. // 597 position
  48. printfn "597: %s" (fb 600).[597-1]
  49.  
  50. // 1200 position
  51. printfn "1200: %s" (fb 1200).[1200-1]
  52.  
  53. // range
  54. ((fb 10000) |> List.toArray).[9900..9999] |> printfn "From 9901 to 10000: %A"
  55.  
  56. // WARNING: !!!!
  57. // 49500 (over 1.000.000 elements!!!!!)
  58. printfn "49500: %s" (fb 1000000).[49500-1]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement