From 6fb5dfc060250902fb16819e9a16a612721e7708 Mon Sep 17 00:00:00 2001 From: Patrick Michl Date: Wed, 11 Dec 2024 11:26:52 +0100 Subject: [PATCH] day11 --- day11.sh | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 day11.sh diff --git a/day11.sh b/day11.sh new file mode 100644 index 0000000..e74b4af --- /dev/null +++ b/day11.sh @@ -0,0 +1,56 @@ +#!/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=() new_stones=() + + for stone in "${@:2}"; do stones["$stone"]=1; done + + for ((n = 0; n < blinks; n++)); do + 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 + stones["$stone"]=0 + done + + local old new + old="$(declare -p stones)" + new="$(declare -p new_stones)" + eval "${old/stones/new_stones}" + eval "${new/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 "$@"