LoginSignup
2
1

More than 5 years have passed since last update.

PHPでくじ引き問題を解いてみた

Last updated at Posted at 2018-02-28

問題

数字の書かれた紙が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....
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1