The one-liner solution: {∊(3↑(0=3 5|⍵)∪1)/'Fizz' 'Buzz' ⍵}¨⍳20
The explanation:
For each value in [1, 2, ..., 20]
, find the boolean mask of “is this divisible by 3 or 5?” (vectorized).
{0=3 5|⍵}¨⍳20
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│0 0│0 0│1 0│0 0│0 1│1 0│0 0│0 0│1 0│0 1│0 0│1 0│0 0│0 0│1 1│0 0│0 0│1 0│0 0│0 1│
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
Union this with the value 1; if 1 doesn’t already appear, add it. This is now a mask for whether the result
should be “fizz” (1 0)
, “buzz” (0 1)
, “fizzbuzz” (1 1)
, or the number itself (0 0 1)
.
{(0=3 5|⍵)∪1}¨⍳20
┌─────┬─────┬───┬─────┬───┬───┬─────┬─────┬───┬───┬─────┬───┬─────┬─────┬───┬─────┬─────┬───┬─────┬───┐
│0 0 1│0 0 1│1 0│0 0 1│0 1│1 0│0 0 1│0 0 1│1 0│0 1│0 0 1│1 0│0 0 1│0 0 1│1 1│0 0 1│0 0 1│1 0│0 0 1│0 1│
└─────┴─────┴───┴─────┴───┴───┴─────┴─────┴───┴───┴─────┴───┴─────┴─────┴───┴─────┴─────┴───┴─────┴───┘
Take 3 elements; if there are only 2, extend it to 3 (adding a 0). The combinations are then
“fizz” (1 0 0)
, “buzz” (0 1 0)
, “fizzbuzz” (1 1 0)
, or the number itself (0 0 1)
.
{3↑(0=3 5|⍵)∪1}¨⍳20
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 0 1│0 0 1│1 0 0│0 0 1│0 1 0│1 0 0│0 0 1│0 0 1│1 0 0│0 1 0│0 0 1│1 0 0│0 0 1│0 0 1│1 1 0│0 0 1│0 0 1│1 0 0│0 0 1│0 1 0│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
Filter the vector 'Fizz' 'Buzz' ⍵
based on this boolean mask.
{(3↑(0=3 5|⍵)∪1)/'Fizz' 'Buzz'⍵}¨⍳20
┌─┬─┬──────┬─┬──────┬──────┬─┬─┬──────┬──────┬──┬──────┬──┬──┬───────────┬──┬──┬──────┬──┬──────┐
│1│2│┌────┐│4│┌────┐│┌────┐│7│8│┌────┐│┌────┐│11│┌────┐│13│14│┌────┬────┐│16│17│┌────┐│19│┌────┐│
│ │ ││Fizz││ ││Buzz│││Fizz││ │ ││Fizz│││Buzz││ ││Fizz││ │ ││Fizz│Buzz││ │ ││Fizz││ ││Buzz││
│ │ │└────┘│ │└────┘│└────┘│ │ │└────┘│└────┘│ │└────┘│ │ │└────┴────┘│ │ │└────┘│ │└────┘│
└─┴─┴──────┴─┴──────┴──────┴─┴─┴──────┴──────┴──┴──────┴──┴──┴───────────┴──┴──┴──────┴──┴──────┘
and finally, enlist (flatten) the vector.
{∊(3↑(0=3 5|⍵)∪1)/'Fizz' 'Buzz'⍵}¨⍳20
┌─┬─┬────┬─┬────┬────┬─┬─┬────┬────┬──┬────┬──┬──┬────────┬──┬──┬────┬──┬────┐
│1│2│Fizz│4│Buzz│Fizz│7│8│Fizz│Buzz│11│Fizz│13│14│FizzBuzz│16│17│Fizz│19│Buzz│
└─┴─┴────┴─┴────┴────┴─┴─┴────┴────┴──┴────┴──┴──┴────────┴──┴──┴────┴──┴────┘
So concise.