aoc2024/day11.sh
Patrick Michl 9a0a630039
day11
2024-12-11 11:31:35 +01:00

55 lines
1.2 KiB
Bash

#!/usr/bin/env bash
unset PATH
readonly PATH
source ./utils/main.sh
source ./utils/array.sh
count_after_blinks() {
local blinks="$1"
local -A stones=()
for stone in "${@:2}"; do stones["$stone"]=1; done
for ((n = 0; n < blinks; n++)); do
local -A new_stones=()
for stone in "${!stones[@]}"; do
if ((stone == 0)); then
new_stones[1]="$((${new_stones[1]:-0} + stones["$stone"]))"
elif ((${#stone} % 2 == 0)); then
left="${stone::"$((${#stone} / 2))"}"
right="${stone:"$((${#stone} / 2))"}"
right="$((10#"$right"))"
new_stones["$left"]="$((${new_stones["$left"]:-0} + stones["$stone"]))"
new_stones["$right"]="$((${new_stones["$right"]:-0} + stones["$stone"]))"
else
new_stones["$((stone * 2024))"]="$((${new_stones["$((stone * 2024))"]:-0} + stones["$stone"]))"
fi
done
local tmp
tmp="$(declare -p new_stones)"
eval "${tmp/new_stones/stones}"
done
array.sum stones
}
p1() {
local input="$1"
local -a stones
read -ra stones <<<"$input"
count_after_blinks 25 "${stones[@]}"
}
p2() {
local input="$1"
local -a stones
read -ra stones <<<"$input"
count_after_blinks 75 "${stones[@]}"
}
main "$@"