1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

マトリクスのパターンを網羅するロジックの書き方

Last updated at Posted at 2020-10-17

この記事を書いた理由

よくテスト実施の際に以下のようなパターンを網羅するための表を書くことがあると思う。

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で出力すると以下のような感じで表示される。

aaa_html.png

上記のパターン網羅プログラム、コーディングテスト等で必要になる機会が多い印象がある。
便利なのでぜひ活用してみてほしいです。

参考

1
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?