とりあえず回答を書いてみました。
これを見て、ひらめきのスキルが上がるといいですね。
ロジックのスキルを上げるのであれば、Aizu Online Judgeの簡単な問題を解いてみて、
他の人の解答と見比べてみるといいかもしれませんね。
php
1<?php
2function startFromOne($ary) {
3 array_unshift($ary, 0);
4 unset($ary[0]);
5 return $ary;
6}
7$ex1a = startFromOne([2, 5, 4, 8, 3, 1]);
8$ex1b = startFromOne([10, 9, 3, 5, 0, 5]);
9$ex2a = startFromOne([2, 5, 5, 3, 5, 0]);
10$ex2b = startFromOne([10, 9, 3, 5, 1, 4]);
11$ex3a = startFromOne([10, 10, 10, 8, 3, 8]);
12$ex3b = startFromOne([9, 10, 10, 12, 0, 12]);
13$ex4a = startFromOne([10, 10, 10, 12, 12, 12]);
14$ex4b = startFromOne([9, 10, 10, 12, 0, 12]);
15
16// アドホックなやり方
17function compare($a, $b) {
18 $maxOfA = max($a);
19 $keysMatchedCondition1 = [];
20 foreach ($a as $key => $val) {
21 if ($val === $maxOfA) array_push($keysMatchedCondition1, $key);
22 }
23 echo '条件1に適合するキー: ', implode($keysMatchedCondition1, ', '), "\n";
24
25 $maxOfB = $b[$keysMatchedCondition1[0]];
26 foreach ($keysMatchedCondition1 as $key) {
27 if ($b[$key] > $maxOfB) $maxOfB = $b[$key];
28 }
29 $keysMatchedCondition2 = [];
30 foreach($keysMatchedCondition1 as $key) {
31 if ($b[$key] === $maxOfB) array_push($keysMatchedCondition2, $key);
32 }
33 echo '条件2に適合するキー: ', implode($keysMatchedCondition2, ', '), "\n";
34
35 $keyMatchedCondition3 = $keysMatchedCondition2[0];
36 echo '条件3に適合するキー: ', $keyMatchedCondition3, "\n";
37
38 if ($a[$keyMatchedCondition3] > $b[$keyMatchedCondition3])
39 echo "配列Aのほうが大きい\n";
40 else if ($a[$keyMatchedCondition3] < $b[$keyMatchedCondition3])
41 echo "配列Bのほうが大きい\n";
42 else
43 echo "配列Aと配列Bは等しい\n";
44
45 return ($a[$keyMatchedCondition3] >= $b[$keyMatchedCondition3]);
46}
47
48// スマートなやり方
49function compare2($a, $b) {
50 $maxa = 0;
51 $maxb = 0;
52 foreach ($a as $key => $val) {
53 $maxa = $val;
54 $maxb = $b[$key];
55 break;
56 }
57 foreach ($a as $key => $val) {
58 if ($val > $maxa) {
59 $maxa = $val;
60 $maxb = $b[$key];
61 } else if ($val === $maxa && $b[$key] > $maxb) {
62 $maxb = $b[$key];
63 }
64 }
65 return $maxa >= $maxb;
66}
67
68echo "[compare : アドホックなやり方]\n";
69echo "値の例1\n";
70var_dump(compare($ex1a, $ex1b));
71echo "値の例2\n";
72var_dump(compare($ex2a, $ex2b));
73echo "値の例3\n";
74var_dump(compare($ex3a, $ex3b));
75echo "値の例4\n";
76var_dump(compare($ex4a, $ex4b));
77echo "[compare2 : スマートなやり方]\n";
78echo "値の例1\n";
79var_dump(compare2($ex1a, $ex1b));
80echo "値の例2\n";
81var_dump(compare2($ex2a, $ex2b));
82echo "値の例3\n";
83var_dump(compare2($ex3a, $ex3b));
84echo "値の例4\n";
85var_dump(compare2($ex4a, $ex4b));
86?>
text
1[compare : アドホックなやり方]
2値の例1
3条件1に適合するキー: 4
4条件2に適合するキー: 4
5条件3に適合するキー: 4
6配列Aのほうが大きい
7bool(true)
8値の例2
9条件1に適合するキー: 2, 3, 5
10条件2に適合するキー: 2
11条件3に適合するキー: 2
12配列Bのほうが大きい
13bool(false)
14値の例3
15条件1に適合するキー: 1, 2, 3
16条件2に適合するキー: 2, 3
17条件3に適合するキー: 2
18配列Aと配列Bは等しい
19bool(true)
20値の例4
21条件1に適合するキー: 4, 5, 6
22条件2に適合するキー: 4, 6
23条件3に適合するキー: 4
24配列Aと配列Bは等しい
25bool(true)
26[compare2 : スマートなやり方]
27値の例1
28bool(true)
29値の例2
30bool(false)
31値の例3
32bool(true)
33値の例4
34bool(true)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/10 13:30
2017/08/10 13:44