aoc2024/day05.sh
Patrick Michl 85ea5d299b
shfmt
2024-12-05 18:25:04 +01:00

78 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
unset PATH
readonly PATH
source ./utils/main.sh
p1() {
local input="$1" result=0 pages=() line
local -A rules=()
while read -r line; do
[[ -z "$line" ]] && continue
case "$line" in
[0-9]*\|[0-9]*) rules+=([${line%|*}]="${rules["${line%|*}"]:-} ${line#*|}") ;;
*) pages+=("$line") ;;
esac
done <<<"$input"
for page in "${pages[@]}"; do
local page_arr
IFS=, read -ra page_arr <<<"$page"
for ((i = 0; i < ${#page_arr[@]}; i++)); do
local current_page="${page_arr[i]}"
local current_rules="${rules["$current_page"]:-}"
[[ -z "${current_rules:-}" ]] && continue
for ((j = 0; j < ${#page_arr[@]}; j++)); do
[[ "$current_rules" =~ ${page_arr[j]} ]] && ((j < i)) && continue 3
done
done
result="$((result + ${page_arr[$(((${#page_arr[@]} - 1) / 2))]}))"
done
printf '%s' "$result"
}
p2() {
local input="$1" result=0 pages=() line
local -A rules=()
while read -r line; do
[[ -z "$line" ]] && continue
case "$line" in
[0-9]*\|[0-9]*) rules+=([${line%|*}]="${rules["${line%|*}"]:-} ${line#*|}") ;;
*) pages+=("$line") ;;
esac
done <<<"$input"
for page in "${pages[@]}"; do
local page_arr incorrect='false'
IFS=, read -ra page_arr <<<"$page"
for ((i = 0; i < ${#page_arr[@]}; i++)); do
local current_page="${page_arr[i]}"
local current_rules="${rules["$current_page"]:-}"
[[ -z "${current_rules:-}" ]] && continue
for ((j = 0; j < ${#page_arr[@]}; j++)); do
if [[ "$current_rules" =~ ${page_arr[j]} ]] && ((j < i)); then
local removed_elem="${page_arr[j]}"
read -ra page_arr <<<"${page_arr[*]/"$removed_elem"/}"
page_arr=("${page_arr[@]:0:$i}" "$removed_elem" "${page_arr[@]:$i}")
incorrect='true'
((i--))
((j--))
fi
done
done
[[ "$incorrect" == 'true' ]] && result="$((result + ${page_arr[$(((${#page_arr[@]} - 1) / 2))]}))"
done
printf '%s' "$result"
}
main "$@"