diff --git a/day05.sh b/day05.sh new file mode 100755 index 0000000..9c4b160 --- /dev/null +++ b/day05.sh @@ -0,0 +1,76 @@ +#!/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 "$@"