3v4l.org

run code in 300+ PHP versions simultaneously
<?php function matrix_brute_solve(array $matrix) { matrix_make_square($matrix); foreach (matrix_generate_vectors($matrix) as $vector) { $attempt = matrix_rotate($matrix, $vector); if (matrix_is_solved($attempt)) return matrix_display($attempt); } echo 'No solution'; } function matrix_make_square(array &$matrix) { $pad = count(array_keys($matrix)); foreach ($matrix as &$row) $row = array_pad($row, $pad, ''); } function matrix_generate_vectors(array $matrix) { $vectors = []; $columns = count(current($matrix)); $gen = function ($depth=0, $combo='') use (&$gen, &$vectors, $columns) { if ($depth < $columns) for ($i = 0; $i < $columns; $i++) $gen($depth + 1, $i . $combo); else $vectors[] = array_map('intval', str_split($combo)); }; $gen(); return $vectors; } function matrix_rotate(array $matrix, array $vector) { foreach ($matrix as $row => &$values) { array_rotate($values, $vector[$row]); } return $matrix; } function matrix_is_solved(array $matrix) { foreach (array_keys(current($matrix)) as $offset) { $column = array_filter($raw = array_column($matrix, $offset)); if (count($column) != count(array_unique($column))) return false; } return true; } function array_rotate(array &$array, $offset) { foreach (array_slice($array, 0, $offset) as $key => $val) { unset($array[$key]); $array[$key] = $val; } $array = array_values($array); } function matrix_display(array $matrix = null) { echo "[\n"; foreach ($matrix as $row => $inner) { echo " $row => ['" . implode("', '", $inner) . "']\n"; } echo "]\n"; } $tests = [ [ ['X'], ['X'] ], [ ['X'], ['X'], ['X'] ], [ [ 'X', '' ], [ '', 'X' ] ], [ ['X', 'Y', 'Z'], ['X', 'Y'], ['X']], [ ['X', 'Y'], ['X', 'Y'], ['X', 'Y'] ], [ ['X', 'Y', 'Z'], ['X', 'Y', 'Z'], ['X', 'Y', 'Z'] ], [ ['X', 'Y', 'Z', 'I', 'J'], ['X', 'Y', 'Z', 'I'], ['X', 'Y', 'Z', 'I'], ['X', 'Y', 'Z', 'I'], ['X', 'Y', 'Z'], ['X', 'Y', 'Z'] ], ]; array_map(function ($matrix) { matrix_display($matrix); echo "solved by:" . PHP_EOL; matrix_brute_solve($matrix); echo PHP_EOL; }, $tests);
Output for 7.0.0 - 7.0.25, 7.1.0 - 7.1.25, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.4, 8.3.6
[ 0 => ['X'] 1 => ['X'] ] solved by: [ 0 => ['', 'X'] 1 => ['X', ''] ] [ 0 => ['X'] 1 => ['X'] 2 => ['X'] ] solved by: [ 0 => ['', 'X', ''] 1 => ['', '', 'X'] 2 => ['X', '', ''] ] [ 0 => ['X', ''] 1 => ['', 'X'] ] solved by: [ 0 => ['X', ''] 1 => ['', 'X'] ] [ 0 => ['X', 'Y', 'Z'] 1 => ['X', 'Y'] 2 => ['X'] ] solved by: [ 0 => ['Z', 'X', 'Y'] 1 => ['Y', '', 'X'] 2 => ['X', '', ''] ] [ 0 => ['X', 'Y'] 1 => ['X', 'Y'] 2 => ['X', 'Y'] ] solved by: [ 0 => ['', 'X', 'Y'] 1 => ['Y', '', 'X'] 2 => ['X', 'Y', ''] ] [ 0 => ['X', 'Y', 'Z'] 1 => ['X', 'Y', 'Z'] 2 => ['X', 'Y', 'Z'] ] solved by: [ 0 => ['Z', 'X', 'Y'] 1 => ['Y', 'Z', 'X'] 2 => ['X', 'Y', 'Z'] ] [ 0 => ['X', 'Y', 'Z', 'I', 'J'] 1 => ['X', 'Y', 'Z', 'I'] 2 => ['X', 'Y', 'Z', 'I'] 3 => ['X', 'Y', 'Z', 'I'] 4 => ['X', 'Y', 'Z'] 5 => ['X', 'Y', 'Z'] ] solved by: [ 0 => ['', 'X', 'Y', 'Z', 'I', 'J'] 1 => ['', '', 'X', 'Y', 'Z', 'I'] 2 => ['I', '', '', 'X', 'Y', 'Z'] 3 => ['Z', 'I', '', '', 'X', 'Y'] 4 => ['Y', 'Z', '', '', '', 'X'] 5 => ['X', 'Y', 'Z', '', '', ''] ]
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 [ 0 => ['X'] 1 => ['X'] ] solved by: [ 0 => ['', 'X'] 1 => ['X', ''] ] [ 0 => ['X'] 1 => ['X'] 2 => ['X'] ] solved by: [ 0 => ['', 'X', ''] 1 => ['', '', 'X'] 2 => ['X', '', ''] ] [ 0 => ['X', ''] 1 => ['', 'X'] ] solved by: [ 0 => ['X', ''] 1 => ['', 'X'] ] [ 0 => ['X', 'Y', 'Z'] 1 => ['X', 'Y'] 2 => ['X'] ] solved by: [ 0 => ['Z', 'X', 'Y'] 1 => ['Y', '', 'X'] 2 => ['X', '', ''] ] [ 0 => ['X', 'Y'] 1 => ['X', 'Y'] 2 => ['X', 'Y'] ] solved by: [ 0 => ['', 'X', 'Y'] 1 => ['Y', '', 'X'] 2 => ['X', 'Y', ''] ] [ 0 => ['X', 'Y', 'Z'] 1 => ['X', 'Y', 'Z'] 2 => ['X', 'Y', 'Z'] ] solved by: [ 0 => ['Z', 'X', 'Y'] 1 => ['Y', 'Z', 'X'] 2 => ['X', 'Y', 'Z'] ] [ 0 => ['X', 'Y', 'Z', 'I', 'J'] 1 => ['X', 'Y', 'Z', 'I'] 2 => ['X', 'Y', 'Z', 'I'] 3 => ['X', 'Y', 'Z', 'I'] 4 => ['X', 'Y', 'Z'] 5 => ['X', 'Y', 'Z'] ] solved by: [ 0 => ['', 'X', 'Y', 'Z', 'I', 'J'] 1 => ['', '', 'X', 'Y', 'Z', 'I'] 2 => ['I', '', '', 'X', 'Y', 'Z'] 3 => ['Z', 'I', '', '', 'X', 'Y'] 4 => ['Y', 'Z', '', '', '', 'X'] 5 => ['X', 'Y', 'Z', '', '', ''] ]

preferences:
156.22 ms | 404 KiB | 196 Q