問題
数字の書かれた紙がn枚袋の中に入っている。あなたは紙を1枚引き、数字を見たら紙を袋に戻す。4回引いて、紙に書かれていた数字の和がmであれば当たりである。紙を調べて、当たりになる組み合わせがあるか調べるプログラムを作成しなさい。
解答
くじを4回引く組み合わせをひたすら調べればいいだろう、ということでこんな感じに。
<?php
$atari = 10;
$kuji_list = [
1,2,3,4,5,6
];
function delveKuji ($atari, $kuji_list) {
$v = false;
foreach ($kuji_list as $kuji_1) {
foreach ($kuji_list as $kuji_2) {
foreach ($kuji_list as $kuji_3) {
foreach ($kuji_list as $kuji_4) {
if ($kuji_1 + $kuji_2 + $kuji_3 + $kuji_4 == $atari) {
echo sprintf('Atari!! %d + %d + %d + %d = %d',$kuji_1, $kuji_2, $kuji_3, $kuji_4, $atari);
$v = true;
break 4;
}
}
}
}
}
if (!$v) {
echo 'not found';
}
}
delveKuji($atari, $kuji_list);
// Atari!! 1 + 1 + 2 + 6 = 10
当たりを見つけた時のフラグとかbreak 4
とかちょっと気持ち悪い…。こういうのをさらっと格好良く書きたいですね。
おまけ
実際にくじを引くプログラムはこんな感じ。
<?php
$atari = 10;
$kuji_list = [
1,2,3,4,5,6
];
function playGame($atari, $kuji_list) {
$sum = 0;
for ($i=1; $i<=4; $i++) {
if ($i != 1) {
echo ' + ';
}
$kuji_key = array_rand($kuji_list);
echo $kuji_list[$kuji_key];
$sum += $kuji_list[$kuji_key];
}
echo ' = '.$sum.PHP_EOL;
if ($sum == $atari) {
echo 'Atari!!';
} else {
echo 'Hazure....';
}
}
playGame($atari, $kuji_list);
// 2 + 6 + 3 + 3 = 14
// Hazure....