fork download
  1. let inverseFizzBuzz input =
  2. let lcmWord, lcmNumber = "fizzbuzz", 15
  3. let partialResultMap =
  4. [0 .. lcmNumber] |> List.choose (fun n ->
  5. match n % 3, n % 5 with
  6. | 0, 0 -> Some("fizzbuzz", n)
  7. | 0, _ -> Some("fizz", n)
  8. | _, 0 -> Some("buzz", n)
  9. | _ -> None)
  10. |> fun ls -> [1 .. ls.Length] |> Seq.collect (fun n -> Seq.windowed n ls)
  11. |> Seq.map (Array.unzip >> fun (f, s) -> List.ofArray f, [|s.[s.Length - 1]; s.[0]|])
  12. |> Seq.sortBy (snd >> Array.reduce (-))
  13. |> Seq.distinctBy fst
  14. |> Map.ofSeq
  15. |> Map.add [lcmWord] [|lcmNumber; lcmNumber|]
  16.  
  17. let getPartialResult start words =
  18. Map.tryFind words partialResultMap |> Option.map (Array.map ((+) start))
  19.  
  20. (Array.ofSeq input, []) |> Seq.unfold (function
  21. | [||], _ -> None
  22. | words, first ->
  23. match Array.tryFindIndex ((=) lcmWord) words with
  24. | Some i -> Some(first @ List.ofArray words.[.. i], (words.[i + 1 ..], [lcmWord]))
  25. | None -> Some(first @ List.ofArray words, ([||], [lcmWord])))
  26. |> Seq.toArray
  27. |> Array.mapi ((*) lcmNumber >> getPartialResult)
  28. |> function
  29. | xs when Array.forall Option.isSome xs -> Some(xs.[0].Value.[1], xs.[xs.Length - 1].Value.[0])
  30. | _ -> None
  31.  
  32. [
  33. ["fizz"]
  34. ["buzz"]
  35. ["fizzbuzz"]
  36. ["fizz"; "buzz"]
  37. ["buzz"; "fizz"]
  38. ["fizz"; "buzz"; "fizz"]
  39. ["fizz"; "fizz"]
  40. ["fizz"; "fizz"; "buzz"]
  41. ["buzz"; "buzz"]
  42. ["fizz"; "fizzbuzz"]
  43. ["fizzbuzz"; "fizz"]
  44. ["fizz"; "fizzbuzz"; "fizz"]
  45. ["fizzbuzz"; "fizz"; "buzz"; "fizz"; "fizz"; "buzz"; "fizz"; "fizzbuzz"]
  46. ["fizz"; "fizzbuzz"; "fizz"; "buzz"; "fizz"; "fizz"; "buzz"; "fizz"; "fizzbuzz"; "fizz"; "buzz"; "fizz"; "fizz"; "buzz"; "fizz"; "fizzbuzz"; "fizz"; "buzz"]
  47. [""]
  48. ["abc"]
  49. ] |> List.map inverseFizzBuzz |> List.zip [
  50. Some(3, 3)
  51. Some(5, 5)
  52. Some(15, 15)
  53. Some(9, 10)
  54. Some(5, 6)
  55. Some(3, 6)
  56. Some(6, 9)
  57. Some(6, 10)
  58. None
  59. Some(12, 15)
  60. Some(15, 18)
  61. Some(12, 18)
  62. Some(15, 30)
  63. Some(12, 50)
  64. None
  65. None
  66. ] |> List.tryFind ((<||) (<>))
  67. |> printfn "%A"
Success #stdin #stdout 0.22s 13112KB
stdin
Standard input is empty
stdout
<null>