<?php
// Supply clock values clockwise.
// Keys can be anything you want to use to remember the positions.
$clock = array(
'a' => 2,
'b' => 1,
'c' => 1,
'd' => 2,
'e' => 3,
'f' => 2,
);
$positions = array_keys($clock);
$values = array_values($clock);
// Test all possible starting positions.
for ($i = 0; $i < count($clock); ++$i) {
$chain = test_clock($values, $i);
// When the solution has all values, it's the right one.
if (count($chain) == count($clock)) {
break;
}
}
// Use the user-supplied keys.
$solution = array();
foreach ($chain as $position) {
$solution[] = $positions[$position];
}
print 'The solution is: ' . implode($solution, ' → ') . PHP_EOL;
/**
* Recursively test the clock based on a supplied position.
*
* @param array $values
* The current values of the clock.
* @param integer $i
* The current position of the clock.
* @param array $chain
* The current possible solution.
*
* @return
* An array of positions that represents a possible solution.
*/
function test_clock(array $values, $i, array $chain = array()) {
// If the value of the position we're in is 0, we've already tested it.
if ($values[$i] == 0) {
return $chain;
}
// Find the next two positions.
$position1 = $i + $values[$i];
$position2 = $i - $values[$i];
// Account for wraparound in the array.
if ($position1 > count($values) - 1) {
$position1 -= count($values);
}
if ($position2 < 0) {
$position2 += count($values);
}
// Mark this position as tested.
$values[$i] = 0;
$chain[] = $i;
// Test the first position.
$solution = test_clock($values, $position1, $chain);
// Don't bother checking the second position if the first is correct.
if (count($solution) == count($values)) {
return $solution;
}
// Test the second position.
return test_clock($values, $position2, $chain);
}
Fatal error: Uncaught TypeError: implode(): Argument #2 ($array) must be of type ?array, string given in /in/bi943:33
Stack trace:
#0 /in/bi943(33): implode(Array, ' \xE2\x86\x92 ')
#1 {main}
thrown in /in/bi943 on line 33
Process exited with code 255.
Output for 7.4.0 - 7.4.33
Deprecated: implode(): Passing glue string after array is deprecated. Swap the parameters in /in/bi943 on line 33
The solution is: a → e → b → c → d → f