6 ms·
I disagree that it maps most directly to the problem statement. You're performing a common factor computation in your mind, which may be more difficult given n
by icedog 12y ago
I disagree that it maps most directly to the problem statement. You're performing a common factor computation in your mind, which may be more difficult given numbers other than 3 and 5. In my opinion, pattern matching offers the most direct solution and comes with an abundance of compiler optimizations. Here's an example in Rust...
for i in range(1i, 101) {
match (i % 3, i % 5) {
(0, 0) => println!("Fizzbuzz"),
(0, _) => println!("Fizz"),
(_, 0) => println!("Buzz"),
_ => println!("{}", i),
}
}
- dragonwriter 12y ago> I disagree that it maps most directly to the problem statement. You're performing a common factor computation in your mind, which may be more difficult given numbers other than 3 and 5. Well, sure, explicitly calling out i % 15 rather than (i % 3) && (i % 5) or the equivalent has that problem. > In my opinion, pattern matching offers the most direct solution and comes with an abundance of compiler optimizations. Pattern matching is not available in many languages, but, sure, where its available, its a great choice. Note that this still has a distinct case for the case where both % 3 and % 5 are true, rather than just testing those cases independently and sequentially and concatenating, so I think it falls into the general class of solutions I was describing.
- icedog 12y agoI'll take an extra branch over concatenation and dealing with new line chars any day.
- tupshin 12y agoIf only rust had (optional only, please) fall through on matches, then you could skip a whole line :D
- qubitcoder 12y agoThe solution in Haskell is quite clean, I believe. fizzBuzz n | n `mod` 15 == 0 = "FizzBuzz" | n `mod` 3 == 0 = "Fizz" | n `mod` 5 == 0 = "Buzz" | otherwise = show n main = mapM_ (print . fizzBuzz) [1..100] I agree with you about generalizing pattern matching for less simple cases. Your example brought to mind view patterns, about which Oliver O'Charles had a nice writeup recently [1]. Nifty little extension. [1] https://ocharles.org.uk/blog/posts/2014-12-02-view-patterns.html https://ocharles.org.uk/blog/posts/2014-12-02-view-patterns....
- ghuntley 12y agoUsing F# pattern matching: let buzzer number = match number with | i when i % 3 = 0 && i % 5 = 0 -> "FizzBuzz" | i when i % 3 = 0 -> "Fizz" | i when i % 5 = 0 -> "Buzz" | i -> (sprintf "%i" i) for i = 1 to 100 do printfn "%s" (buzzer i)