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