【配列に対しての複雑な処理】STEP: 6 ボウリング (paizaランク C 相当) – PHP編【配列活用メニュー】
【配列活用メニュー】 > 【配列に対しての複雑な処理】STEP: 6 ボウリング (paizaランク C 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。
解答例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php $array = array(); for($i = 0;$i < 4;$i++){ $test = explode(" ",trim(fgets(STDIN))); $fack = array_reverse($test); array_unshift($array,$fack); } $ans = array(); foreach($array as $value){ foreach($value as $pin){ array_push($ans,$pin); } } foreach($ans as $key=> $value){ if($value == 1){ $first = $key+1; break; } } $counter = 0; foreach($ans as $value){ if($value == 1){ $counter++; } } echo $first."\n".$counter; ?> |
P_10 P_9 P_8 P_7
P_6 P_5 P_4
P_3 P_2
P_1
P_6 P_5 P_4
P_3 P_2
P_1
ボウリングのピンデータが4行与えられますが、降順で与えられています。「狙うピンは一番小さい番号のピン」ということから、与えられたデータを昇順で一つの配列にまとめることが攻略の鍵となります。
1.ピンのデータを昇順で一つの配列にまとめる
|
1 2 3 4 5 6 |
$array = array(); for($i = 0;$i < 4;$i++){ $test = explode(" ",trim(fgets(STDIN))); $fack = array_reverse($test); array_unshift($array,$fack); } |
- 標準入力からデータを「explode()」で配列に変換
- 「array_reverse()」で配列を反転(昇順に直している)
- 「$array()」配列に「array_unshift()」で「$fack」を先頭に追加するこの一連の処理が4回行われます。ただこの状態ではまだ不十分です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Array ( [0] => Array ( [0] => 1 ) [1] => Array ( [0] => 1 [1] => 1 ) [2] => Array ( [0] => 1 [1] => 1 [2] => 1 ) [3] => Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 ) ) |
|
1 2 3 4 5 6 |
$ans = array(); foreach($array as $value){ foreach($value as $pin){ array_push($ans,$pin); } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 1 [9] => 1 ) |
2.狙うピンを特定する
|
1 2 3 4 5 6 |
foreach($ans as $key=> $value){ if($value == 1){ $first = $key+1; break; } } |
3.残っているピンをカウントする
|
1 2 3 4 5 6 |
$counter = 0; foreach($ans as $value){ if($value == 1){ $counter++; } } |
あとは「最初に狙うピンの番号」と、「残っているピンの合計」を出力すればOK
