Skip to content

Commit 90fe714

Browse files
committed
Cleanup/speedup: $(()) changed to (()). Remove ${} when not needed
Boost speed in some cases
1 parent 6b813be commit 90fe714

19 files changed

+106
-111
lines changed

02.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#! /usr/bin/env bash
22
ans=0
33
IFS=$'-:\ \n'
4-
while read m M b c; do x=${c//[^$b]}; [[ ${#x} -ge $m && ${#x} -le $M ]] && ans=$((ans+1)); done < ${1:-2.txt}
4+
while read m M b c; do x=${c//[^$b]}; [[ ${#x} -ge $m && ${#x} -le $M ]] && ((++ans)); done < ${1:-2.txt}
55
echo "2A: $ans"
66
ans=0
7-
while read m M b c; do x=${c:$((m-1)):1}; y=${c:$((M-1)):1}; [[ $x != $y ]] && [[ $b == $x || $b == $y ]] && ans=$((ans+1)); done < ${1:-2.txt}
7+
while read m M b c; do x=${c:m-1:1}; y=${c:M-1:1}; [[ $x != $y ]] && [[ $b == $x || $b == $y ]] && ((++ans)); done < ${1:-2.txt}
88
echo "2B: $ans"

03.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#! /usr/bin/env bash
22
A=($(< ${1:-3.txt})); l=${#A[0]}; k=0; j=3; total=1; x=""
3-
for i in ${A[@]}; do x+=${i:k:1}; k=$(((k+j)%l)); done; x=${x//\.}
3+
for i in ${A[@]}; do x+=${i:k:1}; ((k=(k+j)%l)); done; x=${x//\.}
44
echo "3A: ${#x}"
55
idx2=$(seq 0 2 $((${#A[@]}-1)))
6-
for j in 1 3 5 7; do x=""; k=0; for i in ${A[@]}; do x+=${i:k:1}; k=$(((k+j)%l)); done; x=${x//\.}; total+="*${#x}"; done
7-
for j in 1; do x=""; k=0; for i in $idx2; do x+=${A[i]:k:1}; k=$(((k+j)%l)); done ; x=${x//\.}; total+="*${#x}"; done
6+
for j in 1 3 5 7; do x=""; k=0; for i in ${A[@]}; do x+=${i:k:1}; ((k=(k+j)%l)); done; x=${x//\.}; total+="*${#x}"; done
7+
for j in 1; do x=""; k=0; for i in $idx2; do x+=${A[i]:k:1}; ((k=(k+j)%l)); done ; x=${x//\.}; total+="*${#x}"; done
88
echo "3B: ${total:2} = $((total))"

04.sh

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#! /usr/bin/env bash
2-
X='epEhbiH'; x=$X; ans=""
3-
IFS=$'\r\n\ '
2+
X='epEhbiH'; x=$X; ans=0
3+
IFS=$' \n'
44
A=($(sed s/^$/XXX/ ${1:-4.txt}))
55
for i in "${A[@]}" XXX; do
66
case $i in
@@ -12,11 +12,11 @@ for i in "${A[@]}" XXX; do
1212
iyr:*) x=${x/i};;
1313
hgt:*) x=${x/H};;
1414
cid:*) : ;;
15-
XXX) [ -z "$x" ] && ans+=1; x=$X;;
15+
XXX) [ -z "$x" ] && ((ans+=1)); x=$X;;
1616
esac
1717
done
18-
echo "4A: ${#ans}"
19-
x=$X; ans=""
18+
echo "4A: ${ans}"
19+
x=$X; ans=0
2020
for i in "${A[@]}" XXX; do
2121
k=${i/*:}
2222
case $i in
@@ -29,7 +29,7 @@ for i in "${A[@]}" XXX; do
2929
hgt:[0-9][0-9]in) [[ ${k:0:2} -ge 59 && ${k:0:2} -le 76 ]] && x=${x/H};;
3030
hgt:1[0-9][0-9]cm) [[ ${k:0:3} -ge 150 && ${k:0:3} -le 193 ]] && x=${x/H};;
3131
cid:*) : ;;
32-
XXX) [ -z "$x" ] && ans+=1; x=$X;;
32+
XXX) [ -z "$x" ] && ((ans+=1)); x=$X;;
3333
esac
3434
done
35-
echo "4B: ${#ans}"
35+
echo "4B: ${ans}"

06.sh

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
#! /usr/bin/env bash
2-
X=abcdefghijklmnopqrstuvwxyz; x=$X; j=-; a=0
2+
X=abcdefghijklmnopqrstuvwxyz; x=$X; a=0
33
A=($(sed s/^$/X/ ${1:-6.txt}))
4+
A+=(X)
45
while read -n1 i; do
5-
[ "$i" = X ] && a=$((a+26-${#x})) && x=$X
6+
[ "$i" = X ] && { ((a+=26-${#x})); x=$X; }
67
x=${x/$i}
7-
done < <(echo ${A[*]} X)
8+
done <<< "${A[*]}"
89
echo "6A: $a";
910

1011
x=""; a=0
11-
for line in "${A[@]}" X; do
12-
if [[ "$line" = X ]]; then a=$((a+${#x})); x=X;
12+
for line in "${A[@]}"; do
13+
if [[ "$line" = X ]]; then ((a+=${#x})); x=X;
1314
elif [ "$x" = X ]; then x=$line;
1415
else
1516
y=""; while read -n1 i; do [[ ${x/$i} != ${x} ]] && y+="$i"; done <<< $line
16-
# y="";for ((i=0;i<${#line};i++ )); do [[ ${x/${line:$i:1}} != ${x} ]] && y+="${line:$i:1}"; done
17+
# y="";for ((i=0;i<${#line};i++ )); do [[ ${x/${line:i:1}} != ${x} ]] && y+="${line:i:1}"; done
1718
x=$y;
1819
fi
1920
done

07.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ BAGS=("${NEW[@]}")
77
while [ ${#FOUND[@]} != 0 ]; do
88
NEW=($(grep -F "${FOUND[*]}" $input | grep -v -F "${BAGS[*]}" | sort -u))
99
BAGS+=("${NEW[@]}")
10-
FOUND=("${NEW[@]// bag*}")
10+
FOUND=("${NEW[@]// bag*}")
1111
done
1212
echo "7A: ${#BAGS[@]}"
1313
r(){
1414
local A=() a=${1// *} b=0 c=0
1515
A=($(grep ^${1:2} $input | grep -o "[0-9] [a-z]* [a-z]*"))
16-
for i in "${A[@]}"; do c=$(r $i); b=$((b+c)); done
17-
echo $(($a+$a*$b))
16+
for i in "${A[@]}"; do c=$(r $i); ((b+=c)); done
17+
echo $((a+a*b))
1818
}
1919
total=$(r "1 shiny gold")
2020
echo "7B: $((total-1))" # minus 1 shiny gold bag

08.sh

+3-4
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ solve8() {
88
x=${A[i]}; y=${x/* }; A[i]+=DONE
99
case "$x" in
1010
*DONE) return 1;;
11-
acc*) acc=$((acc+($y))); i=$((i+1));;
12-
jmp*) i=$((i+($y)));;
13-
nop*) i=$((i+1)) ;;
11+
acc*) ((acc+=y,++i));;
12+
jmp*) ((i+=y));;
13+
nop*) ((++i));;
1414
*) echo "ERROR $i: $x"; return 1;;
1515
esac
1616
[[ $i -ge ${#A[@]} ]] && return 0
@@ -27,4 +27,3 @@ for k in ${!A[@]}; do
2727
A=("${B[@]}")
2828
done
2929
[[ $i -ge ${#A[@]} ]] && echo "8B: $acc"
30-

09.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ done
1515

1616
k=0; j=0; sum=${A[j++]}
1717
while [ $sum != ${A[i]} ]; do
18-
if [[ $sum -lt ${A[i]} ]]; then sum=$((sum+A[j++]))
19-
elif [[ $sum -gt ${A[i]} ]]; then sum=$((sum-A[k++]))
18+
if [[ $sum -lt ${A[i]} ]]; then ((sum+=A[j++]))
19+
elif [[ $sum -gt ${A[i]} ]]; then ((sum-=A[k++]))
2020
fi
2121
[[ $j -ge $i ]] && echo NOT FOUND && break
2222
done

10.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#! /usr/bin/env bash
22
A=($(sort -n ${1:-10.txt}))
3-
DIFF=("" "" "" "1") # add 3 for the built-in
4-
j=0; for i in "${A[@]}"; do DIFF[$((i-j))]+=1;j=$i; done
5-
echo "10A: ${#DIFF[1]}*${#DIFF[3]}=$((${#DIFF[1]}*${#DIFF[3]}))"
3+
DIFF=(0 0 0 1) # add 3 for the built-in
4+
j=0; for i in "${A[@]}"; do ((DIFF[i-j]+=1));j=$i; done
5+
echo "10A: ${DIFF[1]}*${DIFF[3]}=$((${DIFF[1]}*${DIFF[3]}))"
66
B=; j=0; for i in "${A[@]}"; do B+=$((i-j)); j=$i; done; B+=3;
77
C=(${B//3/ }) # only works because there are nothing but 1s and 3s
88
D=(0 1 2 4 7)

11.sh

+19-19
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@ while [ ${#change} != 0 ]; do
66
change=(); l=
77
for i in $I; do
88
for j in $J; do
9-
x=${B[i]:$j:1};
9+
x=${B[i]:j:1}
1010
if [[ "$x" == "L" || "$x" == "X" ]]; then
11-
s="${B[i-1]:$((j-1)):3}${B[i]:$((j-1)):1}${B[i]:$((j+1)):1}${B[i+1]:$((j-1)):3}";
12-
s=${s//[L.]/}
13-
if [[ ${#s} == 0 ]]; then x=X; elif [[ ${#s} -ge 4 ]]; then x=L; fi; k=$((k+1))
14-
fi;
15-
l+=$x;
11+
s="${B[i-1]:j-1:3}${B[i]:j-1:3}${B[i+1]:j-1:3}"
12+
s=${s//[L.]}; s=${s/$x}
13+
if [[ ${#s} == 0 ]]; then x=X; elif [[ ${#s} -ge 4 ]]; then x=L; fi
14+
fi
15+
l+=$x
1616
done
1717
[ "${B[i]}" != .$l. ] && change+=($((i-1)) $i $((i+1)))
1818
C[i]=.$l.; l=
1919
done
2020
B=("${C[@]}")
2121
I=$(printf "%s\n" ${change[@]} |sort -u)
22-
[ $((++round)) = 1 ] && B=("${C[@]//X/x}")
23-
#[ $((round%10)) = 0 ] && echo "$round: $((${#change[@]}/3))"
22+
((++round==1)) && B=("${C[@]//X/x}")
23+
#((round%10)) || echo "$round: $((${#change[@]}/3))"
2424
done
2525
ans="${B[*]}"; ans=${ans//[ L.]}
2626
echo "11A: ${#ans}"
@@ -29,29 +29,29 @@ echo "11A: ${#ans}"
2929
B=(L${A//?/L}L); for i in "${A[@]}"; do B+=(L${i}L); done; B+=($B)
3030
J=$(seq ${#A}); I=$(seq ${#A[@]}); change=1; round=0
3131
while [ ${#change} != 0 ]; do
32-
change=""; C=($B); l="";
32+
change=""; C=($B); l=""
3333
for i in $I; do
3434
for j in $J; do
35-
x=${B[i]:$j:1};
35+
x=${B[i]:j:1}
3636
[[ "$x" != "L" && "$x" != "X" ]] && l+=$x && continue
3737
r=${B[i]:j+1}; r=${r//.}; R=${B[i]:0:j}; R=${R//.}
3838
s=${R: -1}${r:0:1}
39-
k=1; d=${B[i-k]:j-k:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i-k]:j-k:1}; done; s+=$d
40-
k=1; d=${B[i-k]:j:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i-k]:j:1}; done; s+=$d
41-
k=1; d=${B[i-k]:j+k:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i-k]:j+k:1}; done; s+=$d
42-
k=1; d=${B[i+k]:j-k:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i+k]:j-k:1}; done; s+=$d
43-
k=1; d=${B[i+k]:j:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i+k]:j:1}; done; s+=$d
44-
k=1; d=${B[i+k]:j+k:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i+k]:j+k:1}; done; s+=$d
39+
k=1; d=${B[i-k]:j-k:1}; while [ "$d" = '.' ]; do ((++k)); d=${B[i-k]:j-k:1}; done; s+=$d
40+
k=1; d=${B[i-k]:j:1}; while [ "$d" = '.' ]; do ((++k)); d=${B[i-k]:j:1}; done; s+=$d
41+
k=1; d=${B[i-k]:j+k:1}; while [ "$d" = '.' ]; do ((++k)); d=${B[i-k]:j+k:1}; done; s+=$d
42+
k=1; d=${B[i+k]:j-k:1}; while [ "$d" = '.' ]; do ((++k)); d=${B[i+k]:j-k:1}; done; s+=$d
43+
k=1; d=${B[i+k]:j:1}; while [ "$d" = '.' ]; do ((++k)); d=${B[i+k]:j:1}; done; s+=$d
44+
k=1; d=${B[i+k]:j+k:1}; while [ "$d" = '.' ]; do ((++k)); d=${B[i+k]:j+k:1}; done; s+=$d
4545
#[[ ${#s} == 8 ]] || echo "ERROR: ($s) $k = $i, $j"
4646
s=${s//L}
4747
if [[ ${#s} == 0 ]]; then l+=X; elif [[ ${#s} -ge 5 ]]; then l+=L; else l+=$x; fi
4848
done
4949
[ ${B[i]} != L${l}L ] && change+=1
5050
C+=(L${l}L); l=
5151
done
52-
C+=($B); B=("${C[@]}");
53-
[ $((++round)) = 1 ] && B=("${C[@]//X/x}")
54-
#[ $((round%10)) = 0 ] && echo "$round: ${#change}"
52+
C+=($B); B=("${C[@]}")
53+
((++round==1)) && B=("${C[@]//X/x}")
54+
#((round%10)) || echo "$round: ${#change}"
5555
done
5656
sum="${B[*]}"; sum=${sum//[ L.]}
5757
echo "11B: ${#sum}"

12.sh

+18-16
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,31 @@ A=($(< ${1:-12.txt}))
33
H=1; X=0; Y=0; D=(N E S W)
44
for i in "${A[@]}"; do
55
i=${i/F/${D[H]}}
6+
n=${i:1}
67
case $i in
7-
N*) Y+=+${i:1};;
8-
S*) Y+=-${i:1};;
9-
E*) X+=+${i:1};;
10-
W*) X+=-${i:1};;
11-
R*) H=$((((${i:1}/90)+H)%4));;
12-
L*) H=$((((-${i:1}/90)+H)%4));;
8+
N*) ((Y+=n));;
9+
S*) ((Y-=n));;
10+
E*) ((X+=n));;
11+
W*) ((X-=n));;
12+
R*) ((H=((n/90)+H)%4));;
13+
L*) ((H=((-n/90)+H)%4));;
1314
*) echo ERROR $i; break;;
1415
esac
1516
done
16-
echo "12A: $((X))+$((Y)) = $(((X<0?-X:X)+(Y<0?-Y:Y)))"
17+
echo "12A: $X+$Y = $((${X/-}+${Y/-}))"
1718
H=1; X=10; Y=1; x=0; y=0
1819
for i in "${A[@]}"; do
20+
n=${i:1}
1921
case $i in
20-
N*) Y+=+${i:1};;
21-
S*) Y+=-${i:1};;
22-
E*) X+=+${i:1};;
23-
W*) X+=-${i:1};;
24-
F*) x=$((x+${i:1}*(X))); y=$((y+${i:1}*(Y)));;
25-
R90|L270) TMP=$X; X=$((Y)); Y=$((-(TMP)));;
26-
R270|L90) TMP=$X; X=$((-(Y))); Y=$((TMP));;
27-
R180|L180) X=$((-(X)));Y=$((-(Y)));;
22+
N*) ((Y+=n));;
23+
S*) ((Y-=n));;
24+
E*) ((X+=n));;
25+
W*) ((X-=n));;
26+
F*) ((x+=n*X,y+=n*Y));;
27+
R90|L270) TMP=$X; ((X=Y,Y=-TMP));;
28+
R270|L90) TMP=$X; ((X=-Y,Y=TMP));;
29+
R180|L180) ((X=-X,Y=-Y));;
2830
*) echo ERROR $i; break;;
2931
esac
3032
done
31-
echo "12B: $((x))+$((y)) = $(((x<0?-x:x)+(y<0?-y:y)))"
33+
echo "12B: $x+$y = $((${x/-}+${y/-}))"

13.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ for i in ${!A[@]}; do [ ${A[i]} != x ] && B[$i]=${A[i]} ; done
1414
N=0; step=1
1515
#echo "${!B[@]} => "${B[@]}""
1616
for i in "${!B[@]}"; do
17-
while [ $(( (N+i) % ${B[$i]})) != 0 ]; do N=$((N+step)); done
18-
step=$((step*${B[$i]}))
17+
while (((N+i)%${B[$i]})); do ((N+=step)); done
18+
((step*=${B[$i]}))
1919
done
2020
echo "13B: $N"

14.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ echo "14A: $((sum))"
1313
r() {
1414
local x=${2/X/0}
1515
if [ "$x" = "$2" ]; then
16-
mem2[$(($1|(2#$x)))]=$3
16+
mem2[$1|(2#$x)]=$3
1717
else
1818
r $1 $x $3
1919
r $1 ${2/X/1} $3
2020
fi
2121
}
2222

23-
IFS=$' []=\n\r'
23+
IFS=$' []=\n'
2424
while read i y _ v; do
2525
case "$i" in
2626
mask*) o=$((2#${y//X/0})); m=${y//1/0}; z=$((~2#${m//X/1}));;

15.sh

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,27 @@ A=($(<${1:-15.txt}))
33
GIVEUP=${2:-10}
44
#A=(0 3 6)
55
B=(); i=0; l=""
6-
for a in ${A[@]}; do B[$a]=$((++i)); done
6+
for a in ${A[@]}; do B[a]=$((++i)); done
77
while [ $i -lt 2020 ]; do
8-
n=$((i-${l:-$i})); l=${B[$n]}; B[$n]=$((++i))
8+
n=$((i-${l:-$i})); l=${B[n]}; B[n]=$((++i))
99
done
1010
echo "15A: $n"
1111

1212
sharded_swap() { # syntax: l=B[$1]; B[$1]=$2
13-
# local x="B$(($1>>9))[$(($1&511))]"
14-
local x="B$(($1>>6))[$(($1&63))]"
13+
local x="B$(($1>>9))[$1&511]"
14+
#local x="B$(($1>>6))[$1&63]"
1515
eval "l=\${$x}; $x=$2"
1616
}
1717
SECONDS=0
18+
trap 'echo "$i: $SECONDS sec $((i/300000))%"' USR1 EXIT
1819
i=0; for a in ${A[@]}; do sharded_swap $a $((++i)); done; l="";
1920
while [[ $i -lt 30000000 && $SECONDS -le $GIVEUP ]]; do
2021
n=$((i-${l:-$i})); sharded_swap $n $((++i))
21-
[ $((i%100000)) = 0 ] && echo "$i: $SECONDS sec"
2222
done
2323
if [ $i = 30000000 ]; then
2424
echo "15B: $n"
2525
else
26-
# The code above would take days or weeks to run. Switch to awk
26+
# The code above is painfully slow. Switch to awk
2727
echo "15B(round $i): $n (Gave up after $SECONDS seconds)"
2828
printf "%s\n" ${A[@]} | awk '{B[$0]=++i;}
2929
END {

16.sh

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ A=($(grep "," $input))
66
sum=""
77
for i in ${!A[@]}; do
88
for j in ${A[i]//,/ }; do
9-
[[ $j -lt $min || $j -gt $max ]] && sum+=+$j && A[i]=""
9+
(( j < min || j > max )) && sum+=+$j && A[i]=""
1010
done
1111
done
1212
echo "16A: $((sum))"
@@ -27,8 +27,8 @@ for line in ${B[@]}; do
2727
T=(${line//,/ })
2828
for i in $idx; do
2929
for n in $idx; do
30-
if [[ ${T[n]} -lt ${Cm1[i]} || ${T[n]} -gt ${CM1[i]} ]] && [[ ${T[n]} -lt ${Cm2[i]} || ${T[n]} -gt ${CM2[i]} ]]; then
31-
Cf[$i]=${Cf[$i]//${f[n]}} # remove out of range char
30+
if (( (T[n] < Cm1[i] || T[n] > CM1[i]) && (T[n] < Cm2[i] || T[n] > CM2[i]) )); then
31+
Cf[i]=${Cf[i]//${f[n]}} # remove out of range char
3232
fi
3333
done
3434
done
@@ -39,8 +39,8 @@ while [[ "$oldC" != "${Cf[*]}" ]]; do
3939
oldC="${Cf[*]}"
4040
for i in $idx; do
4141
if [ ${#Cf[i]} = 1 ] ; then
42-
x=${Cf[i]}; n=$((36#$i))
43-
[ ${C[i]:0:3} = dep ] && total+=*${my_ticket[$n]}
42+
x=${Cf[i]}
43+
[ ${C[i]:0:3} = dep ] && total+=*${my_ticket[36#$i]}
4444
Cf=("${Cf[@]//$x}")
4545
fi
4646
done

18.sh

+5-6
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,22 @@ c() {
88
if [[ $i = '+' || $i = '*' ]]; then
99
op=$i
1010
else
11-
sum=$((sum$op$i))
11+
((sum$op=$i))
1212
fi
1313
done
1414
#echo "c: ${*//[()]} = $sum " >&2
1515
echo ${sum}
1616
}
1717

1818
IFS=$' \t\n'
19-
regex="\([^()]*\)"
19+
regex="\(([^()]*)\)"
2020
sum=""
2121
for line in "${A[@]}"; do
2222
while [[ "$line" =~ $regex ]]; do
23-
k=${BASH_REMATCH[0]}
24-
n=$(c "$k")
25-
line="${line/${k//\*/\\*}/$n}" # stupid globbing
23+
n=$(c ${BASH_REMATCH[1]})
24+
line="${line/${BASH_REMATCH[0]//\*/\\*}/$n}" # stupid globbing
2625
done
27-
sum+=+$(c "$line")
26+
sum+=+$(c $line)
2827
done
2928
echo "18A: $((sum))"
3029
echo "18B: $(($(printf "+(%s)" "${A[@]//\*/)*(}")))"

0 commit comments

Comments
 (0)