プログラミングの問題だけど高校一年生までの数学の考え方で解決できる。嬉しい。
1 から順に数を数えていく。但し、その数が 3 で割り切れるならば数字の代わりに Fizz と、5 で割り切れるなら Buzz と言うゲーム。3 でも 5 でも割り切れる場合は、FizzBuzz の順に言う。
これをプログラミングするのがFizzBuzz問題です。
1から15までの例を考えてみる。
入力 | 出力 |
---|---|
1 | 1 |
2 | 2 |
3 | Fizz |
4 | 4 |
5 | Buzz |
6 | Fizz |
7 | 7 |
8 | 8 |
9 | Fizz |
10 | Buzz |
11 | 11 |
12 | Fizz |
13 | 13 |
14 | 14 |
15 | FizzBuzz |
入力と出力の関係を考えると、入力が定まれば、出力も一意に定まることが分かる。つまり、入力と出力の関係を関数にすることができる。この関数をf(x)とする。
関数f(x)は、入力が3の倍数なら"Fizz"、5の倍数なら"Buzz"、3と5の公倍数なら"FizzBuzz"、その他は入力値を返す。
公倍数は最小公倍数を整数倍した値なので、ある値が公倍数であるかどうか判断するには、最小公倍数で割ってみて、割り切れるかを調べることにする。
3と5の最小公倍数は15なので、15で試しに割ってみて、割り切れるかどうかを見る。
3と5の倍数の判定も、それぞれ、3と5で割り切れるかどうかを見る。
Perlは、上から順に命令を実行する命令型言語なので、3や5の倍数の判定の前に、15の倍数の判定を持ってくる。
逆にすると、15の倍数は3の倍数であり、5の倍数でもあるため、"FizzBuzz"が必要な所が"Fizz"や"Buzz"だけになってしまう。
use 5.024; use warnings; sub f { my ($x) = @_; if (($x % 15) == 0) { return "FizzBuzz"; } if (($x % 5) == 0) { return "Buzz"; } if (($x % 3) == 0) { return "Fizz"; } return $x; } foreach my $i (1..100) { say f($i); }
なぜ今 Perl ? これ原典はなんなの?
ただの日記ですよ。 Perlは私の趣味です。
×約数 ○倍数
プログラミングの問題だけど高校一年生までの数学の考え方で解決できる。嬉しい。 いやお前なに言ってんだ。 fizzbuzzは小学3年生までの算数の考え方で解決できるだろ。
あえてそこは突っ込まなかったのに。君はやさしくないな。