2017-08-01

FizzBuzz問題

プログラミング問題だけど高校一年生までの数学の考え方で解決できる。嬉しい。

FizzBuzz問題とは

1 から順に数を数えていく。但し、その数が 3 で割り切れるならば数字の代わりに Fizz と、5 で割り切れるなら Buzz と言うゲーム。3 でも 5 でも割り切れる場合は、FizzBuzz の順に言う。

はてなキーワードより引用

これをプログラミングするのがFizzBuzz問題です。

具体化

1から15までの例を考えてみる。

入力出力
11
22
3Fizz
44
5Buzz
6Fizz
77
88
9Fizz
10Buzz
1111
12Fizz
1313
1414
15FizzBuzz

一般

入力と出力の関係を考えると、入力が定まれば、出力も一意に定まることが分かる。つまり入力と出力の関係関数にすることができる。この関数f(x)とする。

関数f(x)は、入力が3の倍数なら"Fizz"、5の倍数なら"Buzz"、3と5の公倍数なら"FizzBuzz"、その他は入力値を返す。

公倍数は最小公倍数を整数倍した値なので、ある値が公倍数であるかどうか判断するには、最小公倍数で割ってみて、割り切れるかを調べることにする。

3と5の最小公倍数は15なので、15で試しに割ってみて、割り切れるかどうかを見る。

3と5の倍数の判定も、それぞれ、3と5で割り切れるかどうかを見る。

コード

使う言語Perlである

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);
}

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん