#問題
用意された配列の値のうち、1つにプラス1して、すべての値と乗算した場合
どの値にプラス1するのがもっとも大きい結果になるか
###例
0)
numbers = {1, 2, 3}
Returns : 12
numbers = {1, 3, 2, 1, 1, 3}
Returns : 36
※数字は必ずしもユニークではない
numbers = {1000, 999, 998, 997, 996, 995}
Returns : 986074810223904000
※
答えは非常に大きい数字になりますが、2の62乗を超えません
numbers = {1, 1, 1, 1}
Returns : 36
#自分なりの回答
<?php
$numbers = array(1,1,1,1);
$target1 = 0;
for ($y = 0; $y < count($numbers); $y++){
$target2 = 1;
$numbers[$y] = $numbers[$y] + 1;
for ($i = 0; $i < count($numbers); $i++) {
$target2 = $target2 * $numbers[$i];
}
$numbers[$y] = $numbers[$y] - 1;
if($target1 < $target2){
$target1 = $target2;
}
}
echo $target1;
?>
これだと2重にループするので配列に1000個値が入ってきたときにとんでもない数ループする
そしてメソッド化していないため、テストするさいに、配列の中身を書き換える必要があるため
ソースを書き換えることになってよろしくない
#他の方の回答
<?php
function check($arr) {
asort($arr);
$arr[0] += 1;
return array_reduce($arr, function ($carry, $item)
{
$carry *= $item;
return $carry;
}, 1);
}
var_dump(check(array(1,2,3)));
?>
私の回答と違い、メソッド化してあるのでテストのさいにもコードを書き換えずテスト化
array_reduceを使用することによって、ループの数を私の回答から比べて半分に減らしている。
#まとめ
短いですがまとめると
私の回答はゴリ押しで誰でも思いつくような回答ですが、phpにはarray_reduceやarray_filter等便利な配列用の関数がいろいろあるので
どういう関数があるのか見ておいたほうが、私のような恥ずかしいコードを書かなくて済みますな。