78 lines
2.0 KiB
Bash
Executable File
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 "$@"
|