|
1 | 1 | #! /usr/bin/env bash
|
2 | 2 | C=($(grep "^[0-9]" "${1:-22.txt}"))
|
3 |
| -A=(${C[@]:0:${#C[@]}/2}) |
4 |
| -B=(${C[@]:${#C[@]}/2}) |
| 3 | +N=${#C[@]} |
| 4 | +A=(${C[@]:0:N/2}) |
| 5 | +B=(${C[@]:$N/2}) |
5 | 6 |
|
6 | 7 | score() {
|
7 | 8 | local sum=0 S=("$@")
|
8 |
| - for i in "${!S[@]}"; do ((sum+=S[i]*(50-i))); done |
| 9 | + for i in "${!S[@]}"; do ((sum+=S[i]*(N-i))); done |
9 | 10 | echo $sum
|
10 | 11 | }
|
11 | 12 |
|
12 |
| -#round=0 |
13 |
| -while [[ ${#A[@]} != 0 && ${#B[@]} != 0 ]]; do |
| 13 | +# shellcheck disable=SC2128 |
| 14 | +while [[ -n "$A" && -n "$B" ]]; do |
14 | 15 | if [[ $A -gt $B ]]; then A+=($A $B); else B+=($B $A); fi
|
15 | 16 | A=(${A[@]:1})
|
16 | 17 | B=(${B[@]:1})
|
17 | 18 | #((++round%500==0)) && echo "$round: ${#A[@]}/${#B[@]}"
|
18 | 19 | done
|
19 |
| -echo "22A: $(score "${A[*]}" "${B[*]}")" |
| 20 | +echo "22A: $(score "${A[@]}" "${B[@]}")" |
20 | 21 |
|
21 | 22 | r() {
|
22 |
| - local X="$*" |
23 | 23 | declare -A H
|
24 |
| - local a=(${X/ X*}) b=(${X/*X }) hash |
25 |
| - while [[ ${#a[@]} != 0 && ${#b[@]} != 0 ]]; do |
| 24 | + local a=($1) b=($2) hash |
| 25 | + # shellcheck disable=SC2128,SC2181 |
| 26 | + while [[ -n "$a" && -n "$b" ]]; do |
26 | 27 | hash=${a[*]}X${b[*]}
|
27 |
| - hash=${hash// /_} |
28 |
| - if [[ -n "${H[$hash]}" ]]; then |
| 28 | + if (( H[${hash// /_}]++ > 0)); then |
29 | 29 | return 0
|
30 | 30 | elif [[ $a -lt ${#a[@]} && $b -lt ${#b[@]} ]]; then
|
31 |
| - r "${a[*]:1:a}" X "${b[*]:1:b}" |
| 31 | + r "${a[*]:1:a}" "${b[*]:1:b}" |
32 | 32 | else
|
33 | 33 | [[ $a -gt $b ]]
|
34 | 34 | fi
|
35 |
| - # shellcheck disable=SC2181,SC2128 |
36 | 35 | if [[ $? == 0 ]]; then a+=($a $b); else b+=($b $a); fi
|
37 |
| - H[$hash]=1 |
38 | 36 | a=(${a[@]:1})
|
39 | 37 | b=(${b[@]:1})
|
40 | 38 | #((${#H[@]}%1000==0)) && echo "$round:${#H[@]}: ${#a[@]}/${#b[@]}"
|
41 | 39 | done
|
42 |
| - ((${#a[*]}+${#b[*]} == 50)) && echo "22B: $(score "${a[*]}" "${b[*]}")" |
| 40 | + ((${#a[*]}+${#b[*]} == N)) && echo "22B: $(score "${a[@]}" "${b[@]}")" |
43 | 41 | return ${#b[@]}
|
44 | 42 | }
|
45 | 43 |
|
46 |
| -A=(${C[@]:0:${#C[@]}/2}) |
47 |
| -B=(${C[@]:${#C[@]}/2}) |
48 |
| -r "${A[*]}" X "${B[*]}" |
| 44 | +r "${C[*]:0:N/2}" "${C[*]:N/2}" |
0 commit comments