This commit is contained in:
Patrick Michl 2024-12-05 18:25:04 +01:00
parent 3844e5c87c
commit 85ea5d299b
No known key found for this signature in database
GPG Key ID: BFE0ACEE21CD5EB0
5 changed files with 60 additions and 57 deletions

View File

@ -1,26 +1,25 @@
#!/usr/bin/env bash
unset PATH; readonly PATH
unset PATH
readonly PATH
source ./utils/main.sh
source ./utils/array.sh
p1() {
local input="$1" a b tmp i
local left=() right=() res=()
while read -r a b; do
left+=("$a")
right+=("$b")
done <<< "$input"
done <<<"$input"
array.timsort left
array.timsort right
for ((i=0; i < ${#left[@]}; i++)); do
for ((i = 0; i < ${#left[@]}; i++)); do
tmp="$((left[i] - right[i]))"
echo "${left[$i]} - ${right[$i]} = ${tmp#-}"
res+=("${tmp#-}")
done > log
done
array.sum res
}
@ -28,19 +27,18 @@ p1() {
p2() {
local input="$1" a b i j
local left=() right=() res=()
while read -r a b; do
left+=("$a")
right+=("$b")
done <<< "$input"
done <<<"$input"
for i in "${left[@]}"; do
local tmp=0
for j in "${right[@]}"; do
(( i == j )) && ((tmp++))
((i == j)) && ((tmp++))
done
res+=("$((i*tmp))")
res+=("$((i * tmp))")
done
array.sum res

View File

@ -1,14 +1,15 @@
#!/usr/bin/env bash
unset PATH; readonly PATH
unset PATH
readonly PATH
source ./utils/main.sh
source ./utils/array.sh
is_report_valid() {
local report=() current_sign='' i=0
read -ra report <<< "$1"
for (( i = 0; i < ${#report[@]} - 1; i++ )); do
local a="${report[i]}" b="${report[i+1]}" diff='' sign=''
read -ra report <<<"$1"
for ((i = 0; i < ${#report[@]} - 1; i++)); do
local a="${report[i]}" b="${report[i + 1]}" diff='' sign=''
diff="$((a - b))"
((${diff#-} >= 1 && ${diff#-} <= 3)) || return 1
@ -30,7 +31,7 @@ p1() {
while read -r line; do
is_report_valid "$line" && ((result++))
done <<< "$input"
done <<<"$input"
printf '%d' "$result"
}
@ -40,17 +41,17 @@ p2() {
while read -r line; do
local original_report
read -ra original_report <<< "$line"
read -ra original_report <<<"$line"
is_report_valid "$line" && ((result++)) && continue
for (( i = 0; i < ${#original_report[@]}; i++ )); do
for ((i = 0; i < ${#original_report[@]}; i++)); do
local report
report=("${original_report[@]::"$i"}" "${original_report[@]:"$((i+1))"}")
report=("${original_report[@]::"$i"}" "${original_report[@]:"$((i + 1))"}")
is_report_valid "${report[*]}" && ((result++)) && continue 2
done
done <<< "$input"
done <<<"$input"
printf '%d' "$result"
}

View File

@ -1,5 +1,6 @@
#!/usr/bin/env bash
unset PATH; readonly PATH
unset PATH
readonly PATH
source ./utils/main.sh
p1() {
@ -23,11 +24,11 @@ p2() {
while [[ -n "$input" ]]; do
if [[ "$input" =~ mul\(([0-9]{1,3}),([0-9]{1,3})\)|do\(\)|don\'t\(\) ]]; then
case "${BASH_REMATCH[0]}" in
do\(\)) do=true;;
don\'t\(\)) do=false;;
*) [[ "$do" == true ]] && result="$((result + (BASH_REMATCH[1] * BASH_REMATCH[2])))";;
do\(\)) do=true ;;
don\'t\(\)) do=false ;;
*) [[ "$do" == true ]] && result="$((result + (BASH_REMATCH[1] * BASH_REMATCH[2])))" ;;
esac
input="${input#*"${BASH_REMATCH[0]}"}"
else
input=''

View File

@ -1,9 +1,11 @@
#!/usr/bin/env bash
unset PATH; readonly PATH
unset PATH
readonly PATH
source ./utils/main.sh
count_patterns_occurences() {
local input="$1"; shift
local input="$1"
shift
local patterns=("$@") result=0
for pattern in "${patterns[@]}"; do
@ -25,18 +27,18 @@ count_patterns_occurences() {
p1() {
local input="$1" line result=0 cols=0
read -ra line <<< "$input"
cols="$((${#line}+1))"
read -ra line <<<"$input"
cols="$((${#line} + 1))"
local patterns=(
"XMAS"
"SAMX"
"X.{$((cols))}M.{$((cols))}A.{$((cols))}S"
"S.{$((cols))}A.{$((cols))}M.{$((cols))}X"
"X.{$((cols-1))}M.{$((cols-1))}A.{$((cols-1))}S"
"S.{$((cols-1))}A.{$((cols-1))}M.{$((cols-1))}X"
"X.{$((cols-2))}M.{$((cols-2))}A.{$((cols-2))}S"
"S.{$((cols-2))}A.{$((cols-2))}M.{$((cols-2))}X"
"X.{$((cols - 1))}M.{$((cols - 1))}A.{$((cols - 1))}S"
"S.{$((cols - 1))}A.{$((cols - 1))}M.{$((cols - 1))}X"
"X.{$((cols - 2))}M.{$((cols - 2))}A.{$((cols - 2))}S"
"S.{$((cols - 2))}A.{$((cols - 2))}M.{$((cols - 2))}X"
)
count_patterns_occurences "$input" "${patterns[@]}"
@ -45,14 +47,14 @@ p1() {
p2() {
local input="$1" line result=0 cols=0
read -ra line <<< "$input"
cols="$((${#line}+1))"
read -ra line <<<"$input"
cols="$((${#line} + 1))"
local patterns=(
"M.M.{$((cols-2))}A.{$((cols-2))}S.S"
"M.S.{$((cols-2))}A.{$((cols-2))}M.S"
"S.M.{$((cols-2))}A.{$((cols-2))}S.M"
"S.S.{$((cols-2))}A.{$((cols-2))}M.M"
"M.M.{$((cols - 2))}A.{$((cols - 2))}S.S"
"M.S.{$((cols - 2))}A.{$((cols - 2))}M.S"
"S.M.{$((cols - 2))}A.{$((cols - 2))}S.M"
"S.S.{$((cols - 2))}A.{$((cols - 2))}M.M"
)
count_patterns_occurences "$input" "${patterns[@]}"

View File

@ -1,5 +1,6 @@
#!/usr/bin/env bash
unset PATH; readonly PATH
unset PATH
readonly PATH
source ./utils/main.sh
p1() {
@ -9,25 +10,25 @@ p1() {
while read -r line; do
[[ -z "$line" ]] && continue
case "$line" in
[0-9]*\|[0-9]*) rules+=([${line%|*}]="${rules["${line%|*}"]:-} ${line#*|}");;
*) pages+=("$line");;
[0-9]*\|[0-9]*) rules+=([${line%|*}]="${rules["${line%|*}"]:-} ${line#*|}") ;;
*) pages+=("$line") ;;
esac
done <<< "$input"
done <<<"$input"
for page in "${pages[@]}"; do
local page_arr
IFS=, read -ra page_arr <<< "$page"
IFS=, read -ra page_arr <<<"$page"
for ((i=0; i < ${#page_arr[@]}; i++)); do
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
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
@ -41,24 +42,24 @@ p2() {
while read -r line; do
[[ -z "$line" ]] && continue
case "$line" in
[0-9]*\|[0-9]*) rules+=([${line%|*}]="${rules["${line%|*}"]:-} ${line#*|}");;
*) pages+=("$line");;
[0-9]*\|[0-9]*) rules+=([${line%|*}]="${rules["${line%|*}"]:-} ${line#*|}") ;;
*) pages+=("$line") ;;
esac
done <<< "$input"
done <<<"$input"
for page in "${pages[@]}"; do
local page_arr incorrect='false'
IFS=, read -ra page_arr <<< "$page"
IFS=, read -ra page_arr <<<"$page"
for ((i=0; i < ${#page_arr[@]}; i++)); do
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
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"}"
read -ra page_arr <<<"${page_arr[*]/"$removed_elem"/}"
page_arr=("${page_arr[@]:0:$i}" "$removed_elem" "${page_arr[@]:$i}")
incorrect='true'
((i--))
@ -66,7 +67,7 @@ p2() {
fi
done
done
[[ "$incorrect" == 'true' ]] && result="$((result + ${page_arr[$(((${#page_arr[@]} - 1) / 2))]}))"
done