count matches w/ string manipulation: ~75% gain, 85-90% gain from V1

This commit is contained in:
2021-07-24 20:26:55 +02:00
parent 1806f79e14
commit 01e5c6217d
4 changed files with 22 additions and 7 deletions

8
OUTPUT
View File

@@ -443,3 +443,11 @@ ex1.bash : res=285
ex2.bash : res=412 ex2.bash : res=412
time: 0:03.37 real, 3.34 user, 0.03 sys time: 0:03.37 real, 3.34 user, 0.03 sys
context-switch: 19+1, page-faults: 0+11909 context-switch: 19+1, page-faults: 0+11909
=========================================
================= day20 =================
=========================================
ex1.bash : res=5966506063747
time: 0:00.54 real, 0.53 user, 0.00 sys
context-switch: 1+1, page-faults: 0+223

View File

@@ -20,7 +20,7 @@ ex1:
@#$(TIME) ex1-c 2020 < $(INPUT) 2>&1 @#$(TIME) ex1-c 2020 < $(INPUT) 2>&1
ex2: ex2:
@$(TIME) ex2.bash < $(INPUT) 2>&1 @#$(TIME) ex2.bash < $(INPUT) 2>&1
@#$(TIME) ex1-c 30000000 < $(INPUT) 2>&1 @#$(TIME) ex1-c 30000000 < $(INPUT) 2>&1
clean: clean:

4
day20/OUTPUT Normal file
View File

@@ -0,0 +1,4 @@
ex1.bash : res=5966506063747
time: 0:00.54 real, 0.53 user, 0.00 sys
context-switch: 1+1, page-faults: 0+223

View File

@@ -54,18 +54,21 @@ for key in "${!nums[@]}"; do
done done
ALL=("${T[@]}" "${R[@]}" "${B[@]}" "${L[@]}" "${RT[@]}" "${RR[@]}" "${RB[@]}" "${RL[@]}") ALL="${T[@]} ${R[@]} ${B[@]} ${L[@]} ${RT[@]} ${RR[@]} ${RB[@]} ${RL[@]}"
ALLSIZE=${#ALL}
declare -i res=1 count declare -i res=1 count
for ((i=0; i<${#nums[@]}; ++i)); do for ((i=0; i<${#nums[@]}; ++i)); do
count=0 count=0
for t in ${T[$i]} ${R[$i]} ${B[$i]} ${L[$i]}; do for t in ${T[$i]} ${R[$i]} ${B[$i]} ${L[$i]}; do
for s in "${ALL[@]}"; do # https://stackoverflow.com/questions/26212889/bash-counting-substrings-in-a-string/50601141#50601141
[[ $t == "$s" ]] && ((count++)) S=${ALL//$t}
done # 10 is line size
((count += (ALLSIZE-${#S})/10))
done done
# 6 is 4 for itself, + 2 for other matching
((count ==6)) && ((res*=${nums[$i]})) ((count == 6)) && ((res*=${nums[$i]}))
done done
printf "%s : res=%d\n" "$CMD" "$res" printf "%s : res=%d\n" "$CMD" "$res"