これは何よりもパズルです。私は実際に解決策を見つけましたが、インターネット接続が失われたと思ったほど遅いです (以下を参照)。
問題は次のとおりです。
次のような数値の配列があるとしましょう。
$numbers_array = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
また、次のように変数に格納されたいくつかの数値があるとしましょう。
$sum = 15;
$sum2 = 24;
$sum3 = 400;
$numbers_array
の数値のいずれかを合計して合計を形成できる場合に true を返す関数を作成しようとしています(それぞれが 1 回だけ使用されます)。
function is_summable($array_of_nums, $sum_to_check) {
//What to put here?
}
var_dump(is_summable($numbers_array, $sum));
var_dump(is_summable($numbers_array, $sum2));
var_dump(is_summable($numbers_array, $sum3));
上記の出力は次のとおりです。
bool(true)
bool(true)
bool(false)
7 + 8 = 15、7 + 8 + 9 = 24 なので、1 ~ 9 の組み合わせで 200 を作成することはできません。
これが私の非常に遅い解決策です:
function is_summable($numbers, $sum) {
//Sort provided numbers and assign numerical keys.
asort($numbers);
$numbers = array_values($numbers);
//Var for additions and var for number of provided numbers.
$total = 0;
$numbers_length = count($numbers);
//Empty var to fill below.
$code = '';
//Loop and add for() loops.
for ($i = 0; $i < $numbers_length; $i++) {
$code .= 'for ($n' . $i . ' = 0; $n' . $i . ' < ' . $numbers_length . '; $n' . $i . '++) {';
if ($i != 0) {
$code .= 'if ($n' . $i . ' != $n' . ($i - 1) . ') {';
}
$code .= '$total += intval($numbers[$n' . $i . ']);';
$code .= 'if ($total == $sum) {';
$code .= 'return true;';
$code .= '}';
}
//Add ending bracket for for() loops above.
for ($l = 0; $l < $numbers_length; $l++) {
$code .= '$total -= intval($numbers[$n' . $i . ']);';
if ($l != 0) {
$code .= '}';
}
$code .= '}';
}
//Finally, eval the code.
eval($code);
//If "true" not returned above, return false.
return false;
}
$num_arr = array(1,2,3,4,5,6,7,8,9);
var_dump(is_summable($num_arr, 24));
いつものように、助けていただければ幸いです!!