2024-12-11 20:53:40 +08:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
FILE=input
|
|
|
|
|
|
|
|
# Get max num size by squaring the largest number
|
|
|
|
MAX_NUM_SIZE=0
|
|
|
|
while read -r NUM
|
|
|
|
do
|
|
|
|
if [[ ${#NUM} -gt $MAX_NUM_SIZE ]]
|
|
|
|
then
|
|
|
|
MAX_NUM_SIZE=${#NUM}
|
|
|
|
fi
|
|
|
|
done <<< "$( < input tr " " "\n" )"
|
|
|
|
(( MAX_NUM_SIZE*=2 ))
|
|
|
|
|
|
|
|
# Just pre-compute a large number of digits
|
|
|
|
{
|
2024-12-11 22:34:38 +08:00
|
|
|
# Rule 1
|
|
|
|
printf "0 1 \n"
|
|
|
|
|
|
|
|
# Rule 2 : If even number of digits, split half half
|
|
|
|
for (( i=10 ; i<100; i+=1 ))
|
|
|
|
do
|
|
|
|
DIGIT_COUNT=${#i}
|
|
|
|
HALF=$(( DIGIT_COUNT / 2 ))
|
|
|
|
printf "%s %s %s \n" "$i" "$(( 10#${i:0:$HALF} ))" "$(( 10#${i:$HALF} ))"
|
|
|
|
done
|
|
|
|
for (( i=1000 ; i<10000; i+=1 ))
|
|
|
|
do
|
|
|
|
DIGIT_COUNT=${#i}
|
|
|
|
HALF=$(( DIGIT_COUNT / 2 ))
|
|
|
|
printf "%s %s %s \n" "$i" "$(( 10#${i:0:$HALF} ))" "$(( 10#${i:$HALF} ))"
|
|
|
|
done
|
|
|
|
|
|
|
|
# Rule 3
|
|
|
|
for (( i=1; i<10; i+=1 ))
|
|
|
|
do
|
|
|
|
printf "%s %s \n" "$i" "$(( i * 2024 ))"
|
|
|
|
done
|
|
|
|
for (( i=100; i<1000; i+=1 ))
|
|
|
|
do
|
|
|
|
printf "%s %s \n" "$i" "$(( i * 2024 ))"
|
|
|
|
done
|
2024-12-11 20:53:40 +08:00
|
|
|
} | sort -n > kv-cache
|
|
|
|
printf "Cache built. KV size: %s \n" "$( wc -l kv-cache )"
|
|
|
|
|
|
|
|
# Load cache file
|
|
|
|
declare -A KV_CACHE
|
2024-12-11 23:27:03 +08:00
|
|
|
while read -r KEY VALUE
|
2024-12-11 20:53:40 +08:00
|
|
|
do
|
2024-12-11 23:27:03 +08:00
|
|
|
KV_CACHE[$KEY]="$VALUE"
|
2024-12-11 20:53:40 +08:00
|
|
|
done < kv-cache
|
|
|
|
|
2024-12-11 22:34:38 +08:00
|
|
|
# Use this function for cache misses
|
2024-12-11 20:53:40 +08:00
|
|
|
NUM=0
|
|
|
|
get_num () {
|
|
|
|
|
|
|
|
NUM=$1
|
|
|
|
|
|
|
|
# Rule 1 : Convert 0 to 1
|
|
|
|
if [[ $NUM -eq 0 ]]
|
|
|
|
then
|
2024-12-11 22:34:38 +08:00
|
|
|
printf "%s 1 \n" "$OCCUR"
|
2024-12-11 20:53:40 +08:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Rule 2 : If even number of digits, split half half
|
|
|
|
DIGIT_COUNT=${#NUM}
|
|
|
|
if [[ $(( DIGIT_COUNT % 2 )) -eq 0 ]]
|
|
|
|
then
|
|
|
|
HALF=$(( DIGIT_COUNT / 2 ))
|
2024-12-11 23:27:03 +08:00
|
|
|
printf "%s %s \n" "$OCCUR" "$(( 10#${NUM:0:$HALF} ))"
|
|
|
|
printf "%s %s \n" "$OCCUR" "$(( 10#${NUM:$HALF} ))"
|
2024-12-11 20:53:40 +08:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Rule 3 : Multiply by 2024
|
2024-12-11 22:34:38 +08:00
|
|
|
printf "%s %s \n" "$OCCUR" "$(( NUM * 2024 ))"
|
2024-12-11 20:53:40 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
# Start the loop
|
2024-12-11 22:34:38 +08:00
|
|
|
tr " " "\n" < "$FILE" | sort -n | uniq -c > temp-input
|
2024-12-12 17:15:50 +08:00
|
|
|
for (( i=0; i<750; i++ ))
|
2024-12-11 20:53:40 +08:00
|
|
|
do
|
|
|
|
printf "%s Position %s\n" "$( date )" "$i"
|
2024-12-11 22:34:38 +08:00
|
|
|
#cat temp-input
|
|
|
|
while read -r OCCUR NUM
|
2024-12-11 20:53:40 +08:00
|
|
|
do
|
2024-12-11 22:34:38 +08:00
|
|
|
if [[ -v KV_CACHE[$NUM] ]]
|
2024-12-11 20:53:40 +08:00
|
|
|
then
|
2024-12-11 22:34:38 +08:00
|
|
|
for VAL in ${KV_CACHE[$NUM]}
|
|
|
|
do
|
|
|
|
printf "%s %s \n" "$OCCUR" "$VAL"
|
|
|
|
done
|
2024-12-11 20:53:40 +08:00
|
|
|
else
|
|
|
|
get_num "$NUM"
|
|
|
|
fi
|
|
|
|
done < temp-input |
|
2024-12-11 22:34:38 +08:00
|
|
|
tee temp-output |
|
2024-12-11 23:30:07 +08:00
|
|
|
sort -n -k2 |
|
2024-12-11 22:34:38 +08:00
|
|
|
uniq -c |
|
2024-12-11 23:27:03 +08:00
|
|
|
awk '{sums[$3] += $1 * $2 } END {for (i in sums) {print sums[i], i}}' |
|
2024-12-11 20:53:40 +08:00
|
|
|
sponge temp-input
|
|
|
|
done
|
2024-12-11 22:34:38 +08:00
|
|
|
printf "Final count: %s\n" "$( awk '{print $1}' < temp-input | paste -s -d "+" | bc )"
|