1
0
Fork 0
advent-of-code/2020/day10.php

58 lines
1.4 KiB
PHP
Raw Normal View History

2024-02-08 09:55:40 +01:00
<?php
$input_file = '../inputs/day10.txt';
if (file_exists($input_file)) {
$input = file_get_contents($input_file);
if ($input != null) {
$joltages = array_map('trim', explode("\n", $input));
print 'Part 1 answer: ' . solve_part_one($joltages) . "\n";
print 'Part 2 answer: ' . solve_part_two($joltages) . "\n";
}
}
function solve_part_one(array $joltages): int
{
$sorted_joltages = $joltages;
$sorted_joltages[] = "0";
sort($sorted_joltages);
$sorted_joltages[] = $sorted_joltages[count($sorted_joltages) - 1] + 3;
$differences = chain_adapters($sorted_joltages);
return $differences[0] * $differences[2];
}
function solve_part_two(array $joltages): int
{
$sorted_joltages = $joltages;
$sorted_joltages[] = "0";
sort($sorted_joltages);
$sorted_joltages[] = $sorted_joltages[count($sorted_joltages) - 1] + 3;
return get_max_chains($sorted_joltages);
}
function chain_adapters(array $joltages): array
{
$differences = [0, 0, 0];
for ($i = 1; $i < count($joltages); $i++) {
$diff = $joltages[$i] - $joltages[$i - 1];
$differences[$diff - 1] += 1;
}
return $differences;
}
function get_max_chains(array $joltages): int
{
$jolt_count = count($joltages);
$memo = [$jolt_count - 1 => 1];
for ($i = $jolt_count - 2; $i >= 0; $i--) {
$count = 0;
for ($j = $i + 1; $j < $jolt_count && $joltages[$j] - $joltages[$i] <= 3; $j++) {
$count += $memo[$j];
}
$memo[$i] = $count;
}
return $memo[0];
}