53 lines
967 B
Bash
53 lines
967 B
Bash
#!/usr/bin/env bash
|
|
unset PATH
|
|
readonly PATH
|
|
source ./utils/main.sh
|
|
source ./utils/array.sh
|
|
NUM_JOBS="\j"
|
|
|
|
solve() {
|
|
local part="$1" target="$2" curr="$3" rest=("${@:4}")
|
|
|
|
((${#rest[@]} == 0)) && {
|
|
((curr == target)) && echo "$target" && return 0
|
|
return 1
|
|
}
|
|
|
|
solve "$part" "$target" "$((curr + rest[0]))" "${rest[@]:1}" ||
|
|
solve "$part" "$target" "$((curr * rest[0]))" "${rest[@]:1}" || {
|
|
((part == 1)) && return 1
|
|
solve "$part" "$target" "${curr}${rest[0]}" "${rest[@]:1}"
|
|
}
|
|
}
|
|
|
|
do_part() {
|
|
local part="$1" result=0
|
|
|
|
while read -r num; do
|
|
((result += num))
|
|
done < <(
|
|
while read -r line; do
|
|
while ((${NUM_JOBS@P} >= 16)); do wait -n; done
|
|
{
|
|
local nums=() target
|
|
read -ra nums <<<"${line#*: }"
|
|
target="${line%:*}"
|
|
solve "$part" "$target" "${nums[@]}"
|
|
} &
|
|
done
|
|
wait
|
|
)
|
|
|
|
printf '%d' "$result"
|
|
}
|
|
|
|
p1() {
|
|
do_part 1 <<<"$1"
|
|
}
|
|
|
|
p2() {
|
|
do_part 2 <<<"$1"
|
|
}
|
|
|
|
main "$@"
|