advent_of_code_2020/day_23/part_1.php

61 lines
1.5 KiB
PHP
Raw Normal View History

2020-12-23 14:57:32 +01:00
<?php
$cups = array_map('intval', str_split(file_get_contents('input.txt')));
$min = min($cups);
$max = max($cups);
$current_index = 0;
for ($i = 0; $i < 100; $i++) {
$current_cup = $cups[$current_index];
$pickups = array_splice($cups, $current_index + 1, 3);
while (count($pickups) < 3) {
$pickups[] = array_shift($cups);
}
$destination = $current_cup;
do {
$destination--;
if ($destination < $min) {
$destination = $max;
}
} while (in_array($destination, $pickups, true));
$destination_index = array_search($destination, $cups, true);
array_splice($cups, $destination_index + 1, null, $pickups);
$cups = array_values($cups);
// replace current index at its position
if ($cups[$current_index] !== $current_cup) {
$diff = array_search($current_cup, $cups, true) - $current_index;
for ($j = 0; $j < abs($diff); $j++) {
$cups[] = array_shift($cups);
}
}
echo sprintf('move %u : %s%s', $i+1, implode(' ', $cups), "\n");
$current_index++;
if ($current_index >= count($cups)) {
$current_index = 0;
}
}
// moves done, now count from 1
$index_1 = array_search(1, $cups, true);
$final_labels = '';
$current_index = $index_1 + 1;
for ($i = 1, $l = count($cups); $i < $l; $i++) {
if ($current_index >= $l) {
$current_index = 0;
}
$final_labels .= $cups[$current_index];
$current_index++;
}
echo $final_labels;