#!/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 "$@"