day05
This commit is contained in:
parent
843f0211b6
commit
3844e5c87c
76
day05.sh
Executable file
76
day05.sh
Executable file
@ -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 "$@"
|
Loading…
x
Reference in New Issue
Block a user