#!/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 "$@"