Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 2
- 2 2
- 3 1
- 1
- A | B | C | D | E | F
- --------------------------
- A x | x | o | x | o | x
- B o | x | o | x | x | x
- C x | o | x | o | x | x
- D x | o | x | x | x | o
- E x | o | x | x | x | x
- F x | o | x | o | x | x
- <?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);
- }
- $ php hands-of-time.php
- The solution is: a → e → b → c → d → f
- $clock = array(
- 'a' => 2,
- 'b' => 2,
- 'c' => 2,
- 'd' => 4,
- 'e' => 2,
- 'f' => 2,
- 'g' => 3,
- 'h' => 3,
- 'i' => 6,
- 'j' => 4,
- 'k' => 5,
- 'l' => 3,
- );
- The solution is: a → k → f → h → e → g → j → b → d → l → i → c
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement