この記事を書いた理由
よくテスト実施の際に以下のようなパターンを網羅するための表を書くことがあると思う。
Aデータ | Bデータ |
---|---|
○ | ○ |
○ | × |
× | ○ |
× | × |
このパターン網羅がコーディングテストをする際に必要になることがある。
これをプログラミングで書くまでが結構大変だったのでメモしておく。
プログラム
以下のように書くとパターン表がざっくり取得できる。
<?php
$num = 4; // true/falseの4つのデータがある時
for ($i = 0; $i < (1 << $num); $i++) {
for ($j = $num - 1; $j >= 0; $j--) {
if ($i & (1 << $j)) {
echo '×';
} else {
echo '○';
}
}
echo PHP_EOL;
}
「<<」や「&」はシフト演算子である。
2進数で値をシフトすることによりパターン網羅の処理が格段に簡単になる。
上記の出力内容は以下のようになる。
○○○○
○○○×
○○×○
○○××
○×○○
○×○×
○××○
○×××
×○○○
×○○×
×○×○
×○××
××○○
××○×
×××○
××××
テーブルっぽく書きたいなら多重配列に入れて、テーブルに起こしてあげるといい
<?php
echo array2table(create_pattern(4)); // true/falseの4つのデータがある時
function create_pattern($num){
$board = [];
for ($i = 0; $i < (1 << $num); $i++) {
for ($j = $num - 1; $j >= 0; $j--) {
if ($i & (1 << $j)) {
$board[$i][] = '×';
} else {
$board[$i][] = '○';
}
}
}
return $board;
}
// 参考:https://www.pahoo.org/e-soul/webtech/php02/php02-46-01.shtm#array2table
function array2table($arr) {
if (!is_array($arr)) return false;
$keys1 = array_keys($arr); //1次元目のキー取得
$keys2 = array_keys($arr[$keys1[0]]); //2時限目のキー取得
if (is_array($arr[$keys1[0]][$keys2[0]])) return false; //3次元以上
$n = count($arr[$keys1[0]]); //要素の数
$html = "<table class=\"array\">\n";
//要素名
$html .= "<tr><th>Key</th>";
for ($i = 0; $i < $n; $i++) {
$html .= "<th>{$keys2[$i]}</th>";
}
$html .= "</tr>\n";
//配列本体
foreach ($arr as $key=>$arr1) {
$html .= "<tr><th>{$key}</th>";
for ($i = 0; $i < $n; $i++) {
$html .= "<td>{$arr1[$keys2[$i]]}</td>";
}
}
$html .= "</tr>\n</table>\n";
return $html;
}
htmlで出力すると以下のような感じで表示される。
上記のパターン網羅プログラム、コーディングテスト等で必要になる機会が多い印象がある。
便利なのでぜひ活用してみてほしいです。