Compare commits

..

53 Commits

Author SHA1 Message Date
0134815002 Working part 2 2024-12-20 01:01:41 +08:00
fd78069221 Day 19 Part 1 Working 2024-12-19 17:00:05 +08:00
ce0033c6f5 Clean up 2024-12-18 12:17:06 +08:00
0d518e1691 Working part 2. Added check_tail for digit matching. 2024-12-18 12:13:16 +08:00
de2fd03c3c Use read_opcode function 2024-12-17 17:09:19 +08:00
e02ee993c6 Offload machine to separate file 2024-12-17 16:30:14 +08:00
ac940aad0e Working day 17 part 1 2024-12-17 15:48:25 +08:00
f17b7f75d2 Day 16 Part 1 Non working 2024-12-16 19:14:02 +08:00
f6e91fa1fa Clean up 2024-12-15 22:45:25 +08:00
37667c0990 Working part 2 2024-12-15 20:47:09 +08:00
415f757054 Fixed missing paste. Working part 1 2024-12-15 16:18:50 +08:00
615f9ec252 Added more wall tests. Made more verbose GPS counting. 2024-12-15 16:14:11 +08:00
23076697cf Day 15 broken part 1 2024-12-15 15:50:45 +08:00
9492a8ae9a Terrible solution to a terrible question. Working part 2 2024-12-15 00:38:13 +08:00
004d5a7bd3 Broken part 2 2024-12-14 23:24:51 +08:00
fd10d06b88 Day 14 Working part 1 2024-12-14 17:29:07 +08:00
937635d773 Clean up 2024-12-13 16:38:08 +08:00
beac193288 Working part 2 solution 2024-12-13 16:35:36 +08:00
3764b25f6d Day 13 Part 1 working 2024-12-13 14:33:46 +08:00
b33653672c Part 2 draft 2024-12-12 22:49:45 +08:00
fc7e08ef0e Fix test case 2 2024-12-12 17:52:33 +08:00
0f95c6367e Passed part 1 but failed test case 2. 2024-12-12 17:22:34 +08:00
58f828fef3 Passed test case 1 & 3 2024-12-12 17:15:50 +08:00
f948a2da13 Day 12 Part 1 broken 2024-12-12 16:39:37 +08:00
792d86423f minor speedup 2024-12-11 23:30:07 +08:00
9e60df1c2e Massive speed up with correct summation calculation 2024-12-11 23:27:03 +08:00
6e636d4c34 Working part 2. Implemented sort and group for each iteration 2024-12-11 22:34:38 +08:00
39e8e8735b Two brute force methods for part 2. Slow. 2024-12-11 20:53:40 +08:00
d2d4bf7a64 Implemented caching system 2024-12-11 17:32:45 +08:00
d9a1e9fce3 Day 11 Part 1 working 2024-12-11 15:04:49 +08:00
a4fa64624a Disable verbose printing 2024-12-11 00:40:29 +08:00
29a4e45e63 Working part 2 2024-12-10 23:38:13 +08:00
e0d3bcfe9e Working part 1 2024-12-10 23:25:35 +08:00
eff5810fe3 Broken day 10 part 1 2024-12-10 22:24:58 +08:00
3bf816b20f Clean ups 2024-12-10 09:55:35 +08:00
c7c4a05cb0 Added skip function for faster exit. Part 2 still broken 2024-12-10 00:07:07 +08:00
ad1778c8f0 Broken part 2 2024-12-09 20:28:52 +08:00
b4b2a6e794 day 9 part 1 solution 2024-12-09 17:17:34 +08:00
da0db2fde1 working builds 2024-12-09 01:33:31 +08:00
ec2c4a97c9 Not working part 2 2024-12-09 00:53:38 +08:00
9e0d86d996 Working part 1 build 2024-12-09 00:36:51 +08:00
ca493d881f Cleaner mark counter 2024-12-09 00:02:48 +08:00
ee587b234b - 2024-12-08 23:52:17 +08:00
cdd982a73c Day 8 Part 1 Not Working 2024-12-08 23:50:22 +08:00
ec819c3335 Remove code for clarity 2024-12-08 02:25:50 +08:00
70460b22e2 Incorrect comment 2024-12-07 23:40:54 +08:00
fd3020b546 Part 2 2024-12-07 23:38:44 +08:00
5c6ae83f8e Day 7 Part 1 2024-12-07 23:26:01 +08:00
8baa4e3456 Use input file 2024-12-06 19:37:02 +08:00
bbf76b12d7 Solution 1 day 5 2024-12-06 19:36:11 +08:00
ec1f958f9d Stupid stuff 2024-12-06 12:46:43 +08:00
9b763d5b37 indentation 2024-12-06 02:46:03 +08:00
3282ef2a35 Use read -a for safety 2024-12-06 01:32:07 +08:00
62 changed files with 6396 additions and 6 deletions

54
2024/day-10/input Normal file
View File

@ -0,0 +1,54 @@
543067650323210321032110356789890110710189878760134567
612148941212306782345091235410765227893258759651021298
701238932301456798106787549323454336794567549842330807
898547215450589867287654678892961245987654456732498910
987656306769678956398013234781870301256003301201567821
234543215878760145478920105690210982340112210341056932
109650124981232230569834124567345673451234985452347845
018744323890341021656765033438454589298545676701037796
199803210787650110765017842129823672107655677812378987
785012345654789541874326956010510563201234389983405676
174321498723498632903455467173421454102348210234514430
065430239014323721212762398982567876218959650149623521
145540128765017890101871081071018967327968743898734678
236692134984178768718981012567894458456876212798604329
987783005673269659654108923458763349663212108789015012
896654012562154546743267830309854218767103419276126787
765780123473043432890154321212903109878756578125435698
434099874984012301740125654567812893469017647030165556
323101065765101787434436763058906732154178736543256765
013298187890678696325569892143215440043289128954343894
010367296541549045016678765014300351234567037760012983
329458305032132134787867410967891267653438546891898012
458789414145010120196986323898763298344129655432743210
567076523236678743285898456777654101201098766653658901
456167654107549658374567689985403100312434985567877014
343228943298938569843210576876312238920125676656986323
651014543498127478755765435410278947437876985543235434
743223672567078369876890324320127656506987234350145632
894102981089569232125981210451256543215432122341076541
765091234676352101034674323401237894101341001456789830
014780365445443032126501012532345743103210112565898321
123689876034321145098432107645236743254101101876543210
094545763125210056788943258896107858969010332987674301
785430432106782169877652349787567967678321245696784561
876021569045893458965601654343478914565414326781093870
987109878010432167014298710234323901258905015492012901
789219894324569052123109620123217892109876012323458692
654308765543678743013234538994106543010870965410069783
789877787632189852101110145885287676521961871012178654
034565896601087601211001406776896789437652676523468743
121053795542194512389132312345445676548943989430549012
262342187634765433498545434531230107401232104321678298
876533014123892324567696526540043298340981010780890187
983414523016101019876587017832134781256672125690743296
032101654327892100345678789901295690764543434321652345
123089789236743981234589654800387789835678987787601336
854176590187656876104310343211456876544549016098543223
965765410194545675465231230898565963233432145123210112
876894321243232980370110141767653210112321039654101101
146765232100101061289879852632154100203410128789210322
036787103761267876518768763543069911012543454376325412
123498654854356987405650654985678892327632567215436701
210567569983543292314321569876301765438761078904589898
325456478754330101223433478765432654349652987615678765

151
2024/day-10/solution-1.sh Normal file
View File

@ -0,0 +1,151 @@
#!/usr/bin/env bash
FILE=input
MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 ))
MAP_LEN=$( < "$FILE" wc -l )
read -r -a MAP_ARRAY <<< "$( paste -s -d "" <"$FILE" | sed -E 's/(.)(.)/\1 \2 /g' )"
printf "%s " "${MAP_ARRAY[@]}"
printf "\n"
MAP_SIZE=${#MAP_ARRAY[@]}
for (( i=0; i<MAP_SIZE ; i++ ))
do
if [[ ${MAP_ARRAY[i]} -eq 0 ]]
then
printf "Trailhead found at position %s\n" "$i"
TRAILHEADS+=( "$i" )
elif [[ ${MAP_ARRAY[i]} -eq 9 ]]
then
printf "Peak found at position %s\n" "$i"
PEAKS+=( "$i" )
fi
done
printf "%s " "${TRAILHEADS[@]}"
printf "\n"
printf "%s " "${PEAKS[@]}"
printf "\n"
get_nine () {
# Trails are explored areas
# Paths are areas to explore
GET_NUM=$1
DIRECTIONS=$2
TRAIL=$3
COMBINATIONS=()
# For each direction, get multiplication of prime number
# corresponding to each direction
# Modulus for valid directions is 0
# 2 : Up
# 3 : Down
# 7 : Left
# 13 : Right
if [[ $(( DIRECTIONS % 2 )) -eq 0 ]]
then
INDEX=$(( TRAIL - MAP_WIDTH ))
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
then
COMBINATIONS+=( "$INDEX" )
fi
fi
if [[ $(( DIRECTIONS % 3 )) -eq 0 ]]
then
INDEX=$(( TRAIL + MAP_WIDTH ))
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
then
COMBINATIONS+=( "$INDEX" )
fi
fi
if [[ $(( DIRECTIONS % 7 )) -eq 0 ]]
then
INDEX=$(( TRAIL - 1 ))
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
then
COMBINATIONS+=( "$INDEX" )
fi
fi
if [[ $(( DIRECTIONS % 13 )) -eq 0 ]]
then
INDEX=$(( TRAIL + 1 ))
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
then
COMBINATIONS+=( "$INDEX" )
fi
fi
#PRINT1=$( printf "%s " "$TRAIL" )
#PRINT2=$( printf "%s " "${COMBINATIONS[@]}" )
#printf "trail: %s, Get: %s, combinations: %s \n" "$PRINT1" "$GET_NUM" "$PRINT2" >&2
# Check if the end has been reached
# or no matching neighbors
if [[ $GET_NUM -eq 9 ]] || [[ ${#COMBINATIONS[@]} -eq 0 ]]
then
# Exit recursion
printf "%s " "${COMBINATIONS[@]}"
#printf "%s " "${COMBINATIONS[@]}" >&2
return
fi
# Recurse
NEXT_NUM=$(( GET_NUM+=1 ))
read -r -a RESULTS <<< "$(
for INDEX in "${COMBINATIONS[@]}"
do
RESULT=$(
get_nine \
"$NEXT_NUM" \
"$( get_valid_directions "$INDEX" )" \
"$INDEX"
)
printf "%s " "$RESULT"
done
)"
printf "%s " "${RESULTS[@]}"
#printf "%s " "${RESULTS[@]}" >&2
#printf "\n" >&2
}
get_valid_directions () {
IDX=$1
NUM=1
# Basically check for bounds
# For each direction, get multiplication of prime number
# corresponding to each direction
# 2 : Up
# 3 : Down
# 7 : Left
# 13 : Right
if [[ $(( IDX / MAP_LEN )) -gt 0 ]]
then
(( NUM*=2 ))
fi
if [[ $(( IDX / MAP_LEN )) -le $MAP_LEN ]]
then
(( NUM*=3 ))
fi
if [[ $(( IDX % MAP_WIDTH )) -ne 0 ]]
then
(( NUM*=7 ))
fi
if [[ $(( IDX % MAP_WIDTH )) -ne $(( MAP_WIDTH - 1 )) ]]
then
(( NUM*=13 ))
fi
printf "%s" "$NUM"
}
ITER=9999
TOTAL=0
for TRAILHEAD in "${TRAILHEADS[@]}"
do
read -r -a PEAKS <<< "$( get_nine "1" "$( get_valid_directions "$TRAILHEAD" )" "$TRAILHEAD" )"
COUNT=$( printf "%s " "${PEAKS[@]}" | grep -Eo '[0-9]*' | sort -u | wc -l )
(( TOTAL+=COUNT ))
(( ITER-- ))
if [[ $ITER -eq 0 ]] ;then break; fi
done
printf "%s\n" "$TOTAL"

144
2024/day-10/solution-2.sh Normal file
View File

@ -0,0 +1,144 @@
#!/usr/bin/env bash
FILE=input
MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 ))
MAP_LEN=$( < "$FILE" wc -l )
read -r -a MAP_ARRAY <<< "$( paste -s -d "" <"$FILE" | sed -E 's/(.)(.)/\1 \2 /g' )"
#printf "%s " "${MAP_ARRAY[@]}"
#printf "\n"
MAP_SIZE=${#MAP_ARRAY[@]}
for (( i=0; i<MAP_SIZE ; i++ ))
do
if [[ ${MAP_ARRAY[i]} -eq 0 ]]
then
#printf "Trailhead found at position %s\n" "$i"
TRAILHEADS+=( "$i" )
#elif [[ ${MAP_ARRAY[i]} -eq 9 ]]
#then
# #printf "Peak found at position %s\n" "$i"
# PEAKS+=( "$i" )
fi
done
#printf "%s " "${TRAILHEADS[@]}"
#printf "\n"
#printf "%s " "${PEAKS[@]}"
#printf "\n"
get_nine () {
# Trails are explored areas
# Paths are areas to explore
GET_NUM=$1
DIRECTIONS=$2
TRAIL=$3
COMBINATIONS=()
# For each direction, get multiplication of prime number
# corresponding to each direction
# Modulus for valid directions is 0
# 2 : Up
# 3 : Down
# 7 : Left
# 13 : Right
if [[ $(( DIRECTIONS % 2 )) -eq 0 ]]
then
INDEX=$(( TRAIL - MAP_WIDTH ))
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
then
COMBINATIONS+=( "$INDEX" )
fi
fi
if [[ $(( DIRECTIONS % 3 )) -eq 0 ]]
then
INDEX=$(( TRAIL + MAP_WIDTH ))
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
then
COMBINATIONS+=( "$INDEX" )
fi
fi
if [[ $(( DIRECTIONS % 7 )) -eq 0 ]]
then
INDEX=$(( TRAIL - 1 ))
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
then
COMBINATIONS+=( "$INDEX" )
fi
fi
if [[ $(( DIRECTIONS % 13 )) -eq 0 ]]
then
INDEX=$(( TRAIL + 1 ))
if [[ ${MAP_ARRAY[INDEX]} -eq $GET_NUM ]]
then
COMBINATIONS+=( "$INDEX" )
fi
fi
#PRINT1=$( printf "%s " "$TRAIL" )
#PRINT2=$( printf "%s " "${COMBINATIONS[@]}" )
#printf "trail: %s, Get: %s, combinations: %s \n" "$PRINT1" "$GET_NUM" "$PRINT2" >&2
# Check if the end has been reached
# or no matching neighbors
if [[ $GET_NUM -eq 9 ]] || [[ ${#COMBINATIONS[@]} -eq 0 ]]
then
# Exit recursion
printf "%s " "${#COMBINATIONS[@]}"
#printf "%s " "${COMBINATIONS[@]}" >&2
return
fi
# Recurse
NEXT_NUM=$(( GET_NUM+=1 ))
TOTAL=0
for INDEX in "${COMBINATIONS[@]}"
do
COUNT=$(
get_nine \
"$NEXT_NUM" \
"$( get_valid_directions "$INDEX" )" \
"$INDEX"
)
(( TOTAL += COUNT ))
done
printf "%s" "$TOTAL"
}
get_valid_directions () {
IDX=$1
NUM=1
# Basically check for bounds
# For each direction, get multiplication of prime number
# corresponding to each direction
# 2 : Up
# 3 : Down
# 7 : Left
# 13 : Right
if [[ $(( IDX / MAP_LEN )) -gt 0 ]]
then
(( NUM*=2 ))
fi
if [[ $(( IDX / MAP_LEN )) -le $MAP_LEN ]]
then
(( NUM*=3 ))
fi
if [[ $(( IDX % MAP_WIDTH )) -ne 0 ]]
then
(( NUM*=7 ))
fi
if [[ $(( IDX % MAP_WIDTH )) -ne $(( MAP_WIDTH - 1 )) ]]
then
(( NUM*=13 ))
fi
printf "%s" "$NUM"
}
TOTAL=0
for TRAILHEAD in "${TRAILHEADS[@]}"
do
COUNT=$( get_nine "1" "$( get_valid_directions "$TRAILHEAD" )" "$TRAILHEAD" )
(( TOTAL+=COUNT ))
done
printf "%s\n" "$TOTAL"

8
2024/day-10/test-input-1 Normal file
View File

@ -0,0 +1,8 @@
89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732

View File

@ -0,0 +1 @@
36

1
2024/day-11/input Normal file
View File

@ -0,0 +1 @@
2 54 992917 5270417 2514 28561 0 990

66
2024/day-11/solution-1.sh Normal file
View File

@ -0,0 +1,66 @@
#!/usr/bin/env bash
read -r -a ROCK_LIST <<< "$( cat input )"
BLINK_NUM=25
ROCK_RETURN=()
ROCK_NUM=0
blink_rock () {
#printf "Blinking rock : %s\n" "$ROCK_NUM" >&2
# Remove leading zeroes
ROCK_NUM=$(( 10#$ROCK_NUM ))
# Rule 1 : Convert 0 to 1
if [[ $ROCK_NUM -eq 0 ]]
then
ROCK_RETURN=( 1 )
return
fi
# Rule 2 : If even number of digits, split half half
DIGIT_COUNT=${#ROCK_NUM}
if [[ $(( DIGIT_COUNT % 2 )) -eq 0 ]] && [[ $DIGIT_COUNT -gt 0 ]]
then
HALF=$(( DIGIT_COUNT / 2 ))
read -r -a ROCK_RETURN <<< "$( printf "%s %s " "${ROCK_NUM:0:$HALF}" "${ROCK_NUM:$HALF}" )"
return
fi
# Rule 3 : Multiply by 2024
ROCK_RETURN=( $(( ROCK_NUM * 2024 )) )
return
}
ROCKS_TO_BLINK=()
BLINKED_ROCKS=()
# Updates the global array
blink_rocks () {
BLINKED_ROCKS=()
for ROCK in "${ROCKS_TO_BLINK[@]}"
do
ROCK_NUM=$ROCK
blink_rock
BLINKED_ROCKS+=( "${ROCK_RETURN[@]}" )
done
#printf "BLINKED_ROCKS: " >&2
#printf "%s " "${BLINKED_ROCKS[@]}" >&2
#printf "\n" >&2
}
FINAL_LIST=()
for ROCK_NUM in "${ROCK_LIST[@]}"
do
printf "Rock: %s\n" "$ROCK_NUM"
ROCKS_TO_BLINK=( "$ROCK_NUM" )
for (( i=0 ; i< BLINK_NUM; i++ ))
do
blink_rocks
ROCKS_TO_BLINK=( "${BLINKED_ROCKS[@]}" )
done
FINAL_LIST+=( "${BLINKED_ROCKS[@]}" )
done
printf "%s " "${FINAL_LIST[@]}"
printf "\n"
printf "%s\n" "${#FINAL_LIST[@]}"

106
2024/day-11/solution-2-2.sh Normal file
View File

@ -0,0 +1,106 @@
#!/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
{
# 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
} | sort -n > kv-cache
printf "Cache built. KV size: %s \n" "$( wc -l kv-cache )"
# Load cache file
declare -A KV_CACHE
while read -r KEY VALUE
do
KV_CACHE[$KEY]="$VALUE"
done < kv-cache
# Use this function for cache misses
NUM=0
get_num () {
NUM=$1
# Rule 1 : Convert 0 to 1
if [[ $NUM -eq 0 ]]
then
printf "%s 1 \n" "$OCCUR"
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 ))
printf "%s %s \n" "$OCCUR" "$(( 10#${NUM:0:$HALF} ))"
printf "%s %s \n" "$OCCUR" "$(( 10#${NUM:$HALF} ))"
return
fi
# Rule 3 : Multiply by 2024
printf "%s %s \n" "$OCCUR" "$(( NUM * 2024 ))"
return
}
# Start the loop
tr " " "\n" < "$FILE" | sort -n | uniq -c > temp-input
for (( i=0; i<750; i++ ))
do
printf "%s Position %s\n" "$( date )" "$i"
#cat temp-input
while read -r OCCUR NUM
do
if [[ -v KV_CACHE[$NUM] ]]
then
for VAL in ${KV_CACHE[$NUM]}
do
printf "%s %s \n" "$OCCUR" "$VAL"
done
else
get_num "$NUM"
fi
done < temp-input |
tee temp-output |
sort -n -k2 |
uniq -c |
awk '{sums[$3] += $1 * $2 } END {for (i in sums) {print sums[i], i}}' |
sponge temp-input
done
printf "Final count: %s\n" "$( awk '{print $1}' < temp-input | paste -s -d "+" | bc )"

107
2024/day-11/solution-2.sh Normal file
View File

@ -0,0 +1,107 @@
#!/usr/bin/env bash
declare -A KV_CACHE
read -r -a ROCK_LIST <<< "$( cat input )"
DUMP_KV_CACHE=0
BLINK_NUM=75
# KV Cache provides n depth search,
# but must always be fully divisible by BLINK_NUM
DEPTH=5
if [[ $(( BLINK_NUM % DEPTH )) -gt 0 ]] ;then printf "BLINK_NUM DEPTH mismatch.\n" && exit ; fi
ROCK_RETURN=()
ROCK_NUM=0
blink_rock () {
#printf "Blinking rock : %s\n" "$ROCK_NUM" >&2
# Remove leading zeroes
#ROCK_NUM=$(( 10#$ROCK_NUM ))
# Rule 1 : Convert 0 to 1
if [[ $ROCK_NUM -eq 0 ]]
then
ROCK_RETURN=( 1 )
return
fi
# Rule 2 : If even number of digits, split half half
DIGIT_COUNT=${#ROCK_NUM}
if [[ $(( DIGIT_COUNT % 2 )) -eq 0 ]] && [[ $DIGIT_COUNT -gt 0 ]]
then
HALF=$(( DIGIT_COUNT / 2 ))
read -r -a ROCK_RETURN <<< "$( printf "%s %s " "$(( 10#${ROCK_NUM:0:$HALF} ))" "$(( 10#${ROCK_NUM:$HALF} ))" )"
return
fi
# Rule 3 : Multiply by 2024
ROCK_RETURN=( $(( ROCK_NUM * 2024 )) )
return
}
ROCKS_TO_BLINK=()
BLINKED_ROCKS=()
# Updates the global array
blink_rocks () {
BLINKED_ROCKS=()
for ROCK in "${ROCKS_TO_BLINK[@]}"
do
ROCK_NUM=$ROCK
blink_rock
BLINKED_ROCKS+=( "${ROCK_RETURN[@]}" )
done
#printf "BLINKED_ROCKS: " >&2
#printf "%s " "${BLINKED_ROCKS[@]}" >&2
#printf "\n" >&2
}
read -r -a FINAL_LIST <<< "$( printf "%s " "${ROCK_LIST[@]}" )"
POSITION=0
while [[ $POSITION -lt $BLINK_NUM ]]
do
printf "%s Starting position %s, current len: %s, kv size: %s\n" "$( date )" "$POSITION" "${#FINAL_LIST[@]}" "${#KV_CACHE[@]}"
INTER_LIST_1=()
# Essentially move $DEPTH steps at a time
for ROCK in "${FINAL_LIST[@]}"
do
# Check if this is already cached
if [[ -v KV_CACHE["$ROCK"] ]]
then
# Retrieve cached entry
read -r -a X <<< "${KV_CACHE[$ROCK]}"
INTER_LIST_1+=( "${X[@]}" )
#printf "Cache hit. Key: %s, Value: " "$ROCK"
#printf "%s " "${KV_CACHE[$ROCK]}"
#printf "\n"
else
# Build cache entry
ROCKS_TO_BLINK=( "$ROCK" )
for (( i=0; i<DEPTH; i++ ))
do
blink_rocks
read -r -a ROCKS_TO_BLINK <<< "$( printf "%s " "${BLINKED_ROCKS[@]}" )"
done
KV_CACHE[$ROCK]=$( printf "%s " "${BLINKED_ROCKS[@]}" )
INTER_LIST_1+=( "${BLINKED_ROCKS[@]}" )
fi
done
read -r -a FINAL_LIST <<< "$( printf "%s " "${INTER_LIST_1[@]}" )"
# All rocks are calculated $DEPTH ahead
(( POSITION+=DEPTH ))
done
# Dump KV cache for debugging
if [[ $DUMP_KV_CACHE -eq 0 ]]
then
printf "Number of keys in KV cache: %s\n" "${#KV_CACHE[@]}"
printf "Dumping KV CACHE\n"
for KEY in "${!KV_CACHE[@]}"
do
printf "Key: %s, Value: %s\n" "$KEY" "${KV_CACHE[$KEY]}"
done | sort
fi
#printf "%s " "${FINAL_LIST[@]}"
#printf "\n"
printf "%s\n" "${#FINAL_LIST[@]}"

1
2024/day-11/test-input-1 Normal file
View File

@ -0,0 +1 @@
0 1 10 99 999

1
2024/day-11/test-input-2 Normal file
View File

@ -0,0 +1 @@
125 17

140
2024/day-12/input Normal file
View File

@ -0,0 +1,140 @@
AAAAARRRRRRRRRRROOOOOOOOOOOOWWWWWWWWWWWWWMMMMXXQQQQQQQWWWXXXXXXXXQQQQQQQQQQQQQQQQQQQDDDDDDBBBBBBBBBBBBBBBBBRRRRRRRRRRREEEEEEEEEEEEEJJJJJJJJJ
AAAAARRRRRRRROOROOOOOOOOOOWWWWWWWWWWWWWWWWWMMMMQQQQQQQQWXXXXXXXXXQQQQXQQQQQQQQQQQQQQDDDDDDBBBBBBBBBBBBBBBBBRRRRRRRREEEEEEEEEEEEEZEJJJJJJJJJJ
OAAAARRRRRRRRROOOOOOOOOOOWWWWWWWWWWWWWWWWWWMMMMQQQQJQQQWXXXXXXXXXXXXXXXQQQQQQQQQQQQQDDDDDBBBBBBBBBBBBBBBBBBRZRRRRRRRREEEEEEEEEEEJJJJJJJJJJJJ
AAAAARRRRRRRRYHOOOOOOOOOOWWWWWWWWWWWWWWWWWWMMMMMMQQQQQQXXXXXXXXXXXXXXXXQQQQQQQQQQQQQDDDDDBBBBBBBBBBBBBBBBBBZZRRRRRRREEEEEEEEEEEEJJJJJJJJJJJJ
AAAARRRRRRRYYYOOOOOOOOOOOOWWWWWWWWWWWWWWWWLMMMMMQQQQQQQQXXXXXXXXXXXXXXQQQQQQQQQQQQQDDDDDDDDBBBBBBBBBBBBBBBZZZZRRRRREEEEEEEEEEEEEJJJJJJJJJJJJ
AAAARRRRRRYYYVOOOOOOOOOOWWWWWWWWWWWWWWWWWWWWGGQQQQQQQQQQQXXXXCCXXXXXIIQQQQQQQQQQQYYEEDDDDDDBBUBBBBNBBBBBBBZZZZRRRREEEEEEEEEEEEEEEEJJJJJJJJJJ
AAAARRRRRRYYYOOVOOOOOOOWWWWWWWWWWWWWWWWWWWWWGVQQQQQQQQQQQXXCXCCXIIIIIQQQQQQQQQQQYYEEDDYDDDHBBBBBHHBBBUBBBJZZZRRRRRREEEEEEEEEEEEEEEJJJJJJJJJJ
AAARRRRRYYYYYYYVPOOOOOOOOOOWYYWWWWWWWWWWWWWWGVVQQQQQQQQQHHHCCCCCIIIIIQQQQQQQQQQYYYYYYYYDHHHHHHHHHBBBBBBBYJZZZZZRRREEEEEEEEEGGEEEDDDJJJJJJJJJ
RAAARRRYYYYYYYPPPOPOOOOOOOOOYYYYWYWPWWWWSVVVVVVVQQQQQQQQHHHHHHNIIIIIIQQQIQQQQQJJJYYYYYYDHHHHHHHHBBBBBBBBBJJJJZRRRRRREEEEEEEGGEEEKKDKJJJJJJJJ
RRRRRMRYYYYYYUPPPPPOOOOOOOOXXXYYYYYPPWWWPPVVVVVVVVQQQHHHHHHHNHNIIIIIIIIIIQQJJJJJJYYYYYYYYHHYHHHHHBBBBBBJBJJJJZRRREEEEEEEEEEGGEEEKKKKJJJJJJJJ
RRRMMMYYYYYYYPPPPAPOOOOOOHXXXXYXYYYPPWPPPPVVVVVVVQHHHHCHHHHNNNNNNIIIIIIVJJJJJJJJJYYYYYYYYYYYYHHHHHHJJJJJJJJJJRRRRREXEEEEEEGGGGGGKKKKJJJJJJEG
RRRMMMMYYYYYYPPPPOOOOOOOOXXXXXXXXXPPPPPPPPPVVVVVVVVVHHHHHHBNNNNNNNIIIIIVJJJJJJJJJYYYYYYYYYYAYAAHHAAAJJJJJJJJJEERRREEEEGGGGGGGGGGRRKKKJJJEJEE
RRRMMMMMMYYYMMMPPOOOOOOBBXXXXXXNPPPPPPPPPPPVVVVVVDPPPHHHHHNNNNNNNNIIIIIVJJJJJJJJJYYYYYYYYYYAYAAHHAAJJJJJJJJEJXEERRRREGGGGGGGGGGGRRKKGGEJEEEE
RRMMMMMMYYMMMMMPMMOOOOWWXXXXXXXXKKKKKPGPPPPPPPPPPPPPPPPHHHENENNNNNIIIIIJJJJJJJJJJYYYYYYYYYAAAAAAAAAJJJJJJJEEEEEERRRRRRTGGGGGGGGGGRGGGEEEEEEE
RRMMMMMMMMMMMMMMMMMWWWWXXXXXXXXXKKKKKGGPPPPPPPPPPPPPPPPPHHEEEEENNNIIIIIJJJJJJJJJJJYYYYYYYYAAAAAAAAAJJJJJJEEEEEEEEERRRRTGZGGGGGGGGGGGGGEEEEEE
RRRMMMMMMMMMMMMMMMWWWWWXXXXXXGGGGKGUUUGGGYPPPPPPPPPPPPPPPPEEEEEEEEIIIIIJJJJJJJJJJJYYYYYYYYYAAAAAAAAJJJJJJJJEEEEEEERRRRTGGGGGGGGGGGGGGGEEEEEE
RRRMMMMMMMMMMMMMWWWWWWWWGGGGXGGGKKGGGGGYYYYPPPPPPPPPPPPPPPPPCCEEIIIIIJOJJJJJJJJJJJYYYYYYYYYAAAAAAJJJJJJJJJJEEEEEERRRRRTTGGGGGGGGGGGGGGEEEEEE
RRRRRMMMMMMMMMMMMMWWWWWWGGGGGGGKKKGGGGGYYYYPPPPPMPPPPPPPCPPCCXXXXXXJJJJJJJJJJJJJJJYYYYYYYYYAAAAAAJJJJJJJJJJJEEEEETTRRTTTTGGGGGGGGGGGGGEEEEEE
RRRRRMTMMMMMMLWWWWWWWWWWWWGGGGKKGGGGGGGGYPPPPPPPMPPPPPPPCCCCCCXXXXXXXXJJJJJJJJJJJQYYYYYYYYYAAAAAAAJJJJJJJJJJEEEETTTRTTTTTTTGGGGGGGGGGEEEEEEE
RRRYYMTTMMMMLLWWWWWWWWWWWWWAGGGGGGGGGGGGYGPPPPPPMMPPPPPPCCCCCCCXXXXXXXXJJJJJJJJJJJJYYYYYYYAAAAAAJAJJJJJQQQEEEETTTTTTTTTTTIIIGGNGGGGGGEEEEEEE
RRRYYMTTMMMMLLLLLWWWWWWWWWWAAAAGGGGGGGGGGGGPPPMMMAAAAPPCCCCCCXXXXXXXXXXXXXJJJJJJJYYYYYLLLLLAAAAAJJJJJJJJQQEEQETTTTTTTTTIIIIIINNGNGGGPEEEEEEE
YYYYYYJTMMJMLLLLLLLWWWWWWWAAAAAAAGGGGGGGGGLMMMMMMAMAAPCCCDCCCCCDDDXXXXXXXXXJXXXJJYYYYYLLLLLLLANNNJNNJJJQQQQQQTTTTTTTTIIIIIIIINNNNNGGEEEEEEEE
YYYYYYJTJJJLLLLLLLLWWWWWWZAAAAAAAGGGGGGGGLLLLMMMMMMAAPCCCDDCCCDDDDDDXXXXXXXXXXXWHHYHYLLLLLLLLLLLNNNNNJJQQQQQQTTTTTTCIIIIIIIIINNNNNNNEEEEEERE
YYYYYYJJJJJLJJLLLLWWWWWWWAAAAAAAAAGGGGGGGLLMMMMMMMMCCCCCDDDDDDDDDDDMDXXXXXXXXXXXHHHHLLLLLLLLLLLLNNNNNNNQQQQQQQTCCCCCIGIIIIIIICCCCNEEEEEERRRR
YYKKYYJJJJJJJJLLLLLWWWWJWAAAAAAAAGGGGGGGGLLMMMMMMMMXXXXDDDFDDDDDDDDDDXXXXXXXXXXHHHHHLLLLLSSLLLLLLLNNNNNQQQQQQQQQQCCCCCIIIIIIICCCCNNNEEEERRRR
YYKKKYJJJJJLLLLLLLLLWWWLQAAAAAAZZZZZZZZGLLMMMMMMMMMMXXXDDDDDDDDDDDDDXXXXXXXXXXXHHHHHLSSSSSSSSLLLLNNNNNQQQQQQQQQQQCCCCCIIIIIIIICCCNNNNERRCRRR
YYKKKJJJJJJLLLLLLLLLWWLLLAEAAAAZZZZZZZZMMMMMMMMMMMMMMMXDDDDDDDDDDDDDXXXXXZXXXXXTHHHLLLSSSSSSSSSSLLLLQQQQQQQQQQQQXXXCCCIIIIIIIICCCNNNNNRRRRRR
YYKKKJJJJJJJLLLLLLLLLLLLLEEAAAAZZZZZZZZZTMTMMMMMMMMXXXXXDDDDDDDDDDDZXXXEZZVXXXOTTHHHLLSSSSSSSSSLLLLLLQQQQQQQQQOQXXXXXCCCCCICCCCCCCNRRRRRRRRR
KKKKKJJJJJJJLLLLLLLLLLLLEEEEEAAZZZZZZZZZTTTTMMMMMMMMTTXXXDDDDDDDDDDZXXEEZZXXSSTTTTSHLLSSSSSSSSSSLLUULQQEEQEEQQQXXXXXCCCCCCCCCCCCCCNRRRRRRRRR
KKKKKKKJKJJJJLLLLLLLNMLLEEEECZZZZZZZZZZZTTTMMMMMTTTMTTXXXDDDDDDDDDZZZZZZZSSSSSSSTSSSSSSSSSSSSSLLLLUUUUUUEEEEEEEXXXXXXCCCCCCCCCCCCRRRRXRRRRRR
KKKKKKKKKJKKKKLLLLLLNNNNEEECCZZZZZZZZZZZTTTTTTTTTTTTTTTXXDDDDDDDDZZZZZZZZSSSSSSSSSSSMMSSISSSSLLKKKUUUUUUUUEEEXXXPPPPPCCCCCCCCCCZRRRRRRRRRRRR
KKKKKKKKKKKKKKLLLLLLLNNNNNNCCCZZZZZZZZZZZZZZZTTTTTTTTTGXXXDDDVVZZZZZZZZSSSSSSSSSSSSSSMSSZZZZZZZKKUUUUUUUUEEEEXXXPPPPPCCCCZCZZZZZDDDRRRRRRRRR
KKKKKKKKKKKKKKLLLLLNNNNNNNNNCCZZZZZZZZZZZZZZZXTTTGTTGGGGGXDDDVVZZZZZZZZSSSSZSSSSSSSSMMSMMZZZZZZKKDUUUUUUUPPPPPPPPPPPPCCCCZZZZZZTZZDRRRRRRRRR
KKMMMMMMMMMMKKKLLLNNNNNNNNNNCCZJJJZZZZZZZZZZZXXXXGGGGGGGGDDDDVVVZZZZZZZZZZZZZSSSSSSSMMMMMZZZZZZKUUUUUUUUEPPPPPPPPPPPPCCZZZZZZZZZZZDZRRRRRRRR
KKMMMMMMMMMMMMMMLNNNNNNNNNNNNCZJJJJJRRZZZZZZZXXXXFFGGGGGGGVVVVFVVFYZZZZZZZZZZSSSSSSSSSZZZZZZZZKKUUUUUUUUEPPPPPPPPPPPPXCCCZZZZZZZZPZZRRRYYRRR
KKMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNJJJJRZZZZZZZXXXXXGGGGGGGGVVVVFFFFZZZZZZZZZZZZSSSSSSSSKZZZZZZZZKKYUUUUPPPPPPPPPPPPPPPUKRKZZZZZZZZZZIZRMRRRRR
KKMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNJJJRRZZZZZZZXXXXGGGGGGGGGGVVVFFFFZZZZZZZZZZZSSSSSSSSSSZZZZZZZZYYYYYUUPPPPPPPPPUPPPPPUKKKZZZZZZZZZZZZQQORRRR
KMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNJJJRZZZZZZZXXXXGGGGGGGGGVVVVVFFFZZZZZZZZZHHHSSSSSSTSZZZZZZZZZZYYYUUEPPPPPPPPPUPPPPPKKKKKKZZZZZZZZQMQQORRRR
UMMMMMMMMMMMMMMMNLNNCNNNNNNNNNNNJJJVVRZZZZZZZZZZZZZGGGGGGVVVVVVFFTTJZZZZZZHHHHSSRRSTTZZZZZZZZZZZYYYYYEPPPPPPPPPUUUKKKKKKKKKZZZZZKKPPPPPPPPRR
UMMMMMMMMMMMMMMMLLLLCNNNNNNNNNNNRRRRRRZZZZZZZZZZZZZGGGGGGGGVVVVVVVTZZZZZZZZHHHSHRRRZZJZZZZZZZSZYYYYYYYPPPPPPPPPKUKKKKKKKKKKNNNNOOOPPPPPPPPRR
UMMMMMMMMMMMMMMMLLCCCCCCNNNNNNPPPRRRRRZZZZZZZZZZZZZGGGGGGGGGVVFVVVTTZZZZTTTEEHHHHZZZZZZZZZZZZSYYYYYYYYYPPPBBBUUKKKKKKKKKKKNNNNNNOOPPPPPPPPRL
UMMMMMMMMMMMMMMMMLCCCCCGCCCNNPPPPPPPPRRRRVRVZZZZZZZGGGGGGGGGGGFFFFFTTZZTTEEEEEEHSSZZZZZZZZZZZZZYYYYYYYBPPPBBBKKKKKKKKKKKKKNOONNOOOPPPPPPPPQQ
UMMMMMMMMMMMMMMMMMCCCCCCCCCCNPLLLPPPPPRRVVRVZZZZZZZGGGGGGGGLGFFFFFFTTTZTEYEEEEEHHSZZZZZZZZZZZZZZZYYYYYBPPPBKKKKKKKKKKKKKKOOOOOOOOOPPPPPPPPQQ
UUMMMMMMMMMMMMMMMMCCCCCCDDCCULLLPPPPPPRUVVVVZZZZZZZGGGGGGGGGGFFFFFTTTTTTEEEEEEEEEEZZZZZZZZZZZZZSYYYYYYYPPPBBBKKKKKKKKKKKKOOOOOOOOOPPPPPPPPPQ
UUUMMMMMMMMMMMMMMMMCCCCCCCCCUULLLPPPVVVVVVVVZZZZZZZGGGEEEEYYGFFFFFTTTTEEEEEEEEEEEEZZZZZZZZZZZZZYYYYYYYBPPPBBBKYKKKKKKKKKKOOOOOOWWWPPPPPPPPPQ
UUUUMMMMMMMMMMGGGGMCCCCCCCCUULLLLLLPVVVVVVVVZZZZZZZGGEEEEEEEEFFFFFTTTTTEEEEEEEEEEEEEZZZZZZZZZZZWYYYYYYYPPPBBBBKKKKKKKKKKKFOOOOOWWWPPPPPPPPPQ
GGUGMMMMZZMMMMGGGGTCCCCCCCCCUULLLLPPVVVVVVVVVFHHGGGTEEEEEEEEFFFFFFFFFTTTEEEEEEEEEEEEEZZZZZZZZZYYYMYYYYYPPPBBBBBBBKKKKFFFFFOOOOOWWWWWLLPPPPPF
GGGGGMMZZZZZZZGGGGTTCCCCCCUUUULLLLPPRVVVVVVVFFHHGGGEEEEEEEEEFFFFFFFFTTTTEEEEEEEEEEEEEZZZZZZZZZCYYYYYYYYYBBBBBBBBBKKKKKFFFKOOOOWWWWWWMMPPPPPF
UGGGGDDZZZZZZMGGGGTTEECCCCUUULLLLLLPPZVVVVVVFFFFEGGEEEEEEEEEFFFFFFUYUETTEUEEEEEEEEEEEEZZZZZZZZCCCCYYYYYYBBBBBBBFBBBKFFFFFKKOOKWWPPPPPPPPPPFF
GGGGGGGGGGGGGGGGGGTEEEEECCCUULLLLLZZZZZFFVFFFFFFEEEEEEEEEEEEFFFFFUUUUEEEEEEEEEEEEEEEEEEEZZZZCCCYYYYYYYYYBYYBBBFFFBBKFFFKKKPPPPPPPPPPPPPPPPFF
GGGGGGGGGGGGGGGGGGTPEPECCCUUUUUULZZZZZZFFFFFFFFFEFEEEEEEEEEEEFFFFFUUUEZEEEEEEEEEEEEEEEEEEZZCCCYYYYYYYYYYYYYYQFFFFKKKFFFFFKPPPPPPPPPPPPPPPPFF
GGGGGGGGGGGGGGGTTTTPPPPPUUUUUULLLLZZZZZFFFFFFFFFFFEEEEEEEEEEEFFFFFFUUUZEEELEEEEEEEEEEEEEEECCCCYYYYYYYYYYYYYYQQFFFFFKFFFKKKPPPPPPPPPPPPPPPSSF
ZGGGGGGGGGGGGGGTTTKPPPPPQUUULLLLLLLLLLLILFFFFFFFFFFFFEEEEEEEEFFFFFFFUUUUUUUTEEEEEEEEEEEEEEECVCCYYYYYYYYYYYYYQFFFFFFFFFFFFKPPPPPPPPWWWWWWWWSS
GGGGGGGGGGGGGGGTTKTPPPPQQQUQBBLLLLLLLLLLLFFFFFFFFFFFFEEEEEEEBHFFFFYYUUUUUUUTEEBBBBBBBBBEEEECVCCYYYYYYYYYYYYQQQFFFFFFFFFFFKPPPPPPPPWWWWWWWWSS
GGGGGGGGGGGGGGGTTTTQQQPQQQQQQQJJLLLLLLLLFFFFFFFFFFFFEEEEEEEEHHHFXFUUUUUUUUUTEEBBBBBBBBBEECCCVCCYYYYYYYYYYYYYQQQQFFFFFFFFFFPPPPPPPPWWWWWWWWSS
GGGGGGGGGGGGGGGTTTTQQQQQQQQFFLLLLLLLLLLLLFFFFFFFIFYYPPEEEHHHHHHHUUUUUUUUUUUEEEBBBBBBBBBEEEVVVCCYYYYYYYYYYYYYQQQFFFFFFFFFFFPPPPPPPPWWWWWWSSSS
GGGGGGGGGGGGGGGTTTTQQQQQQQQQFLGLLLLLLLLLLFFFFFFFCFYCPPEHHHHHHHHDUUUUUUUUUUUUUEBBBBBBBBBEEEVVVCYYYYYYYYYYYYYYYFFFFFFFFFFFFFPPPPPPPPWWWWWWSSSS
GGGGGGGGGGGGGGGTTTTQQQQQQQQFFLLLLLLLLLLHFFFFFCCCCCCCPPPPPPHHPZZDDUUUUBBBBBBBBBBBBBBBBBBEEETEVVVVVVVYVYYYYYKKKKKFFFFFFFFFFFPPPPPPPPWWWWWWSSSB
GGGGGGGGGTTTTTPTTTTTTQQQQQQQQELLLLLLLLLHHCFFFCCCCCCCPPPPPHHHPPZDDDDUUBBBBBBBBBBBBBBBBBBEEEEEEVVVVVVVVVYYKKKKYKKKFFFFFFFFFFFFMMWWWWWWWWWWDSSB
AAAAGGGGGSXTTTPTHHHHHQQQQQQQEEEELLLLLLLHCCCCCCCCCCCCPPPPPPPHPTDDDDDUABBBBBBBBBBBBBBBBBBEEEEEEVVVVVVVVVYYYKKKYYKKKFFFFFFFFFMMMMWWWWWWWWWWDDSB
AAAAGGGGGSXTDDSAHUHHHQQQQQEEEEEEELLLZZLHCCCCCCCCCHHPPPPPPPPPPDDDDDDDDBBBBBBBBBBBBBBBBBBBBBBVVVVVVVVVVVVYYKKKYOYKKFFFFFFMMMMMMMWWWWWWWWWWDDSB
AAAAAASSSSSSSSSHHHHHHHHQQQEEEEEEELLLZZZCCCCCCCCCCHHPPPPPPPPPDDDDDDDDDBBBBBBBBBBBBBBBBBBBBBBVVVVVVVVVVVVYYKKYYYYKFFFJQFFQNNNNMMWWWWMWWWWWMDSB
AAAAAASSSSSSSSSHHHHHHHQQQQEEEEEENNZZZZZCCCCCCCCCHHHHHPPPPPPPDDDDDDDDDBBBBBBBBBBBBBBBBBBBBBBNVVVVVVVVVVVYYYYYYYKKKKJJQQQQNNNNMMWWWWMMMMMMMMBB
AAAAAASSSSSSSSSSHHKKHKKQQEEEEEENNNNZZZZCCCCCCCCHHHHHPPPPPPPPDDDDDDDDDBBBBBBBBBBBBBBBBBBBBBBBVVVVVVVVVVVYYYYYYYYYYKJJJJJNNNNNNRWWWWMMMMMMMBBB
AAAAAASSSSSSSSSSHHKKKKKQQQEEERRNNNNZZZZZCCCCCCCCHPPPPPPPPPDDDDDDDDDDDBBBBBBBBBBBBBBBBBBBBBBBBVVVVVVVVVVYHYYYYYYYFJJJJJJNNNNRRRWWWWMMMMMMMBBB
AAAAASSSSSSSSSSSXHKKRRQQQQEEEERRNZZZZZLZZZKKKCCPPPPPPPPPPPPPOODDDDDDDDDDDGGGTTBBBBBBBBZZZBBBBBVVVVVVAAAAAAYYYYVYJJJJJJJNNJNRCCWWWWMMMMMMMBBB
AAAAASSSSSSSSSSSRRRRRRRBQEERRRRZZZZZLLLZZLKKKKPPPPPPPPPPAAAYAODDDDDDDDDDDGGGTTBBBBBBBBBBBBBBBBVVVVVVAAAAAAYYYYYJJJJJJJJJJJJCCTWWWWMMMMMMMBBB
ALAVVSSSSSSJSSSSRRRRRRRRARRRRRRRZZZZZZLLLLKKKKPPPPPPPPAAARAAADDDDDDDDDDDDDGGTTBBBJJBBBBBBBBBVVVVVVVAAAAAAAAYYYYJJJJJJJJJJCCCCCWWWWMMMMMMMMBB
VVAVVVVSSSVSSSSSZRRRRRRRRRRRRRZZZZZZZLLKLLKKKKKKPPKPPPAAAAAAAADDDDDDDDDDGGGGTTBBBAABBBBBBBBBVVVAAAAAAAAAAAAYJJJJJJJJJJJJJCCCCCWWWWMMMMMCMCCC
VVVVVVVVVVVVSVOSRRRRRRRRRRRRRZZZZZZZZEGKKKKKKKKKKKKPAAAAAAAAAADDDDDDDDDDGGGTTTGAAAABBBBBBBBBVXVZAAAAAAAAJJJJJJJJJJJJJJGJJVCCCCWWWWMMMMCCCCCC
ZZVVVVVVVVVVVVOOORRRRRRRRRREEEEEEEZZEEKKKKKKKKKKKPPPEAAAAAAAAACCDDDDDDDDGGTTTTAAAAAABBBBBBBIIAAAAAAAAAJJJJJJJJJJJJJJJJGGGGCCCCCCCCCMMCCCCCCC
ZZZVVVVVVVVVVVZZZRRRRRRRREREEWEEEEEEEEEKKKKKKKKKKPPPEAAAAAAAACCCAADDDDDGGGTTTTAAAAAABBBBBBBIIIITAAHHHAAJJJJJJJJJJJJJGJGGGGGCCCCCCCCCCCCCCCCC
ZZZVVVAAVVVVVZZZZRRRRRRRREEEEWEEEEEEEEEKKKKKKKKKFPPPEEEEEEAACCCCUUZZZDDQQQTTTAAQQQQQABDBBBBIITTTAHHHAAAJJJJJJJJJJLGGGGGGGGGGGGCCCCCCCCCCCCCC
ZZZZVVAAAVZVZZZZZZERRTRREEEEEEEEEEEEEEEKKKKKPPPFFPPPEBEEEECCCCCUUUZZZZQQQTTTTQQQQQQQABBBHBJTTTBTTHHHHHHHJJJJJJJJLLGFGGGGGGGGGGCCCCCCCCCCCCCC
ZZZZVZGGZZZZZZZZZZZZTTRRREEEEEEEEEEEEEEKKKKPPPPPFPPPPBKEEECCCUCCUUZZZZQQQQQQQQQQQQQQAUUUWWWTTTTTGHAHXXHJVCJVVJJLLLLGGGGGGGGGGGGGGGCCCCCCCCCC
ZZZZZZZGZZZZZZZZZZZQQTTTREEEEEEEEEEEEEEEKKPPPPPPPPPPPBKCECCCCUCCUUZZZZQQQQQQQQQQQQQQQQUUUJWWWTTTHHHHHHHHVCVVVVVLLVLVGGGGGGGGGGGGPGCCCCCCCCCC
ZZZZZZZGZZZZZZZZZZZZQTTTQEEEEEEEEEEEEEEEPPPPPPPPPPPPPBKCCCCCUUUUUUZZZZQQQQQQQQQQQQQQQQUUWWWWWTTTHHHHHHHHVVVVVVVVVVVVGGGGGGGGGGRRRCCCRCCRCCYC
ZZZZZZZZZZZZZZZZZZZQQTQQQQEEQEEEEEEEEEEEEPMPPPPPPOOPPKKCCUUUUUUUUUQQQQQQQQQQQQQQQQQQQQUUUWWWMMTTTMMHHHHHVVVVVVVVVVGGGGGGGGGGGRRRRRCCRCRRCCYF
ZZZZZZZZZZZZZZZZZZQQQQQQQQQQQEEEEEEEEEEEEPPPPPPPPOOKKKKCCURBRRUUUQQQQQQQQQQQQQQQQQQQQQUUWWWMMMMMMMMHHHHVVVVVVVVVVVGGGGGGGGGGGGGGRRRRRRRRYCYY
ZZZZZZZZZZZZZZZZQQQQQQQQQQQQEEEEEBDEEEEEEDPPPDDPKKKKKKKKCRRRRIRUUCQQQQQQQQQQQQQQQQQUUUUUWWMMMMMMMMMMHHHXXVVVVVVVVVGGGGGGGGGGGGGGRRRRRRRYYYYY
ZZZZZZZZZZZZZVVZQMMMQQMYQQQQEEEEEEDDEEEEEDPDDDDDKKKKKKCCCRRRRRRURCQQQQQQQQQQQQQQQQQUUUUUWWMMMMMMBBBBBHBXXVVXVUUKKKKGGGGGGGGGGGGGGRRRRRRRYYYY
ZZZZZZZZZZZZMMVMMMMMMMMYYQYYHHEEDDEEEEEEEDDDDDDDKKKKKKKKCCRRRRRRRCCQQBOOQQQQQQQQQQQUUUUUUUUUMMBBBBBBBBBXXXXXXUUUUKGGGGFFGGGGGGGRRRRRRYYYYYYY
ZZZZZZZZZZZWMMVMMMMMMMYYYYYYYHHHHHEEEEEDDDDDDDIDKKKKKKKKKCRRRRRRCCCQBBBBBBBBQQQQQQQQUUUBUUUMMBBBBBBBBBBXXXXXUUUUUULUFGFFGGGGGGGRFRYYYYYYYYYY
ZZZZZZZZZZZWMMMMMMMMMYYYYYYYYHHHHDEEEEEDDDDDDDKKKKKKKKKKKCCCCRCRCCCIVBBBBBBBQQQQQQUUUUUBBBMMMMBBBBBBBBBXXXXUUUUUUUUUUFFFFGGGFGFFFFFYYYYYYYYY
ZZZZZZZZMMMMMMMMMMMMMYYYYYYYHHHHHDDDDDDDDDDDDDKKKKKKKKKCCCCCCRRRCCCIBBBBBBQQQQQQQQUUVNNNBBBMMMBBBBBBBBBXXXXUUUUUUUUUUFFFFFFFFFFFFFFYYYYYYYYY
ZZZZZZZZZMMMMMMMMMMMYYYYYYYYHHHHYYKDDDKKDDDDDDKKKKKKGGKCCCCCCCCCCCCIIBBBBBBQQQQQOGUUVNNNBBBBNNBBBBBBBBBBXXXUUUUUUUUUUFFFFFHHHHFFFFYYYYYYYYYY
ZZZZZZZZZMMMMMMMMMYYYYYYYYYYYYYYYYKDKDKDDDDDKDKKKKKKGGGGCCCCCCCCCCIIBBBBBBBBQQQOOOOONNNNBNNBNNNNBBBBBBBXXXUUUUUUUUUUUFFFFHHHHFFHHFHYYYYYYYYY
ZZZZZZZZZMMMMMMMMYYYYYYYYYYYYKKKKKKKKKKDDDDKKKKKKGGKGGGGGCCCCCCIIIIIBBBBBBBBQQQQOOOENNNNNNNNNNNNBBBBTTBXXXUUUUUUUUUUUFFFFFFHHHFHHHHBYYYYYYYY
ZZZZZZZZZMMMMMMMMYCYYYYYYYYYYYYKKKKKKKKKKKKKKGKKGJGGGGGGGGGGCCCOIIIBBBBBBBBBBKQOOOOOONNNNNNNNNNZBBBBBTTTTTUUUUUUUUUUFFFFFFHHHHHHHHHYYYYYYYYY
ZZZZZZZZMMMMMMMMYYYYYYYYYYYBYBBWWWKKKKKKKKKKKGGGGGJGGGGGGGGGGCOOOBBBBBBBBBBBKKKOOOOOONNNNNNNNNNNBBTTTTTTTTAUUUUUUUUUFFFFFFHHHHHHHHHHHYYYYYYY
ZZZZZZZZOOOMZMMZZZYYYYYYYYBBBBBWWWWKKQKQKKKKGGGGGGGGGGGGGGGGGCOOBBBBBBBBBBBKKKOOOOOOONNNNNNNNNNNBBTTTTTTTAAUUUUUUUUFFFFFFFFFHHHHHHHHHYYYYYYY
ZZMZMZZOOOOOZMMZZZYYYYYYYYYBBBBWBWWKQQQQQKKKGGGGGGGGGGGGGGFGFFFOOOOBOOBBBBBBKOOOOOOOONNNNNNNNNNNNBBBTTTTTTTUUUUUUUFFFFFFFFFFFFHHHHHHHYYYYYYY
ZLMMMOOOOOOOZZZZZYYYYZYYYYYBBBBBBBWKKKQQQQKKKKGGGGGGGGGGGGFFFFFFOOOOOOOBKKKKKOOOOOOYYNNNNNNNNNNNNNNNTTTTTVTTOFFFFUFFFFFFFFFFFHHHHHZZZZYYYYYY
MMMMMOMMOOOOBZZZZZYYZZYZBBBBBBBJBHWHQQQQTTTKKKKGGGGGGGGGGFFFFFFFOOOOOOOBKKKKKOOOOGOXYYNNNNNNNNNNOEOOTTTTTTOOOOFFFFFFFFFFFVVFFFHZZZZZZZYZYYYY
MMMMMMMMOOOOBZZZZZZYZZZZZZZBBBJJJHWHQQQQTTTTTGGGGGFFFGGGFFFFFOOOOOOOOOOOHHHHHGGGOGGXYYYNNNNNNPPPOOOOOOTOOOOOOOFFWWWWFFFFFFVVVZZZZZZZZZYZYYYY
MMMMMMMMOOOOBZZZZZZZZZZZZZZBJJJJJHHHHQQTTTTTTTDGGFFFFFFFFFFFFOOOOOOOOOOHHHHHGGXGGGGXXYYNNNNNPPPPPPOOOOOOOOOOOFFWWWWFFFFFVVVVVZZZZZZZZZZZZYYY
MMMMMMMOOOOBBZZZZZZZZZZZZZZZJJJJJHHHHHTTTTTTTTDDDDFFFFFFFFFPPFOOOOOOOOOHHHKKXXXXXXXXXXNNNNNNPPPPPPOOOOOOOOOIOOOOWWWWWWFFFVVVVZZZZZZZZZZZZYYZ
MMMMMMOOOBBBBZZZZZZZZZZZZZJJJJJJJHHHHTTTDTTTTDDDDDFFFFFFHFFFFFOOOOOYOOHHHHHXXXXXXXXXCXXNGGNPPPPPPPOOOOOOOOIIIWWWWWWWWWWWFVVVVZZZZZZZZZZZZZZZ
MMMMMMOOBBBBBBZZZZZZZZZZZZZZJJJJJJJJHHHTDTTTTDDDDDFFFFFFFFFFFOOOOOOYYHHHHHXXXXXXXXXXXTUUUUNPPPNPPOOOOOOOOOOIWWWWWWWWWWWWWWWZZZZZZZZZZZZZZZZZ
MMMMMMMOOBBBBBBBZZZDDDZZZJJJJJJJJJJJHHHDDTTTTDDDDDFFFFFFFFFFFOOOOOYYYHHHHHHHXXXXXXXXXTUUUNNNNNNNOOOOOOOOFFRRWWWWWWWWWWWWWRRRZZZTZZZZZZZZPZZZ
MMMMMMMBBBBBBBBBZZZZDDDDJJJJJJJJHHJHHHHDDDDDDDDDDDFKFFFFFFLFFFOOOOYYYYHHHHHHXXXXXXXXXXUUUNNNNNNNNOOFFFFFFRRRRRWWWWWWWWWWWWWRRZZTZZZZZZZZPZPP
MMMMMMMMMBBBBBZZZZZDDDDDDDEJJJJJHHHHHHHDHDDDDDDDDFFKFFFFFFFFFOOOOOOYYYYHHHHHCXXXXXXXXUUNNNNNNNNNNNNFFFFFFRRRRRWWWWWWWWWWRWWRZZTTZZIPPZZPPPPP
MMMMMMMMBBBBBBZZZZDDDDDDDDDJJJJJHHHHHHHHHDDDDDDDDFFFFFFFFFFFOOOOOODDYYYYHHHHCCXXXXXXXUUUUNNNNNNNNNNFFFFFFSRRRRRWWWWWWWWRRRRRZZZZZPIPPPPPPPPP
NMMMNMNMBBBBBBBZZZZZDDDDDDDHJHHHHHHHHHHHRHDDDDDLFFFFFFFFFFFFOOOOODDDYYYYHYYYYXXXXXXXXXUUUNNNNNNNNNNNFFFFSSSSRRWWWWWWWWWRRRRRZZZZPPIPPPPPPPPP
NNNMNMNNBBBBBBBBZZZZPDDDDDDHHHHHHHHHHHHHHHLLLLLLLZFFFFFFFFFFOOOOODYYYYYYYYYYYYXXXXXXXXUUUUNNNNNNNNNFFFFFSSSSSSKKWWWWWWWRRRRRZZZZPPPPPPPPPPPP
NNNNNNNNNBBBBBBBZZZZZDDDDDDHHHHOHHHHHHHHHHHLLLLLLZZFFFFFFFFFFOOYYYYYYYYYYYYYYYYXXXXXXUUUUUNNTNNNNNFFFFFFFSSSSSSWWBWWWWWWZRZZZZZZZZPPPPPPPPPP
NNNNNNNNNBBBBBBBBZZZZZDDDDDHHHOOOOHHHHHHHHHHHLLLFFFFFFFFFFFFFOOYYYYYYYYYYYYYYYYXXUJXXUUUUUUNNNNWWFFFFFFSSSSSSSSSSWWWWWWWZZZZZZZZZZPPPPPPPPPP
NNNNNNNNBBBBBBBUUUZZZZDDDDHHHOOOOOHHHHHHHHHHHHHHHHFFFLFFOOOOOOOOOYYYYYYYBOYYYYYYYUUXUUUUUUUNNWWWFFFFFFFFFSSSSSSSSSSWWWZWZZZZZZZZZZZPPPPPPPPP
NNNNNNNNNBBBBBBBKUKRKKKDDHHHHHOOOOHHHHHHHHHHHHHHHHHFFFFFOOOOOOOOOOOZYYRYOOOYYYYYYUUUUUUUUUUUUUWWWFFFFFFFSSSSSSSSSSWWWZZZZZZZZZZZZZZZPPPPPPPP
NNNNNNNNYBBJBBXXKKKRKKPPPHHHHHHOOOOOHHHHHHHHHHHHHHIFFFFFOOOOOOOOZZOZYYLLOOOOOOYOUUUUUUUUUUUUUUWFFFFFFGGQQSSSSSSSSSSSWZZZZZZZZZZZZZZPPPPPPPPP
NNNNNNXBBBBBXXXKKKKRKKPPHHHHHHHOOOOOHHHHHHHHHHHFFFFFFFFFKOOOOOZOZZZZZZLLLLOOOOOOCUUUUUUUUUUUUUWWWVFFFFGGGSSSSSSSSSSSSSSZZZZZZZZNNNBPPPPNPPPP
NNNNNNBBBBBXXKXKKKKKKKKHHSHHHHOOOOOOHHHHHHHHHHHHHHFFFFZKKOKKZZZZZZZZZLLLLOOOOOOOCUUKUUUKUUUXVUWVVVVGGGGGGGGSSSSSSSSSSSSZZZZZZZZZNBBBPNNNNPPP
NNNNNTTTBBBXXKKKKKKKKKSHHSHHHHHOOOOOOOHHHHHHHHHHHHFFFFZKKKKKZZZZZZZZZZLLLLLOOOOOOOKKUKKKUUVVVVVYVVVYGGGGGGGGSSSSSSSSSSSSZZZZZZZZNNNBPNNNSPPP
NNNNNTTTTMBXKKKKKKKKKKSHSSSHHHHOOOOOOOHHHHHHHHHHHHHFZZZKKKKEEEZZZZZLLLLLLLLOOOOOKKKKUKKZUVVVVVVVVVVYGGGGGGSSSSSSSSSSSGGGGGGZZZZZNNNNGNNNNPNN
NTTNTTTTTTBXKKKKKKKKKKKKSSSHHHXOOOOOOPFFHHFHHFHHHHHZZXZZKKKEEEEEZPUULLLLLLLOOOOOZKKKKKZZCVVVVVVVVVVGGGGGGSSSSSSSSSSSSGGGGGGZGZZZNNNNNNNNNNNN
TTTNTTTTTTTTKNKKKKKKKKKKKKKVPHPFFOOOPPFFHHFFHFHHHHZZZXXXEEEEEEEEPPPUULLLLLOOOOOOZZKKZZZZZQVVVVVVVVVMGGGGGGMMMMSSSSSSSGGGGGGGGGZNNNNNNNNNNNNN
TTTTTTTTTTTITTTKKKKKKKKKKKKVPPPPPPPPPPFFFFFFHFFFFFXXXXEEEEEEEEPPPPPLLLLLLLLOPOCCZZKZPZZZZVVVVVVVVVVMMGGGGGMMMMSSSSGSSGGGGGGGGGZNNNNNNNNNNNNN
TTTTTTTTTTTTTEEEKKKKKKKKKKKPPPPPPPPPPPPFFFFFFFFFFFXXXXXXEEEEEPPJPPPLPPLLPPPPPPCZZZZZZZZZZVVVVVVVVVVMMMGGMMMMMSSGSSGGGGGGGGGGNZZZUNNNNNNNNNNN
TTTTTTTTTTTTTFEEEKKKKKKKKKKPPPPPPPPPPPPFFFFFFFFFFXXXXXXXXEEEXPPPPPPLPPPLPPPVPCCPZZZZZZZZZZVVVVVVVVVVMMGGMMMMMGGGGGGGGGGGGGGGNNNUUNNNNSNNNNNN
TTTTTTTTTTTTFFFEEFKKKKKHKKKPPPPPPPPPPPPFPPFFFFFFFXXXXXXXXEXXXOOPPPPPPPPPPPPPPPPPZZZZZZZZZZZVVVVVVMMVMMMMMMMGGGGGGGGGGGGGGGGGNNNNNNNSSSSNNNNN
TTTTTTTTTTTTTFFFFFZKKKWLLLKGPPPPPPPPPPPPPFFFFFFXXXXXXXXXXXKXXXPPPPPPPPPPPPPPPPPPZZZZZZZZZZZZVVVMMMMMMMMMMMMGGGGGGGGGGGGGGGGGGNNNNNNNSMSSNNNV
TTTTTTTTTTTFFFFFFFFFFFLLLLPPPPPPPPPPPPPFFFFFFFFFXXXXXXXXXXXXXXXPPPPPPPPPPPPPPPPPZZZZZZVZZZZZZZVMMMMMMMMFMMGGGGGGGGGGGGGGGGGGGNNNNNNNNMNSNVVV
TTTTTTTTKKKKFFFFFFFFFFLLLLLLZPPPPPPPPPPFFFFFFFFFXXXXXXXFXXSSSXPPPPPPPPPPPPPPPPPPZZZZZVVVZVZZZMMMMMMMMMFFFFFGGGGGGGGGGVGVVVVVGNNNNNNNMMNNNNNV
TTTTTTTKKKKKKFFFFFFFFFLLLLLLZZYYPPPPPPPPFFFFFRRFXXXXXXFFXXSSSSPPPPPPPPHPPPPPPPZZZZZZZQVVVVVVZMMMMMMMMMFFFFFGGGGGGGGVVVVVVVVNNYNNNNNYSSSSSSNS
TTTBBBBBKKKKFFFFFFFFFFFLLLLLLLYYYPQQPYPPFFFFRRRRRXXXXXFFFTTSSSPPPPPHHHHHPHPPJJJBLBBBVVVVVVVVMMMMMMMMMMFFFFFFGGGGGGNNVVVVVVVNYYYYYYYYSSSSSSSS
TTBBBBBBBBKFFFFFFFFFFFLLLLLLLYYYYYQYYYYFFFFFFRRRRXXXXXXXFTTTTDDDDHHHHHHHHHHHHJJBBBBBVVVVVVVVVMMMMMMMKFFFFFFFFGGGGGNNVZZVVVNNYYYYYYYSSSSSSSSS
BBBBBBBBBYKFFFFFFFFFFFLLLLLLYYYYYYYYYYFFFFRRRRRRRRRXXXXFFFTTDDDDDHHHHHHHHHHHHHBBDKBBVVVVVVVVMMMMMMKKKFFFFFFFFFFGFGNNNVVVVVNNYYYYYYSSSSSSSSSS
BSBSSSSUYYKFFFFFFFFFFLLVVVVYYYYYYYYYYYFFFFFRRRRRRRRRRGXTTTTTTDDDDIHHHHHHHHHHDDDDDKKKVVVVVVVVMMMMMKKKKKKTFFFFFFFFFNNNNVVVVVNTTRYPYYSSSSSSSSSS
SSSSSSSSYYYYYYFFFFFFFVLVVVVVVYYYYYYYYYYFFFFRRRRRRRRRRRTTTTTTTTDDDDDHHHHHHHHHHDDDKKKKVVVVVVVVVVMMMMKKKTTTFFFFFFFFFFNNNNNVVVNNTRYYYSSSSSSSSSSS
SSSSSSSUUYYYYYFFFFFHVVVVVVVVVVYYYYYYFFFFFFRRRRRRRRRRRRRTTTTTTTDDDDDDHHHHHHHHQHKKKKKKVVVVVVVSSMMMMMMEEETMFMVVYXFAAFNNNNNNVNNNTTTTYSSSSSSSSSSS
SSYSSSUUUYYYYYWFFFFVVVVVVVVVVYYYYYYYFFFRRRRRRRRRRRRRRRRTTTTTTTDDDDDDDDDDHHHHHHKKKKKKKVVVVVSSSMMMMMMEEEMMMMYYYYFAAAYNNNNNNNTNTTTTSSSSSSSSSSSS
SSSSSSSSUYYYYNSFFFFVVVVVVVYYYYYYYYYYKFFRRRRRRRRRRRRRRRTTTTTTTDDDDDDDDDDDHHHHHIKKKKKKIIIVVVSESMMMMMMEMMMMMMMYYYYYAAYNNNNNTTTTTTTTTSSSSSSSSSSS
SSSSSSCCYYYNNNSSSSSGGVVVVEEYYYYYYYYYKFFRRRRRRRRRRRRRRRTTTTTDDDDDDDDDDDDTHHHHHIKIKKIIIIIIIIEEMMMMMMEEEMMMMMMYYYYYYYYNYNNNTTTTTTTTYYSSSSSSSSSS
SSSSSSCCCCIIIIGGSSSGVVVVVVVYYYYYYYYYKFFIIRRRRRRRRRRRRRRRTTTTTDDDDDDDTTDTHHHAHIIIIIIIIIIIIIIEEMEEEEEEEMMMMLYYYYYYYYYYYYNNNTTTTTYTYXYMSSSSSSSS
SSSSTTCTCIIIIIIISSGGGVVVOOOOOYYYYYYYYIIIIIRRRRPRRRRRTRRRTTTTTDDDDDDDTTDTTHBAAIIIIIIIIIIIIIIEEEEEEEEEEEMMMMYYYYYYYYYYZZNNNTTTTTYYYXYMSSSSSSSS
TTTTTTTTTIIIIIIIIGGGGGVVVVYYYYYYYYYYYIIIIIRRRRRRRRRRRRRTTTTTTTDDDTDDDTTTTAAAAAIIIIIIIIIEEIEEEEEEEEEEEEMMMMMMMYYYYYYYZZZZZZZTTTYYYYYYYSSSQSSS
TTTTTTTTIIIIIIIIIGGGGGVVVVGGYYYYYYYYYIIIIHTRRRHRRRRRRRHTTTTTTTTTDTTTTTTTTTAAAAIIIIIIIIIEEEEEEEEEEEEEEEMMMMMYYYYYYYYYYZZZZZZTTTTYYYYYSSSSQSSS
TTTTTTTTIIIIIIIIIIIGGGGGGGGGGYYYYYYYIIIIIHRRRHHHRRRRRRHTTTTTTTTTTTTTTTTTTTAAIAIIIIIIIIIIEEEEEEEEEEEEEEMMMMMMYYYYYYYYYYTZZZTTTTTTTYYYYYSSSRSR
TTTTTTTTIIIIIIIGGGGGGGGGGGGGYYYYYYYYYIIIIHHHHHHHHHHHHHHHHHTTTTTTTTTTTTTTTAAAIIIIIIIIIIIEEEEEEEEEEEEEEEEEEEMYYYYYYYYYYYTXZZTTTTTTTTYBYRSRRRSR
TTTTTTTXIIRIRIIIGGGGGGGGGGGGYYYYYYEYIIIIIHHHHHHHHHHHHHHHHHHTTTTTTTTTTTTTAAAIIIIIIIIIIIEEEEEEEEEEEEEEEEEEEEMYYYYYYYYYTTTTTTTTTTTTTTBBYRRRRRRR

128
2024/day-12/solution-1.sh Normal file
View File

@ -0,0 +1,128 @@
#!/usr/bin/env bash
FUNCNEST=99999
FILE=input
read -r -a MAP_ARRAY <<< "$( < "$FILE" paste -s -d "" | sed -E 's/(.)/\1\ /g' )"
MAP_LEN=${#MAP_ARRAY[@]}
MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 ))
MAP_WIDTH_INV=$(( 0 - MAP_WIDTH ))
MAP_HEIGHT=$( < "$FILE" wc -l )
printf "Len: %s Width: %s Height: %s\n" "$MAP_LEN" "$MAP_WIDTH" "$MAP_HEIGHT"
# Check if tiles are adjacent and do not violate bounds
check_adjacent () {
# Check for out of map bounds
if [[ $2 -lt 0 ]] || [[ $2 -gt $MAP_LEN ]]
then
return 1
fi
DIFF=$(( $2 - $1 ))
# Valid adjacent distances
if [[ $DIFF -eq 1 ]] || [[ $DIFF -eq -1 ]] || [[ $DIFF -eq $MAP_WIDTH ]] || [[ $DIFF -eq $MAP_WIDTH_INV ]]
then
:
else
return 1
fi
# Check for left/right bounds
if [[ $DIFF -eq 1 ]] && [[ $(( $2 % MAP_WIDTH )) -eq 0 ]]
then
return 1
fi
if [[ $DIFF -eq -1 ]] && [[ $(( $1 % MAP_WIDTH )) -eq 0 ]]
then
return 1
fi
return 0
}
# Basically recurse over mapping and "consume" all adjacent tiles
check_and_unset () {
IDX=$1
local KV_I=${IDX%% *} # Remove trailing whitespace
(( AREA++ ))
VALUE=${KV_CACHE[$KV_I]}
unset "KV_CACHE[$KV_I]" # "Take" it
printf "max: %s peri: %s area: %s key: %s val: %s\n" "$MAX_PERI" "$PERI_NUM" "$AREA" "$1" "$VALUE" >&2
(( PERI_NUM+=MAX_PERI ))
unset IFS; read -r -a VAL_ARRAY <<< "$VALUE"
for VAL in "${VAL_ARRAY[@]}"
do
(( PERI_NUM-- ))
VAL_IDX=${VAL%% *}
if [[ -v KV_CACHE[$VAL_IDX] ]] # Check if tile has been "taken"
then
check_and_unset "$VAL_IDX"
fi
done
}
while read -r CHAR
do
# Get all indexes for a plant
read -r -a CHAR_ARRAY <<< "$(
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${MAP_ARRAY[$i]} == "$CHAR" ]]
then
printf "%s " "$i"
fi
done
)"
{
printf "For char %s \n" "$CHAR"
printf "%s " "${CHAR_ARRAY[@]}"
printf "\n"
} >&2
declare -A KV_CACHE
IFS=':'; while read -r VAR1 VAR2
do
printf "VAR1: %s VAR2: %s\n" "$VAR1" "$VAR2" >&2
KV_CACHE[$VAR1]=$VAR2
done <<< "$(
# Find all adjacent tiles
for (( i=0; i<${#CHAR_ARRAY[@]}; i++ ))
do
NUM_ADJ=0
printf "%s:" "${CHAR_ARRAY[i]}"
MIN=$(( $(( i-MAP_WIDTH )) < 0 ? 0 : $(( i-MAP_WIDTH )) ))
MAX=$(( $(( i+MAP_WIDTH )) < MAP_LEN ? $(( i+MAP_WIDTH )) : $(( MAP_LEN )) ))
for (( j=MIN; j<=MAX; j++ )) # There can only be MAP_WIDTH number of elements within valid range
do
if check_adjacent "${CHAR_ARRAY[i]}" "${CHAR_ARRAY[j]}"
then
printf "%s " "${CHAR_ARRAY[j]}"
(( NUM_ADJ++ ))
fi
done
printf "\n"
#printf "Num adj for %s idx %s is %s\n" "$CHAR" "${CHAR_ARRAY[$i]}" "$NUM_ADJ" >&2
done
)"
# Iterate through
for CH in "${CHAR_ARRAY[@]}"
do
CHAR=${CH%% *} # Remove trailing whitespace
if ! [[ -v KV_CACHE[$CHAR] ]]; then continue; fi
MAX_PERI=4
PERI_NUM=0
AREA=0
check_and_unset "$CHAR"
printf "char: %s max: %s peri: %s area: %s\n" "$CHAR" "$MAX_PERI" "$PERI_NUM" "$AREA" >&2
printf "%s\n" "$(( PERI_NUM * AREA ))"
done
# Get all plants
done <<< "$( < "$FILE" grep -o '[A-Z]' | sort -u | grep -o '[A-Z]*' )" |
paste -s -d "+" | bc

112
2024/day-12/solution-2.sh Normal file
View File

@ -0,0 +1,112 @@
#!/usr/bin/env bash
FUNCNEST=99999
FILE=test-input-1
read -r -a MAP_ARRAY <<< "$( < "$FILE" paste -s -d "" | sed -E 's/(.)/\1\ /g' )"
MAP_LEN=${#MAP_ARRAY[@]}
MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 ))
MAP_WIDTH_INV=$(( 0 - MAP_WIDTH ))
MAP_HEIGHT=$( < "$FILE" wc -l )
printf "Len: %s Width: %s Height: %s\n" "$MAP_LEN" "$MAP_WIDTH" "$MAP_HEIGHT"
# Check if tiles are adjacent and do not violate bounds
check_adjacent () {
# Check for out of map bounds
if [[ $2 -lt 0 ]] || [[ $2 -gt $MAP_LEN ]] ; then return 1 ; fi
DIFF=$(( $2 - $1 ))
# Valid adjacent distances
if [[ $DIFF -eq 1 ]] || [[ $DIFF -eq -1 ]] || [[ $DIFF -eq $MAP_WIDTH ]] || [[ $DIFF -eq $MAP_WIDTH_INV ]] ; then : ; else return 1 ; fi
# Check for left/right bounds
if [[ $DIFF -eq 1 ]] && [[ $(( $2 % MAP_WIDTH )) -eq 0 ]] ; then return 1 ; fi
if [[ $DIFF -eq -1 ]] && [[ $(( $1 % MAP_WIDTH )) -eq 0 ]] ; then return 1 ; fi
}
# Basically recurse over kv and "consume" all adjacent tiles
# All tiles that are consumed are adjacent
check_and_unset () {
local KV_I=${1%% *} # Remove trailing whitespace
(( AREA++ ))
VALUE=${KV_CACHE[$KV_I]}
unset "KV_CACHE[$KV_I]" # "Take" it
printf "max: %s peri: %s area: %s key: %s val: %s\n" "$MAX_PERI" "$PERI_NUM" "$AREA" "$1" "$VALUE" >&2
# As a square, expect width and height to always be preserved
# Recursion should always be in sequence
unset IFS; read -r -a VAL_ARRAY <<< "$VALUE"
# Loop through adjacent tiles and recurse
for VAL in "${VAL_ARRAY[@]}" # VAL_ARRAY is always sorted
do
VAL_IDX=${VAL%% *}
if [[ -v KV_CACHE[$VAL_IDX] ]] # Check if tile has been "taken"
then
check_and_unset "$VAL_IDX"
fi
done
}
while read -r CHAR
do
# Get all indexes for a plant
read -r -a CHAR_ARRAY <<< "$(
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${MAP_ARRAY[$i]} == "$CHAR" ]]
then
printf "%s " "$i"
fi
done
)"
#{
# printf "For char %s \n" "$CHAR"
# printf "%s " "${CHAR_ARRAY[@]}"
# printf "\n"
#} >&2
declare -A KV_CACHE
IFS=':'; while read -r VAR1 VAR2
do
#printf "VAR1: %s VAR2: %s\n" "$VAR1" "$VAR2" >&2
KV_CACHE[$VAR1]=$VAR2
done <<< "$(
# Find all adjacent tiles
for (( i=0; i<${#CHAR_ARRAY[@]}; i++ ))
do
NUM_ADJ=0
printf "%s:" "${CHAR_ARRAY[i]}"
MIN=$(( $(( i-MAP_WIDTH )) < 0 ? 0 : $(( i-MAP_WIDTH )) ))
MAX=$(( $(( i+MAP_WIDTH )) < MAP_LEN ? $(( i+MAP_WIDTH )) : $(( MAP_LEN )) ))
for (( j=MIN; j<MAX; j++ )) # There can only be MAP_WIDTH number of elements within valid range
do
if check_adjacent "${CHAR_ARRAY[i]}" "${CHAR_ARRAY[j]}"
then
printf "%s " "${CHAR_ARRAY[j]}"
(( NUM_ADJ++ ))
fi
done
printf "\n"
#printf "Num adj for %s idx %s is %s\n" "$CHAR" "${CHAR_ARRAY[$i]}" "$NUM_ADJ" >&2
done
)"
# Iterate through
for CH in "${CHAR_ARRAY[@]}"
do
CHAR=${CH%% *} # Remove trailing whitespace
if ! [[ -v KV_CACHE[$CHAR] ]]; then continue; fi
PERI_NUM=4 # Number of perimeters of a square
AREA=0
ROW=0
check_and_unset "$CHAR"
printf "char: %s max: %s peri: %s area: %s\n" "$CHAR" "$MAX_PERI" "$PERI_NUM" "$AREA" >&2
printf "%s\n" "$(( PERI_NUM * AREA ))"
done
# Get all plants
#done <<< "$( < "$FILE" grep -o '[A-Z]' | sort -u | grep -o '[A-Z]*' )"
done <<< "$( < "$FILE" grep -o '[A-Z]' | sort -u | grep -o '[A-Z]*' )" |
paste -s -d "+" | bc

4
2024/day-12/test-input-1 Normal file
View File

@ -0,0 +1,4 @@
AAAA
BBCD
BBCC
EEEC

5
2024/day-12/test-input-2 Normal file
View File

@ -0,0 +1,5 @@
OOOOO
OXOXO
OOOOO
OXOXO
OOOOO

10
2024/day-12/test-input-3 Normal file
View File

@ -0,0 +1,10 @@
RRRRIICCFF
RRRRIICCCF
VVRRRCCFFF
VVRCCCJFFF
VVVVCJJCFE
VVIVCCJJEE
VVIIICJJEE
MIIIIIJJEE
MIIISIJEEE
MMMISSJEEE

View File

@ -0,0 +1 @@
140

View File

@ -0,0 +1 @@
772

View File

@ -0,0 +1 @@
1930

1279
2024/day-13/input Normal file

File diff suppressed because it is too large Load Diff

45
2024/day-13/solution-1.sh Normal file
View File

@ -0,0 +1,45 @@
#!/usr/bin/env bash
FILE=input
read -r -a INPUT_ARRAY <<< "$( sed -E 's/.*X[\+\=]([0-9]+), Y[\+\=]([0-9]+)/\1 \2 /g' < "$FILE" | paste -s -d " " )"
printf "%s\n" "${INPUT_ARRAY[@]}" >&2
INPUT_LEN=${#INPUT_ARRAY[@]}
TOTAL_TOKEN=0
for (( i=0 ; i < INPUT_LEN; i+=6 ))
do
A=${INPUT_ARRAY[i]}
C=${INPUT_ARRAY[i+1]}
B=${INPUT_ARRAY[i+2]}
D=${INPUT_ARRAY[i+3]}
X=${INPUT_ARRAY[i+4]}
Y=${INPUT_ARRAY[i+5]}
I=$(( ( B*Y - D*X ) / ( B*C - D*A ) )) # Button A
J=$(( ( X - A*I ) / B )) # Button B
TOKEN=$(( I*3 + J*1 ))
{
printf "Answer: I= %s, J= %s\n" "$I" "$J"
printf "Verify answer : %s to %s, %s to %s\n" "$(( A*I + B*J ))" "$X" "$(( C*I + D*J ))" "$Y"
printf "Total cost: %s\n" "$(( I*3 + J*1 ))"
} >&2
if ! [[ $(( A*I + B*J )) -eq $X ]]
then
continue
elif ! [[ $(( C*I + D*J )) -eq $Y ]]
then
continue
elif [[ $I -lt 1 ]] || [[ $J -lt 1 ]]
then
continue
elif [[ $I -gt 100 ]] || [[ $J -gt 100 ]]
then
continue
else
(( TOTAL_TOKEN+=TOKEN ))
fi
done
printf "Total token: %s\n" "$TOTAL_TOKEN"

63
2024/day-13/solution-2.sh Normal file
View File

@ -0,0 +1,63 @@
#!/usr/bin/env bash
FILE=input
read -r -a INPUT_ARRAY <<< "$( sed -E 's/.*X[\+\=]([0-9]+), Y[\+\=]([0-9]+)/\1 \2 /g' < "$FILE" | paste -s -d " " )"
#printf "%s\n" "${INPUT_ARRAY[@]}" >&2
INPUT_LEN=${#INPUT_ARRAY[@]}
TOTAL_TOKEN=0
for (( i=0 ; i < INPUT_LEN; i+=6 ))
do
A=${INPUT_ARRAY[i]}
C=${INPUT_ARRAY[i+1]}
B=${INPUT_ARRAY[i+2]}
D=${INPUT_ARRAY[i+3]}
X=$(( 10000000000000 + ${INPUT_ARRAY[i+4]} ))
Y=$(( 10000000000000 + ${INPUT_ARRAY[i+5]} ))
# Check if moduluses are eq 0 before proceeding
I_MODULUS=$(( (B*Y - D*X) % (B*C - D*A) ))
echo "I_MODULUS: $I_MODULUS"
if [[ $I_MODULUS -eq 0 ]]
then
I=$(( ( B*Y - D*X ) / ( B*C - D*A ) )) # Button A
else
continue
fi
J_MODULUS=$(( ( X - A*I ) % B ))
echo "J_MODULUS: $J_MODULUS"
if [[ $J_MODULUS -eq 0 ]]
then
J=$(( ( X - A*I ) / B )) # Button b
else
continue
fi
# Numbers have to be positive ints
if [[ $I -lt 1 ]] || [[ $J -lt 1 ]]
then
continue
fi
{
echo "( $B*$Y - $D*$X ) / ( $B*$C - $D*$A )" >&2 # Button A
echo "( $X - $A*$I ) / $B )" >&2 # Button B
printf "Answer: I= %s, J= %s\n" "$I" "$J"
printf "Verify answer : %s to %s, %s to %s\n" "$(( A*I + B*J ))" "$X" "$(( C*I + D*J ))" "$Y"
printf "Total cost: %s\n" "$(( I*3 + J*1 ))"
} >&2
TOKEN=$(( I*3 + J*1 )) # Calculate token cost
# Verify numbers with results for positions
if ! [[ $(( A*I + B*J )) -eq $X ]] # X position
then
continue
elif ! [[ $(( C*I + D*J )) -eq $Y ]] # Y position
then
continue
else
(( TOTAL_TOKEN+=TOKEN ))
fi
done
printf "Total token: %s\n" "$TOTAL_TOKEN"

15
2024/day-13/test-input-1 Normal file
View File

@ -0,0 +1,15 @@
Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=8400, Y=5400
Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=12748, Y=12176
Button A: X+17, Y+86
Button B: X+84, Y+37
Prize: X=7870, Y=6450
Button A: X+69, Y+23
Button B: X+27, Y+71
Prize: X=18641, Y=10279

500
2024/day-14/input Normal file
View File

@ -0,0 +1,500 @@
p=30,37 v=-50,-64
p=24,42 v=55,12
p=10,56 v=-49,82
p=67,69 v=-58,60
p=82,98 v=-57,61
p=29,1 v=20,-40
p=41,61 v=-95,92
p=92,68 v=38,80
p=26,82 v=58,79
p=84,42 v=11,-45
p=71,10 v=-76,21
p=42,3 v=-93,-25
p=53,102 v=93,-63
p=33,4 v=-13,-94
p=20,100 v=57,-32
p=17,50 v=51,39
p=75,41 v=-84,39
p=83,53 v=-64,-96
p=15,38 v=28,-72
p=35,23 v=-9,-69
p=26,92 v=10,56
p=19,54 v=-42,4
p=50,6 v=-72,28
p=88,19 v=-90,-29
p=11,85 v=-5,87
p=22,22 v=-49,60
p=70,81 v=-33,37
p=43,47 v=-93,35
p=5,32 v=-1,39
p=91,70 v=96,-44
p=10,87 v=-38,94
p=67,6 v=32,-99
p=54,41 v=-47,68
p=2,59 v=-75,-53
p=27,20 v=-46,5
p=22,28 v=-13,-75
p=51,29 v=99,66
p=98,28 v=-38,-30
p=26,53 v=-49,48
p=39,83 v=-67,3
p=34,59 v=-46,-57
p=96,92 v=83,26
p=18,70 v=59,23
p=41,84 v=-27,-1
p=5,40 v=-30,20
p=86,83 v=-59,87
p=3,76 v=12,-76
p=49,88 v=6,83
p=37,79 v=90,-5
p=78,42 v=21,50
p=78,55 v=-12,-95
p=66,14 v=31,1
p=53,47 v=-64,62
p=67,18 v=-89,58
p=87,10 v=-78,-29
p=62,86 v=-14,91
p=78,74 v=17,-81
p=12,62 v=-40,45
p=45,102 v=-91,-32
p=38,1 v=-99,97
p=39,81 v=55,-84
p=43,22 v=-85,65
p=44,30 v=43,35
p=58,22 v=-41,-48
p=59,35 v=-35,-45
p=93,23 v=-24,13
p=28,98 v=-39,96
p=95,34 v=-27,55
p=18,70 v=92,-27
p=7,76 v=-11,75
p=1,23 v=-98,-37
p=8,87 v=-3,-70
p=59,22 v=97,-71
p=69,79 v=-36,-23
p=34,82 v=-15,-35
p=5,7 v=-36,44
p=76,70 v=-79,-6
p=77,36 v=13,85
p=68,60 v=80,14
p=13,96 v=92,94
p=37,37 v=-93,-38
p=1,66 v=1,11
p=10,10 v=94,-37
p=97,86 v=-30,-5
p=69,11 v=-76,21
p=30,90 v=22,-96
p=33,26 v=-31,97
p=48,81 v=37,-54
p=19,37 v=72,33
p=49,88 v=36,-69
p=1,61 v=12,44
p=48,83 v=-72,91
p=39,6 v=-56,-55
p=94,98 v=44,-70
p=68,60 v=95,-99
p=44,52 v=-83,-61
p=44,81 v=89,51
p=4,44 v=36,-7
p=17,9 v=-77,-93
p=35,77 v=53,38
p=60,79 v=86,-81
p=16,81 v=85,69
p=54,10 v=-2,36
p=55,73 v=-43,-42
p=20,86 v=-11,-47
p=57,32 v=3,88
p=82,66 v=89,-42
p=90,4 v=-59,-55
p=8,20 v=-76,69
p=18,77 v=-79,-65
p=100,29 v=-24,66
p=22,3 v=-44,-47
p=52,49 v=-90,68
p=16,72 v=45,31
p=57,99 v=33,-82
p=51,56 v=16,9
p=28,90 v=88,-74
p=76,24 v=-43,-10
p=21,31 v=-36,-90
p=68,99 v=27,-40
p=0,84 v=69,83
p=100,88 v=-97,32
p=65,52 v=85,-4
p=31,61 v=-76,71
p=75,101 v=-70,55
p=43,17 v=74,-33
p=56,89 v=62,-54
p=3,50 v=-96,69
p=77,70 v=-49,53
p=69,69 v=-78,72
p=76,78 v=54,-8
p=32,75 v=-34,-11
p=42,100 v=47,75
p=70,28 v=97,4
p=88,42 v=75,39
p=64,20 v=-74,89
p=78,17 v=-72,-98
p=14,79 v=30,26
p=47,50 v=16,38
p=21,75 v=59,-73
p=82,74 v=81,30
p=25,62 v=11,-1
p=94,83 v=67,40
p=82,62 v=16,-5
p=26,97 v=67,50
p=6,77 v=-44,72
p=76,94 v=-17,77
p=55,27 v=-62,-75
p=86,14 v=-90,-97
p=51,66 v=78,-20
p=21,68 v=22,87
p=50,83 v=-68,-8
p=52,81 v=3,-8
p=10,82 v=36,-35
p=99,10 v=38,-65
p=56,61 v=-67,-55
p=46,39 v=-60,73
p=65,64 v=29,-65
p=11,5 v=91,-12
p=93,69 v=38,57
p=62,56 v=-68,61
p=31,86 v=-48,79
p=94,17 v=-90,86
p=71,37 v=-91,35
p=97,48 v=58,-69
p=95,11 v=75,-52
p=37,62 v=-87,38
p=63,76 v=97,41
p=9,74 v=78,-52
p=13,87 v=96,83
p=26,50 v=-46,-69
p=8,68 v=-43,-62
p=45,9 v=39,-2
p=29,79 v=-19,87
p=56,5 v=11,-16
p=92,68 v=25,99
p=98,2 v=-63,-13
p=29,102 v=-93,-36
p=73,9 v=56,-28
p=36,66 v=-83,-46
p=94,80 v=-43,-38
p=53,79 v=23,97
p=50,10 v=-91,-37
p=14,43 v=98,-49
p=3,78 v=78,-1
p=46,46 v=-31,-31
p=94,101 v=38,-70
p=56,23 v=-37,9
p=50,66 v=38,91
p=70,26 v=17,-34
p=7,92 v=7,-76
p=75,36 v=-45,-30
p=71,0 v=62,-51
p=72,92 v=12,9
p=34,39 v=84,84
p=73,88 v=-39,-26
p=51,81 v=-68,64
p=24,82 v=61,4
p=32,2 v=86,86
p=50,102 v=-30,-12
p=98,26 v=-67,14
p=96,88 v=35,-83
p=43,53 v=12,-99
p=77,50 v=56,-72
p=7,50 v=66,92
p=70,66 v=-6,38
p=60,29 v=-70,-33
p=70,11 v=89,24
p=93,58 v=-19,-74
p=96,68 v=98,30
p=70,68 v=-43,38
p=24,99 v=53,-28
p=98,38 v=-74,-9
p=69,49 v=-76,-23
p=9,75 v=-69,64
p=41,19 v=14,-71
p=0,23 v=38,-71
p=1,56 v=36,-23
p=55,52 v=-99,31
p=85,85 v=-22,75
p=18,78 v=69,-27
p=7,96 v=90,-89
p=96,85 v=40,-70
p=7,80 v=-92,87
p=81,6 v=46,-17
p=44,71 v=10,-19
p=12,72 v=73,-4
p=33,86 v=14,67
p=84,94 v=52,-24
p=34,66 v=-56,-65
p=31,60 v=-85,88
p=65,0 v=-35,-97
p=76,83 v=-12,60
p=15,29 v=64,-59
p=71,45 v=-68,43
p=19,77 v=92,95
p=6,85 v=-38,79
p=1,27 v=-59,33
p=38,12 v=-89,-10
p=45,27 v=51,66
p=23,100 v=-13,-70
p=18,43 v=-35,-59
p=63,28 v=72,-72
p=42,7 v=83,-5
p=28,99 v=29,-43
p=96,38 v=11,39
p=47,97 v=74,56
p=81,27 v=87,-64
p=63,6 v=39,93
p=15,43 v=-48,19
p=6,21 v=12,-65
p=52,70 v=-85,-14
p=96,53 v=-55,8
p=3,77 v=-98,-20
p=76,54 v=-86,-95
p=85,77 v=-49,-72
p=96,46 v=-84,39
p=42,79 v=-93,68
p=46,59 v=-17,7
p=52,16 v=-66,32
p=12,70 v=67,23
p=52,7 v=-21,67
p=13,62 v=-5,95
p=25,63 v=-83,19
p=91,25 v=54,24
p=28,9 v=-5,71
p=73,1 v=89,82
p=71,22 v=83,82
p=37,40 v=90,66
p=8,91 v=-3,-85
p=53,66 v=6,38
p=14,94 v=59,10
p=81,17 v=-12,-22
p=82,72 v=-20,-88
p=36,90 v=-47,-80
p=26,91 v=-77,-70
p=73,91 v=23,-40
p=76,68 v=21,53
p=64,30 v=-82,55
p=7,97 v=1,-13
p=69,87 v=57,-28
p=19,65 v=92,31
p=66,50 v=97,-53
p=86,54 v=13,84
p=23,51 v=-48,46
p=97,39 v=-61,-7
p=6,2 v=57,-42
p=51,71 v=-20,40
p=65,17 v=-76,-25
p=62,12 v=-14,-59
p=16,31 v=30,85
p=55,12 v=16,-23
p=22,45 v=96,-87
p=8,97 v=95,14
p=73,91 v=-96,-89
p=35,32 v=-50,-34
p=19,78 v=68,-89
p=88,23 v=-56,-58
p=63,20 v=74,29
p=81,79 v=-10,57
p=11,57 v=-40,-42
p=24,69 v=-83,-12
p=41,7 v=19,69
p=3,101 v=25,69
p=5,67 v=38,-88
p=66,50 v=-47,39
p=59,32 v=-93,16
p=71,48 v=45,-82
p=23,76 v=-46,83
p=27,9 v=-15,-78
p=39,57 v=99,-63
p=64,48 v=-39,-88
p=100,24 v=-78,-61
p=83,8 v=-88,-89
p=74,2 v=64,-65
p=58,54 v=-2,57
p=69,98 v=-66,-97
p=12,49 v=-69,27
p=66,9 v=60,-97
p=34,47 v=72,-26
p=48,4 v=66,62
p=64,22 v=-10,13
p=87,42 v=23,-87
p=32,67 v=6,-73
p=44,77 v=-1,-5
p=19,44 v=86,80
p=77,82 v=-86,3
p=90,99 v=43,-43
p=77,32 v=-28,-26
p=78,7 v=-14,2
p=15,69 v=-44,-69
p=80,23 v=-39,-74
p=93,39 v=-56,78
p=75,51 v=-47,-3
p=47,20 v=74,1
p=33,85 v=39,-47
p=33,2 v=36,50
p=46,43 v=81,-11
p=47,100 v=-62,-74
p=14,31 v=87,-78
p=63,56 v=41,43
p=80,57 v=41,47
p=57,26 v=2,12
p=56,25 v=5,-95
p=50,40 v=-66,35
p=67,30 v=27,-35
p=38,33 v=42,-10
p=12,4 v=28,59
p=2,48 v=54,30
p=10,8 v=88,-33
p=34,79 v=14,-35
p=52,99 v=60,14
p=25,66 v=-13,-50
p=94,44 v=7,-30
p=45,50 v=35,-30
p=72,96 v=-88,52
p=91,56 v=-24,19
p=83,92 v=17,-28
p=64,28 v=95,31
p=34,44 v=49,4
p=32,55 v=-52,-80
p=11,25 v=40,35
p=80,2 v=-6,-74
p=83,27 v=-48,61
p=23,53 v=-3,-92
p=60,44 v=-65,-48
p=46,102 v=-25,-97
p=8,6 v=-36,-2
p=87,88 v=13,18
p=40,84 v=-33,53
p=13,7 v=28,-78
p=60,10 v=27,21
p=92,50 v=44,4
p=81,55 v=-51,-76
p=9,102 v=32,-2
p=65,42 v=-6,54
p=9,96 v=-34,71
p=34,94 v=-87,94
p=74,62 v=90,-52
p=51,8 v=61,48
p=45,27 v=70,5
p=15,74 v=51,-62
p=92,49 v=83,-22
p=4,23 v=-28,32
p=30,54 v=41,-57
p=70,65 v=27,-4
p=39,43 v=-56,-38
p=68,75 v=-78,3
p=71,58 v=60,-65
p=7,73 v=98,49
p=7,54 v=-89,96
p=77,45 v=81,43
p=88,76 v=-37,13
p=62,41 v=99,39
p=65,76 v=77,52
p=72,97 v=-43,25
p=60,30 v=99,5
p=25,35 v=-23,-53
p=84,24 v=-88,-60
p=41,0 v=20,6
p=78,52 v=-18,-72
p=68,65 v=95,19
p=11,40 v=90,-56
p=69,40 v=35,58
p=82,44 v=13,-7
p=32,23 v=-21,32
p=61,8 v=68,-63
p=81,5 v=85,-74
p=55,67 v=66,57
p=15,6 v=71,-63
p=29,93 v=-32,72
p=51,31 v=-20,45
p=45,63 v=37,19
p=56,92 v=-37,-43
p=57,44 v=4,16
p=29,11 v=-50,93
p=8,1 v=42,-17
p=77,71 v=97,76
p=98,97 v=43,-84
p=71,51 v=-42,72
p=4,24 v=92,-10
p=37,71 v=14,-88
p=2,0 v=71,86
p=94,71 v=7,30
p=95,22 v=-44,-56
p=13,58 v=96,-4
p=10,75 v=-47,74
p=91,27 v=32,-68
p=94,31 v=48,-56
p=21,48 v=47,23
p=98,78 v=-73,79
p=69,66 v=-76,49
p=87,67 v=78,60
p=56,32 v=37,-29
p=75,1 v=-72,88
p=90,71 v=-64,-50
p=63,58 v=27,-40
p=0,27 v=-20,-25
p=32,4 v=-87,36
p=68,51 v=-78,-76
p=80,78 v=-82,-77
p=33,7 v=47,-44
p=42,98 v=80,75
p=44,97 v=-19,17
p=91,63 v=-33,98
p=60,48 v=75,92
p=41,32 v=-14,-84
p=7,29 v=-42,-11
p=2,70 v=-63,87
p=85,48 v=-16,-34
p=5,54 v=-82,51
p=56,95 v=-61,-62
p=5,57 v=-57,69
p=80,14 v=-82,-71
p=30,72 v=-52,-92
p=70,49 v=-41,27
p=71,82 v=60,-1
p=71,9 v=25,97
p=100,101 v=91,-57
p=5,48 v=44,38
p=95,75 v=65,83
p=34,47 v=-29,27
p=89,82 v=19,34
p=76,92 v=-29,-2
p=71,92 v=81,-70
p=17,68 v=90,-8
p=71,44 v=96,32
p=57,25 v=-10,54
p=75,67 v=-16,-62
p=46,87 v=-37,41
p=74,98 v=97,78
p=30,22 v=72,-38
p=41,17 v=-23,-21
p=67,34 v=85,61
p=63,58 v=31,42
p=96,5 v=-94,-17
p=64,102 v=99,29
p=99,39 v=-63,27
p=16,84 v=-40,-24
p=22,19 v=55,2
p=70,76 v=-98,-46
p=16,46 v=-40,16
p=37,10 v=7,-28
p=59,49 v=3,-90
p=38,38 v=-79,8
p=43,85 v=45,-58
p=99,23 v=-26,24
p=45,69 v=-70,-62
p=44,22 v=-73,21
p=24,17 v=-10,43
p=61,90 v=-70,98
p=69,65 v=-14,-81
p=23,93 v=-6,-99
p=80,30 v=-25,-25
p=31,53 v=-91,-92
p=45,2 v=78,21
p=50,47 v=-87,-45
p=32,86 v=84,-62
p=47,81 v=97,-92
p=99,95 v=78,-66

113
2024/day-14/solution-1.sh Normal file
View File

@ -0,0 +1,113 @@
#!/usr/bin/env/bash
FILE=input
MAP_WIDTH=101
MAP_HEIGHT=103
MEDIAN_WIDTH=$(( MAP_WIDTH / 2 - 1 ))
if [[ $(( MAP_WIDTH % 2 )) -eq 1 ]]
then
(( MEDIAN_WIDTH++ ))
fi
MEDIAN_HEIGHT=$(( MAP_HEIGHT / 2 - 1 ))
if [[ $(( MAP_HEIGHT % 2 )) -eq 1 ]]
then
(( MEDIAN_HEIGHT++ ))
fi
printf "Median width: %s, median height: %s\n" "$MEDIAN_WIDTH" "$MEDIAN_HEIGHT"
# Load bot positions and velocities
read -r -a BOT_ARRAY <<< "$( grep -Eo '[-0-9]*' "$FILE" | paste -s -d " " )"
#printf "%s " "${BOT_ARRAY[@]}"
#printf "\n"
printf "Bot array size: %s\n" "${#BOT_ARRAY[@]}"
# Just move forward n seconds for every bot and save
# final positions
IFS=';'; read -r -a FINAL_ARRAY <<< "$(
SECONDS=100
for (( i=0; i<${#BOT_ARRAY[@]}; i+=4 ))
do
PX=${BOT_ARRAY[i]}
PY=${BOT_ARRAY[i+1]}
VX=${BOT_ARRAY[i+2]}
VY=${BOT_ARRAY[i+3]}
FINAL_X=$(( PX + ( VX * SECONDS ) ))
FINAL_Y=$(( PY + ( VY * SECONDS ) ))
printf "%s %s;" "$FINAL_X" "$FINAL_Y"
done <<< "${BOT_ARRAY[@]}"
)"
unset IFS
#printf "%s\n" "${FINAL_ARRAY[@]}" | head
printf "Final array size: %s\n" "${#FINAL_ARRAY[@]}"
# Get number of robots in each quadrant
Q1=0
Q2=0
Q3=0
Q4=0
ITER=9999
while read -r RAW_X RAW_Y
do
# Adjust positions to be on map
PX=$(( RAW_X % MAP_WIDTH ))
if [[ $PX -lt 0 ]]
then
PX=$(( MAP_WIDTH + PX ))
fi
PY=$(( RAW_Y % MAP_HEIGHT ))
if [[ $PY -lt 0 ]]
then
PY=$(( MAP_HEIGHT + PY ))
fi
# Check if negative positions, should not happen
if [[ $PX -lt 0 ]] || [[ $PY -lt 0 ]]
then
printf "Negative final position. PX: %s PY: %s\n" "$PX" "$PY"
fi
if [[ $PX -ge $MAP_WIDTH ]] || [[ $PY -ge $MAP_HEIGHT ]]
then
printf "Out of bounds. PX: %s PY: %s\n" "$PX" "$PY"
fi
printf "PX: %s PY: %s\n" "$PX" "$PY"
# Allocate robot to quadrant
if \
[[ $PX -ge 0 ]] && \
[[ $PX -lt $MEDIAN_WIDTH ]] && \
[[ $PY -ge 0 ]] && \
[[ $PY -lt $MEDIAN_HEIGHT ]] # Q1
then
(( Q1++ ))
elif \
[[ $PX -gt $MEDIAN_WIDTH ]] && \
[[ $PX -lt $MAP_WIDTH ]] && \
[[ $PY -ge 0 ]] && \
[[ $PY -lt $MEDIAN_HEIGHT ]] # Q2
then
(( Q2++ ))
elif \
[[ $PX -ge 0 ]] && \
[[ $PX -lt $MEDIAN_WIDTH ]] && \
[[ $PY -gt $MEDIAN_HEIGHT ]] && \
[[ $PY -lt $MAP_HEIGHT ]] # Q3
then
(( Q3++ ))
elif \
[[ $PX -gt $MEDIAN_WIDTH ]] && \
[[ $PX -lt $MAP_WIDTH ]] && \
[[ $PY -gt $MEDIAN_HEIGHT ]] && \
[[ $PY -lt $MAP_HEIGHT ]] # Q4
then
(( Q4++ ))
else
printf "Skipped in the median. PX: %s PY: %s\n" "$PX" "$PY"
fi
(( ITER-- ))
if [[ $ITER -eq 0 ]] ; then break ; fi
done <<< "$( printf "%s\n" "${FINAL_ARRAY[@]}" )"
# Calculate safety factor
SAFETY_FACTOR=$(( Q1 * Q2 * Q3 * Q4 ))
printf "Safety factor: %s\n" "$SAFETY_FACTOR"

87
2024/day-14/solution-2.sh Normal file
View File

@ -0,0 +1,87 @@
#!/usr/bin/env/bash
FILE=input
MAP_WIDTH=101
MAP_HEIGHT=103
MEDIAN_WIDTH=$(( MAP_WIDTH / 2 - 1 ))
if [[ $(( MAP_WIDTH % 2 )) -eq 1 ]]
then
(( MEDIAN_WIDTH++ ))
fi
MEDIAN_HEIGHT=$(( MAP_HEIGHT / 2 - 1 ))
if [[ $(( MAP_HEIGHT % 2 )) -eq 1 ]]
then
(( MEDIAN_HEIGHT++ ))
fi
printf "Median width: %s, median height: %s\n" "$MEDIAN_WIDTH" "$MEDIAN_HEIGHT"
# Load bot positions and velocities
read -r -a BOT_ARRAY <<< "$( grep -Eo '[-0-9]*' "$FILE" | paste -s -d " " )"
#printf "%s " "${BOT_ARRAY[@]}"
#printf "\n"
printf "Bot array size: %s\n" "${#BOT_ARRAY[@]}"
# Load arrangements for every second
#for SECONDS in $( seq 1 9999 )
for SECONDS in $( seq 6514 6516 )
do
# Compute positions for each bot
printf "Working on +%s seconds.\n" "$SECONDS"
IFS=';'; read -r -a FINAL_ARRAY <<< "$(
for (( i=0; i<${#BOT_ARRAY[@]}; i+=4 ))
do
PX=${BOT_ARRAY[i]}
PY=${BOT_ARRAY[i+1]}
VX=${BOT_ARRAY[i+2]}
VY=${BOT_ARRAY[i+3]}
FINAL_X=$(( PX + ( VX * SECONDS ) ))
FINAL_Y=$(( PY + ( VY * SECONDS ) ))
printf "%s %s;" "$FINAL_X" "$FINAL_Y"
done <<< "${BOT_ARRAY[@]}"
)"
unset IFS
# Generate "empty" map
# Map is a 1d array
MAP_LEN=$(( MAP_HEIGHT * MAP_WIDTH ))
read -r -a MAP_ARRAY <<< "$(
for (( i=0; i<MAP_LEN; i++ ))
do
printf ". "
done
)"
# Calculate and map bot positions on the map
while read -r RAW_X RAW_Y
do
# Adjust positions to be on map
PX=$(( RAW_X % MAP_WIDTH ))
if [[ $PX -lt 0 ]]
then
PX=$(( MAP_WIDTH + PX ))
fi
PY=$(( RAW_Y % MAP_HEIGHT ))
if [[ $PY -lt 0 ]]
then
PY=$(( MAP_HEIGHT + PY ))
fi
# Calculate serial position and mark it
POSITION=$(( PX + (PY -1)*MAP_WIDTH ))
MAP_ARRAY[POSITION]=X
done <<< "$( printf "%s\n" "${FINAL_ARRAY[@]}" )"
# Print out map for manual review
#printf "%s" "${MAP_ARRAY[@]}" | fold -w $(( MAP_WIDTH )) | grep -o 'XXXXXXXXXX' && break
printf "%s" "${MAP_ARRAY[@]}" | fold -w $(( MAP_WIDTH ))
printf "\n"
printf "Final array length: %s, map array length: %s\n" "${#FINAL_ARRAY[@]}" "${#MAP_ARRAY[@]}"
printf "\n"
# Reset for next run
unset MAP_ARRAY
unset FINAL_ARRAY
done

50
2024/day-15/input-map Normal file
View File

@ -0,0 +1,50 @@
##################################################
#...O.O..O..O...O..........O.O.O.O.....O..O.#.O#.#
#...O.OO.O.......O#.......O.OO....O.#..#...OOO#..#
#O..O....O.O.O.O..O.OOO...O.OO......O....#O.....##
#OO.#O.........OOO....OO....O.O.O..#......OO.O...#
#OO........OOO#O..#O..OOO...O.O.O..OO.#OOOO...#.##
#....#.O.......O.#....OOOO.O..O..O.O##...O....#O##
#.....OOO....O..........O...OO......OO.OO#O...OO.#
#OO.O....O...OO.O.##....OOO.O...O...............##
#O.....O.....#.....#..O..#O.O.O..OO#O..O.OOO...O.#
#.O....O....O..O.O...#.O..O....O.O..O..O.....O...#
#.O.O.....OO.OOOO.O...#O..........O...#.#OO....O.#
#O..O.O.O..O.O....OOO..O#..O.O.O......#O..O.O.#O##
#..O#...O.OO.....#O..O..O....OOOO.O...#OOO..#.#.O#
#.O.....O#.............#.#..OO...OOO....O....OO###
#.#OO....OO..O#....OO..O#...OO..........O...OO...#
#.O.O.....OO.....O.OO.O#...O..O..O...O....O......#
#.O..O....O..O.....#O.O..O.....O..#O...OOOO.O...O#
#O...O....O.OOOO...OO.........O#..#.....#O.O#O#.O#
##...OO...O.....O..O#O...O.........O.#...#..#....#
#OOOO.OO.#...OO.#..O..#O...........OOOO.OO.O....O#
#....O..O.O.OO..O#......#.....OO..OO...O........##
#.O.#....#..........#..OO....OO....##........O.OO#
#..O.O..#.....O##O.O....OO......#O....O....#.....#
#....OO.OO#..OO..O.#....@#O.OOO.O..OO#...#O.OO...#
#..O.....O.........O.O........O#O......O.......O.#
#O.............O....#O.......O..#..#O.O.O...#....#
##...O...OOO..OO..OO.........OOOOO..O.O.O.OO..O.O#
#.#.OOO......#.O..OO.#...O#.O....O..#...#.O......#
#O.O..........O..O...O..OO....O#.O....O.OOO....#.#
#.O.#..OO.OO#..........#.O...O.OO.....O......O.O.#
#.......OO.O.#O..OO.OOO.O........O.............OO#
#O..OOO.#.OO.O.O.....O...O.O..OO.O...O#O##O..O...#
#O.#.O.#O....O..O......O.##O.OOO..O.OOO.O...#....#
#.#........O.OO...#.O...O.....O.##...#.O.OO.O..#O#
#..OO..O....#..O.O#O..O...#O...O#.O.O.O.O...O.#..#
#O.......O#.#O..O#..O..O...#.#.O...........OO....#
#O....................OO.O...O......#..#.OO......#
#OO#..O#....O.OOO.....OOO..#.O..#OO.#....#O.O.O..#
#.O..O.......O.O....#.O...OO....O.OOO...#........#
#.......O...#.....###...O.OO.....O...##..O.#...O.#
#.O.#O...O...O.O#.#..#.#O..O.OO...O#...OOOO.O...O#
##..OO..........O...O.#...OO#O...#O..O..O........#
#...O..O.OO...#O..O#....O....#......OOOO.O...O.O.#
#..O.O...O.O.#O..O.O..#.O.O.......#....O....O.O..#
#O.O.#.OO.....O.........O.##..OO...#.O..O........#
#O..O.OOO..#....O.O#O.O..O......O...O#.OOO.O.O.O.#
#.O....##.##O.O.OO##.O...O....#...#.OO.....O...O.#
#OOO.....#...OOO.O..OOO..O...O......#.O...O..##.O#
##################################################

View File

@ -0,0 +1,20 @@
<v^<^>^^^<<>v^^^v>>>>v><^<v<^^>v<>v^<><>v>^v^<>v^<^<>^>><^v<^^><v>v>><<^<^^<vv<vv><<^v^v><v^>^vv>v>>^v<<>>>^>>>^^>><v^^v<^>>vv>>^>>><<<^<<<^>^>v>^>v>^><<>><>^>^>^<v>^v<>v<<<^v>v^v>v>v^^v<^v<^>>v^v>^>v^^v<<^^<v^v^<<^<v^^^>v^v<v<><vv<vv^>>^<^v^vv>vv><>>><<v<vvvv<>^>><>^^<v>>^>v^<v<v^^vv><<><v>^v<^>>v<>^<<^v>>^v><<>^>>v<>^^v<<v<>>v^v>>^^^^>v^<<^v>>>>v<><>vvvv<>v><^<v>v>^^vv<<<<>>>v^><>^^^><v^>^^><^><<^^<^^v><v<<v<^>>>v^<^^^>vvv^<^>^^^>^>>^v>>^<<v>^vvv<<v^><^v>>><><vv<v>v^><<>^v<>v<^v<<><v>^<<v<<<>^vvv>>>^>^v^v^<v<^<^vv^>>>^<^^<>>v><<<<^>v>^v<v^v<^>v<>>>^>^vvv<v<<^^^vv^vv>>>^^<>v<<><v>^<v><^v^v>>^^><^<>v^>>vv><<<^v<^>v^^^vv>^v><<v^<<>vv<^v<^<>^^<<^^^<v^^>v>v>^^^><>v^>>v<<<v>>v^^vv^<<^<<v<v^^^v^>><vv^<>v>>v^^<>^<^>><v><>>vv>v><v<>^vvv><<<>^v<<^^v><>^<>vvv^>^v>^<v^<><<>v>v>v>v<^><v<>>^<>^<<<><v<<v<v<^>^^^v^v><>v>^v><<vvv<<^>v<vvv^><>>v^^<v><v<<<<<^<^<>><<<<^vv<^^>v>vvvv<<^v><^v^<v<vv^<v^^<>v><^<vv>><v<><vvv^^><vvvv<^v<<<><^^v^v^>^>v>>v<v<<>v^<>>>v^<vv<<v<^^v<^v>vv>>>vv>>>v<<>^<<<^v^v>><vvv^<
vv<><<>^<>>>^<^<v^<v<^<>>vv>>v^><<>v>^<v><>v<>^v<<>>v><v>><v^^^<^<v<<<>^v<><<^^<vvv^>>>>v^<<<^><<v><>v<^^>v<<^v^^^^<<^vv^>>vv<<<^^<^^v^>v>v<^<v^v^><>^<<v>^v>v^<v>^<v<v^^<<>v^>v^v><<v^^v><<>vv><v<>v^>^vv^><<^vv^v<<<^>v<>v<><><<v^v<^v^v^>>v>v^^<^^<>>>vv<v<><>><>>^v^><<^^^<<<vv><<>^<<<><<<vv^>vv^vv^vv>^v<<v<^><^^vv>^v^<<v>>>v<<vv><vv<v^<vvv>vv>>>>>^v>>^>^><^>v><v^v^^^^<><v^>v<vvv^^<vv<><><>^<><v><^<<v<<v><v<>><<>v^v<><^<vv^v><<^v^<<<>>^>><>v>^><^>v<^<><^vv<>^<<><v<vv><>>>>^^v<>v<^v^v><^<^^^^<^<^<>^v>v^<^<<^v><>>^>>vv>>^>v^v<>^v^<<vv>vv><^v>><>^^>>v^^^<><>^^^^^^vv^^>>>v^><^^^v>^v<^v^v<^^>>>v^>^<<v<v^v^>^^^<><><v>^vv<vvv^<v<<^^<^^><v<<vvv^^<<v^^v>^^^v<<^<v<v>v^v<<vvv^v<^<^<>^v<<<vv^>v<^>^^^>><^v^v^<>^^^><>^^v<>vv^<v^<^v<^><v>v>>^><>v<<<>^v>><<^>>v^<^>><v>^>^^^<v^^>^v<^^>^vv<^^v><>><<><><<v>>v<v^<^^v>v^<vv<<<>^v^vv><<<^<<>v>v^^>>v>^^^^^<v^>^>>>><>>^v>v^^>><^<<v^<v<^v^v<>^<v<<>^>vvv>v<<>vv<v^>v<v<v^v^v^vv<vv^^vvv<v>^<>^>^<^<v><><>^>^>v<<v>^vvv>^^^><^>v><<>^^<^vvvv^^<v^v><<vvvv^^<v>><>v>><<^vv
v><^vv^<<>v^v>>v>><v<>^vvv^v>>^v<^<^<vv<<<>><>^v>><>v<v^<>v^v<>v>><>v>^vv<^<^v^v>^^^^vv<^>^>><>v>^^vvv^<^^>^v^<v^^<<><^v>vvvv^^v<>v>v^>v>^<vvvv>^vv>^<v^<>v^<v<^<><<>><v>v>>>v^>><<^>^v^>>>^<>><>v<<v<v<<>>v><^v>v^vv<<><^<^v><>vvv>>>>>v><<v><^<><^>v^>^^>vv^v^>>>^v>^<v<>vv><^v><^>^<^><<vvvvv>>><^>^<<><^v<<>^<<v>vvvv<v>^<><v<^>>^^<><<v^<>>>^v><v^<<>^v^>>vvvv^<v<><^>>>>^^<<>^v>v^<v>^vv<>^^v^>^<v^>^<<v^<>><^<^v<<>>v><^v^>v>^>>v^<v^<^<^>v^<v>v<v<v>vv<v<vv>><v>v<<>v<^^><vv^^><<^><<<<><v><^vvv>>vv>^^vvv<<v^^<v^>><vv>v>^v><>^>>v^>>v^^v>><^^vv>vvv<>>>^^>vv^vv>v>v^>>^^<<<>^>v>v>>v^>><>>>^^>>v>^>^v<<><<<v><>vv<v^<<>>v<^v>v<<>v^vv^v^^^^<<<<<<<<^^>^>^v^v^^<vv<>^>v<^v^><<v<>><^<>^<<>^v^^v<<<>vvv<>v><vv<^^^v^vvv^vv<v><^v>>^vv>vv^v^>vv<^v^vv>^<<<vv^v<><v><<^>><><^>>v^><<>v><^^v<vv<^vvv><v<><>>><<v^^v^><<vvv^>v<^v>^^<^^v<>vv><><>^><v^v^^^>v>v>>^vv<<^v^^vv>><^^<^><^>>^^>^><^<^^>v>vvv><>^<>^<>v^<<^<^<^^v^<>v^^>v^>>>^<^vvv>>^^<v^^>^<>>v>><v<v>^^^^^^^><v<v^^<>v^>>^>v^>vv>^<>^<vvv><<v<<>>>v^<>vv^v^<^<<^v<<><v<
vv>^<>><>>^v<^>v>v^>v^><v^>>v^>^<^^<>>^vv>>>><vv<^v>^<^<<^<vv<<^<<<>>><<v<v^v^^<^>vvv<<>^v>^^^v><vv>vv<v<v>^v^vv<<v>^<<<<^>^<<v<v>^>>>^vvv^>^v<v<v^vvv<^v<v^^v<v^vvv<>^v<v>v<vv^<><<<>^>v<^^v<>v^<<><<>><^><^<^^>>>v><vvvv<^^v^>^^<v>><<>^v>v><<v><<>^^^v^>vvv^^<><>>^v^>><<>^^>><^^<v^^<<>^<^v^^><>vvv<>><v>v<><v>>v>^><v^><>^<<v>v<vv>>v<<>>v<>>><>>>>v<^^<^^v>v><<v>>^><vvv>>>>^^<<<^^<v>>^v^^<<>^<>><<^^>>vv<><^<>v^^<<^^>^^<<^^v^>><<v>>vv><^v^^<<^<<<>^v<^<^><><^^v<^vv>^^>^>^><<><<v<<^^>>^^v^<^<>>v>v<^<^>v^>v<^><<>^<>vv>^^>^><<>>^^>v^<^>v<<>vv^<<v>v^<<><><<^><v^^<v<>vvv><^^^^^>v<<<<><v<<vv>>v<<^v>^vvv^^<vv^>^^^v<<vvv><^vv^^vv<><^<<^>>vv<<<^^>>^^<^<^<>>vv>^>>^^<<<^v^<^>^>><<<v><^<^<>>><v^^v>^vv><<v^>v^>^vv^<><<>v<vvv<^<^^^<^v>v<^>^<^^^<<v^^v>v<>>^>^><v^v>>v><^vv<^>^>v<v<^<vv<^v<^>^>^^>^<v^>><<^vv<v<>^v^>v<<^v>v<^^<>v<>v>>v<v^^v^<<^v>vvv>^><^>^>^v<^<^^^>^>^><<<^^<>v<><^vv^^>>v<^vv^^>>>>^<^<v<^^v^><vv>>^v>v>><<<>^vv^^v<v>><<^>v>v^<^^v^vvv<><<<<<>>vvv<<>^v<>>>vvv<^^^>>^vv>^^<v^>^<v^<>^>>><>><^><^<v<^v
<v<v>>>><<>>^^><><>>^^v^vv>^>^>^^<<>><v^v>v^^v>^><<^<^v>v<>^>^<<>vvv<v<>>v^<^<vvv^<<>vv>>v<v>v^>^<>vv<^<><>v>^>^^v><^^><<<v<v^<><^<^^v^<vv^<v>v^<v>>^<v^<^<v<v^<<>>v^v><<^<<>^<>>vvv<><v<>^<><<vv^>>>^v<<>v>^<<<<<vvv^>>>^>^<>v<>>^^v>^<^<><<<v<v<<^><^v<<^>v^^vvv<<vv<^>vvv<<vv<>>><vv><<v^^>v>^vv<<>v<v>>^<^^^>^v^^>>>^vvv<>^v<<><>vvv><^^>>v>^<^>v^<v<^^^v><v>><^>>><^v><^<>^v><^<>>v><>v^^v><v^>v^v><>vv><<v>vv^v^vv^vv<^vvvv<v>^>^>v^<^<vvv<v<>^<>^^v>vv>^<><<v^<v^<v>^^^v>>v<^>^v^<^v^<^v>^v^v^v^^><v<>vv><<<vv>v^>>^v^<v^<<>>>><<>^<<vv^v<v>>>vvv>>><vv^>>v><^<^<^v><v<vv^<>^^<><^<><<v^v<vvvvv^<vv<vv>v^>v><v^^^^v^<^^^vv<^<<>v>v^><^v<^<<>vv^<>>>^<<v<vv>>^^<vv^v^><v^^vvvv>vv^v<^<^^<<<<^^^><>>^vv^<^>>v^^<v<^<^<<>^v><<<<vvv^^v>^><^v<<v^<>>>>v^v^v>v>^^^><<v><v><^>^^^^v<^^v>^>^v^^^>v^<<<vvv<v>^>vv^>v^<<v^^^><v^v<>^^<v^^^><><^<<<^^v^^>v^<v^><v>>><v>^>^^v>v^v^<<v^vv^><><>^^>>vv^<>^>>v^><>v<vv>^^<^<<^<<<^^<vv^^<^<>^^<vv>^v><<^<>vvv^v<^^<>v>v<v^v<>>^<^>^v>v>v<<<v^v<>v<<^>vvv^>v^v>^>^<>v<<^^<>^>v^vv><v^<v^<v>v<^<>
<v<^<><>vv<<>>^v^v<v^>^v^^<vvv^>>v^^>><v^><<^>vvv<<<>><^>v<>^<vvv>^v<^v<vv^>^^v<<vvvv>^<>v^vvv<<^v^^<<^<>v^<>^>v<^^^v<^^>^>v><<>^<<^^><<v^<^^^<^<>>^^^v<<>>v^^<<vv<<>v^<><^v^^v>^><v>>v^^vv^^>^^^>^<^v<<<v^^>>v^><^vv<v<^^^>><v^vv<^v>>v^vv^v><><>>>v><vv<><vv^>>v^<vv^<^>>>^v<<^<<>>v>v<^^<<>^>><^^^<vvv<><^<<^<>v^>>vv<v>v<<<><vv<>>vv>v^^<vv><v><vv><^>>>^<>>^<^>^^<>>v<^<vv<v<<v<<>v>><^>^^vv>^v<<^v^^v^>^><^^>v>^^<^v^<>^><<><>^>>><<^v><v^^>^^<v^<<<vv><><>>vv>^<vv^v<<v>v><vv^^vv^^v><>>v>v<>>^^><^<<><v<^^>v>^>^v<v>^^^^<>^>^>^><>vv<^vvv>^<<>v^v>vv>^>><<<v^<^>^^<>^<v>vv<^<^>>>><vv>v^>><v><v>^^>v<<^^vvv>>>v^^<^^>v<v>>v<<^v<>^v^>>v>^<<>v>v^v>v>>>^v^>^^v<^v<^<<^<>>>><><v^vv>^><^>vv^>>>^^vv^>^v<v<<<^<<>v^><^<v>^^>>>><<><v>>>>v^^>v^<vv^>>^>v<<<><^^>v<^<v^^v><^>>>^<v>v<><>>^<<<<^>>v^v<>^>>^>^<^^^^^<v<<<<^<^>v<>v<<^v^<<^^><>^>^^>>^><v>v<^vv><>v><>>^v^<>vvvv<v^<v<><^v^v<v<vv><><vvvv^^<>>>v<>><<v<^<v^<<<>v<>^><>v<><<<><^<>><vvv>v^>^v<<<<^<>>>>v^v<^<^^^^>^^v><<>vvv^>>v>^>>v^^v<vv^><>^^v>v<vv^^v<^v<<v>^vvv^^v^
<<^<vv>^^>v^^>^vv<^<<vv^><<^><<>v>v>>v><>><^>>v<v>v>v^>><^>v>^^><^>^<><^<v^<<<^<<^<><<>^v><<^^<^<v<>v<^<^v^^v^>v<>v><v>>>^^vv^><v>v>v^<v^v<^^><^^^>^>^^>^>>>v<<^>vv<><v<<<^v<<<>^v><v^vv>v^vv^^v^<<<<<>><>><>^>>v<v^<^><^<vv<v<^<><<v<v^v<^^^>><><>^v><^^v>^<v>vv<^v^><v<^v<><^v^^>>>>>^^<>^^^^><<vvv^^^<v<<v<<<<<^<<^<v^<<<<v^>vvv<>><<^^v>>v^v>>v><>><^v^vvvvv>^<vv><>>^v^v>>v>><<><v^^v<<^<<^^>^>^<<<<v<vv<v^<v>^^>^^v^<v^v^<><^>>^<><<>v<<<^>v<<<v>^^><><<v>v^v^<^^v<^>v^<^v><^^v><>^<>v^^<v<^>>^vv<>^<v^><^vvv^^>^><>^>^vv^v>v><v^<v><><>^<v<v>^vvv><>>^^^<<<^>vvv>vv<v>^vv<<>>>^^<vv>>^><>><v^<>^^vvv^vv><v^<^v<v^^<^><^^<<>>v>^^<^^^>^>v><v^v<<<<>v<><<<<<^^>^<v<>vv^>>><v>>vvvv>^>>v^>>><>v>^><^><<>v^>>>>v>^v^<<>>^v<^>v^^^>v><^><^^vvvv>^<<><>v<v><>><v^v^v<><<v<>v^>>^^v<v<<vv>>>>v^v>^v>v<><vvv>^^<v^v><<vvv<>v^<^v<>^>><>vv<>>^v^<^v<v<^>^vv<vvv<>v^<<<>^^^v^v><v><vv<v^^^^vv>>^<vv^v>vv>v^><<><^^^<v^<v>>^^^><<<<<>^^><<<><><v>><v>>v<^v^<v^vv<<^<<<>^<^><>><^>v^v<v<^^<<<<<>^<>>>>^vv^<>v<><<^^><<>^<>^><>>vvv^>vv<>><>><
>vv<^^^vvvvv<v>><>v><<v^><<>v<>^>>v>^>><^<^<^v<vv<^<<^^v>>^<>>^^>><^<^<<v>v><<<vvv^vvv^^>^><<<v>>^>^v^vv^<vv^<^>^^^^v^>^>^>><>>>v>v^>>^<^v<v<<<<v^v^^^v<<>v>>v^^^v^>^v>>v^<><^v<^<<<^>vv^^<<>^v>^v<<^<^^^<<>^<>^vv><>><>>^<v^v<>>^v<v^>^<<<^<<<><>><>v>^<<v<vv^v<><v^^^><<^>><>>v<<v<^^^^>>v>^>^v<<>>vvv<^<>>>^v^v<^>^^^^^^v<v>>>>v^^v^<><>^>^<^^vv^>v<>v^>vv<^^><<^<>vv>^v>>><<^<^^><>vv<<>>><<v<<<<><>^>>^<<>^<v>^<v<^^>^^>>>>^<v^<v<^<<v<<>v<^<vv<<<<^^>^<<^^<<v^v>v^^>^v^>>^v>>v>>><>vv<v^^v>^v<^vv^^^<<^v><>^v><<><vv^>^^^>>>v<^<^><<^^<<^^><<v<<><^v>^v^<^<^<>^^<^v^>v>>vv<<<v<<>v<>^<^v<>^v<v<<>>>v<v>^>^v^>>v<><^^^<^>><^>>^<^^^^<>v^^><^^><v^^v><v^^v^v<v<<^>><<<<v^<v<<v>>>^><<vvv<<^v^v<<<<<<<^>v<<vv^^<<^^^vv<vv^>^<><><><^<<<<<vv>v^v<<<^<vv^vv>^<v<^<^^^^>^<>^>v<^>^^^<^^><>^<<v<>^>^^v>v>>>^<^>v^>v<<vvv<>^^<^vvvv>v^><>^^><^^<>><^<v<^>>v>vv>>^><^^><vv^>^>^<<v^v><v>^^v>><>^<v<^<<>^<^<<<<>^v^v<v>^<^^<v<<<vv>v^<v<><^v<<^^>>v<>v>>v>>v<<>^v^^^vv^v<^^^>^<<>v^^v^^<v>>>>v<v>^vv<<<v^>><^>>^v^>vv<<>>><<v<>v<v<<v>><><<<
<vvv><v<<<^<v<>>><<>>v^^<v^vv><<>v<^<><<<>><^v^<v<<><<<>>vv<^^<>^<^^>^^<v<<^v<>^^v^><^>v<><^^^^<<<><<<^>^^>^v>^<><v<v>v^<>>>^v<<>v><vv><^><<>v^v>v^v^vv<^>^<vv^v^vv>^<<<<<^v><^^^v<v^^vvvv>^><>>>vvv^><><>>^>^>>^v>>vv<v^^>v><<<>>^<>>>vvv<><<>>^<<><>>v^<>^>v^v<v>v<<>v>v^>^v^>^><^^>^><^>v>^<<<>v<^><>^<>><^<<>^^^v^<^vv>>><<>^<^vv<vv^>v>^^><><vvv<^>^>>v>vv<<v<v>vv<vv<v^>^vv^>vvvvv>v<v>^<>^v>>>^^>v<<<vv<vv>^<>><^vv^<<>>vv>v^<^v^>><vv>v<v>v><>^^^^^v^>><^v<<v<v>vv<v^^<vv^>^^^>><><<v>>>v<>>vv<<<v<^><<<>^<^<^^<>>^vvv<<<v>>vv<><>>^>vv>^v><v^>><<^^>><<v>^<^v<<<>v^<^<<^^<<>>^^<<<^<vv>><^>vv><^>vv>v>^v<<^<^v>^<>>>^^^<v^<>v>vvv^>><<^^>^v<^vv>^vv<>^<v<><v<>>>>^><<<<^v^>v<^v^^vv^vv>vv>^>^>^<vv>>^^v^<<<>><>v<vv<vv^<><v^vv<^<v^^^v^vv^v<><^<<<>vv^>^<^v^v>><^><^^^>vv><^^v<v^<<<v^<^^^^^<<^>^^<v><<v^<v<^>>>^v>>v>^<^^>>v<>^vvv^<^<<<v>>v^>>><<v><^>>vv>^v>><><^>vvv>^v>^>>>^^^vv<<^vvv^^v>^^v^<<>v>v>>^^v^>v>><<v>^^^^v<^^<<<>><v^<><<<><v><^v^>^>v^>>>v>^^>>v<v>^^v>^vv^<<<>^<<^v<^>>>^v^v^>v<^^^>v><<^v<<<^v^^<^v^^<<<v>
^<<>^><^<<>vv><>v<>vv><>>vvv^>>^<><^^>v<^>^^<<^^<v<<v<v^>v<^^v<^v<v<>vv^^v^>v^>v^>>v>>><<<^<v^^v>^<v^v>^vv^v<><v><v>v>^>>>^>><v^<>v^^^^>v<<v<>^v>v<<>>>><v<<>vv>v><<><v<>^v>v<><vvv^<>><<>^<<v^>^<><v<<<<<^v^>v<v^<vv^><<>^<<vv<>vv>>>v^vvv>>^v<^^<v>v>v><^>><^>>v><v<^^^<v^>v^<v>vv<vv^v^^v<^^^>>><>vv><vvv^><><^v>><^>^vv>>^^v<>^<v<<<^>v^<>^><^>v>><>>><>v<^<v^>>v^<^^>v^v<v<>^^>>v^><>^<vvvvv<^>v<v>>><<^v>v><<<^v^><<^v^^v<>v>^v<<v<<^v^^^>>^<^>><<<v<v^>v<^<<v><>^>>>^<^v<^<<<>^^^<v<vvv<>>>>>v^><^<^<<<^><vv>^vv<>v^>vv^<^><<>><<><>><^>^<>>>v>>>^^>>v<v>v>v>vv^v>^v>^^<>^<^^vv^^v<>vv^><<>v><<^vv^^^><^vv^^<^^vv<<>^>^v<^v><vv>>v^<<>><^<v>>v^<<<<<>>^^vv<^v<>^>>><>>>>^vvv<>><^^>^v^^^v^v^^^v><>^v<<^><^>^>>v<^>vv<>vv^^<^vv^><^^vv>^v<^^vv>v><><<<>^v>^v>v^^v>>v<vv^<v^>>v><<v<^^^v<<>v>>v<v<<<>>v<v<<>>vv<v<<<^>>v>^v>><>>>^^^^<><>>>v<^<<vv>><>^v<vv>^v^^v<><^^v^^<<>^v><>^<v<^^v>v>^^><v<<<^vvv<vv^><^>^>vv^>^^^<<<>><<v>>v><<<<vv>^vv><<^^v>>vv>v>vv<vv<^^>^<>v>v<v<^>>^^v>^v<<^<><<^>^^^<<<^^>vv<v<^>v<<v>><<^v><>><<<<^>
^^<<^^vv^^v>>^>>><v<>v<vv<^><^v^^^^>v^><v^^v^v^^<^^><<^vvv>v^v>v^^^^<><v^<vv^<<><v<<<^><><vv>^>vv>v<>vv<>>^^<<><^^^v<^<^v><<^^<v<v<v<v<v<><<<<v<^>^<^>^^<<v^^^>>vv^^^v<v<<>><^<>^^vv<>v>>^>>^v^><>>^<>><v><>v^^<v^^^<^v<v><^><>^^<v^<<<<^vv<vv<<>>v<>^><vv^vvvv^v^>^vvvv<^<^^<v>^v^>vvvv><^^<vv^>^>v>^^<v^v<>v^v^^^>>>v<<^^^<>^^<<v<^v<^>^>^vv>v<vv^^<^<v><^v<<^vvv<>^>v<v^^vvv><vv^^^><><^<v^<vvv^<v<>vv>>^v>^vv>>v^<vv<v<vvv<v^<v^<<v<>>^<>^v>^vv^v>vv<^^^<v><<^><<><v^>^<<><v>>>>v^^>>><^^vv<>v<v<^>^<v>v^^v^vv^<^^>^>^^v>>v^<^<vvv^>^^<^vv^><v>v^>v^^v<v^v^^<^<^v>^vvv<^<^>vv>v<<v<>v>>><>>^>^^v>v<^>^<^>^^>^<vv>^<<^^^>>><>^<>v><^v>vv><><>>v<^vv<<<v<v>v^v^^v^vvv<>^v>v<^v>^^v<>>v>>^<^v<>v<^v<<v>>>vv>vvv<v^v<vv>^vv^v^^vv><<^v^vv>>^>><>vv>^v>^^><<^>v<<v^><<><><<v^^vv<>v<vv^><><<<v>^v><>vvv>><^<^v>v>v^<><^vvv<<v>^><>v>^v^<<>><^v>vv>><>v<vv^>v^^>v><^><>^<><v<>vvv>^v<v^v^<>>^v^v>v>><v<v^<^<v<<<<v<<^v><>vv^><<<>v^>vv^>><<<^<v^^v<><><<<^><<<^^^<>^>^<vvv^v^>^^><^^>^>v^v><v><^v<^^<^<<>^<^v<<>v^><^^>>^^v<^<v<>^><>>^>^^
>^>v<<v>v^^v<><<>v^v>^^^^>v<<v>>v>>><v<<v>><^^>^^v>><<v<<^^<v>^<<<v>^v<<v<v>v^>v>v^^^<^>v>>>v^^>><v^vvvvv<^vv>v^<^<^>>>v^v^>^>^>^^><^>^^^<>^v<^<^<vvv<>vvv<>>>^v<^^>^><<>v<>>^v<v<<<^>v<^v<^>^v<><^^^v>><v<<vvv>>v>^><<<>^><<>^>^^<v>>^^v<vv<>><<^<>v<vv<^<v^v^>vv<vv>v><>v^^^^<v><>^v^^vv><^^v><^<><<<^^<^vv<v<vv^>^^>^<<<v>^^^v>>>^^v^>>v^>v><><>^><^v>v^<<<^^^^<v>v<<>><<>v><><^v^^^<v<v^v^<<^<^v>v>v>^<<^>><><>vv<^v>v<>><><>><>v^vvv>^<^v<><v^v<<^<^>>v>vvv<v<>^<v><v^><^<^<<<<^<<^^^>><v><^>^v^^>v<>v^^<<^<>>v><>>^^^<>^<^^>^v^>v>^v^>><^><><v<>>v^^vvvv<vv^<v^^v^^^^v>^v>^<<<<>>>v^>^vv^^^^>v^>><>>^^>^v^v<<<v>>>v^><^><><>>v>^vv<<>v^>>>v<v><>v><v^^>>>^<<>><<<>><^v^v><v^v<<^^^>>v^<<<<<v<<^<<^<^<^<>^<^v^v><<><><v^<^<>v^^<<<^<>v><>v^v>v<^v^vv<v^<<>^v<<^<^>vv><>^<><>^>vv>^^<^v^>v><vv>vv<vv><>>>>^v<>v>>>>><vv<<v<v<vvv<>>vv>><><<>^^vv^vvvvv><<>v><<^<^<^>v<vv>><<^<<^<^^<^v<<^v^vv^^>v^^v>v>v>^v^^>vvv<>^v<vv^v^<vv^>^^vv<<^>>><<^<>>><^>>vv>^v^<<^v<^<v>><^<^v><>v^v>^<<<>v^v>><^>v<><v^v>>^^><v>>><^>^>>><v><<>^^>>^<<<
vvv>>^vv<>v<^<<><>>^><vvvv>v<><>^<<vv^v^^>>v^>>vv<^>vv<<^>>>v<v>^v^^>><v^^<^^^><^<vv^>^v^>v^v><vv>v^><^v^>>^<<>><v<<><>>><^^v<<>><<>v^^>><<v<><^>^v^^<^v^^v>vv^v<>><<^^<vvv^<^>^vv>^<<<^><^^^v<^>^<<<v^>vv^<>^<<<<<v<^<<^<v><>^<^<<<><^>^<^^^^>vv<>v^v>v<>^v^<<><v^v^<>>v<^>^v^v^vv>v><>^v<<^>v^v<<<>^<>v>v><>>^<><v>v<<v<v^^>v<<v<><^v<><<v<v<v<>^v<^vv<^>>vv>>^v><<>>^v><<vv^v^<<><^^>^v>^^<vv<<v>v><>v<^v>><<v<v>>vvv<>v>><v>>^v>^^^vv<<<<^v^<<v^<<<>>vv><^<<^<<<><>><^^>^^>>^<>^>>>^>^<>v>v^>><v><<<>><>>v<<<vvv>^>^<>^<<>^^>vv>>^<<>^<>>>>><>>>v<><v^<v><<^>v<<<v><<<^^v^vvvvvv>^^<v^><><<<<v<vvv^^^^v^^<v<><v<^^v^^<^^v>>^^v^v^^<v<v<vv>><>>^^^^^>>^>^^^v>>>v^>^<<^vv>^^<<^^^v<^>^^<><v^<<<>^<><<v^^>^^>>>>>v>^^v^^^^<><<^v^v>^v<^vvv>><^v>v>vvvv<^v<v><v^^<<<<<^v<<vv<v>^<^><<vv<>^<^vv^^v>>>>v^^v<>vv>v>v<<v<v^<vvv^^><v<<vv<<v<>>><<v<v^<^vv>>><><>v><v^<^v^^<^>>^^v^^>^<vv^vv><v<<v^v>v<^^>^v>v>^v<<^^vv><^>v<vv^^<<v^^^<>v>^<<>^v>>v<^^^v<v>>>>>vv<<>^v>v^<>^><><v<<vv<vvv><^^>>^^<>^>^<>>>vv<<<^^<<>vv><^<v<v<<^>^<^>><>v>^<
<>v>^^^^vv^^<>>^<^>>^^><<^<^v>^^^><v^><^^v^>v<<<^v<>v<v>><^>^v>v^>><<v<^<^v<v>v><>^<><>^>v>vvv>vv<<>>^<vvvv^<><><v^<<v<^>>v>>v^<<><<^^>v<vv^<^<<^<v^<<^^v<><vvv><>><<<<<>^>>v^>v>vv^^<v<><>v^<^>>^^^<^>>^<<<<<vvv^>><><<<^v>>^><v>><v^<^<<<vv<<>v^<<^^v<>^<^^^<^^<><>>>>>>^v^^<v^>v><>v^^^v><>^<>v>^^v>vv>^<vvv^v<vv>^>vv<><^>>^<^vv^>>^^<^^v^><^^<>>>^<^>v^vv^v><><<<><<v>>vv<^vvv><vvv^>>^^v<>vv^^v^<>v^vvv^vvv^^v^>^<><>v<v^<^v^<<<^^<^^^><<v<<>^v<>>v<><^<><<^^<<v^^<vvv>>^>^v<>v^<<^>^^>><vv>>vvv^>v<^><^v>^v^v^v<>v<><v<<<^vv><>v^><^^>v^>v^>^><>><^><<vvv><v^^^^>>v^^vv<^^<>^<^>vvv<>><>^^>><vv>vv<v><<v>v<v^<v>^>^<^vv><<><v<<>vvv^<>^^>>>>^v^v>>^v<v<<^^<v^^^<<<^>^vv<>^<>><<<>vv<vv<<<>v>^>v>v>v>^<^><>>>>><>^>^<>vv>v<v^<>>^<v>>vv>>^>>>^><>>>vv^>v^^v<<<>v>^>>^>><><^<<^^<<vv<<^<<^v<^<<^><>vvv>^<vvv^><^v^v><>>vv<vv^^^vv>^<vv>^>vvvvvvvv>^v^^^>^<vv<vv>>^^<>^v<<>v<>^v<<v^>vvv^^<vv<<<^v^>^vv>><<^<^v^>vv<>>>>^<<>><<<<<<v><v<<^>v>^>v>vv<<vvv<><<^<v<<<v><^><<>^v>>^>vv^v^<vv^<>^^><v^v<<vv^>vv^v>>v><^vv^^><v<^v^<vv^<^^
^>v^v<<<><^v^vvvv^>><>^v<>>v<^<<^v^vvvv>^><^><v<><v^>^v^v^<>v<v><>v<v^vv>>^^<<^^>vv^><v><vv<<><^v<<<vvv<<^vv<^^<v<^<v>>v^>><>^><<^>^v^><^>^^<>v><>^<<v^<<^^v^>><v^vv<^<v>vv^v<<><>>v^^<<^v<><^^v>>vv>v<<><<^^>><>>v>v><v<^<^<>^<>v<<><><v>^>>^^^>><^v^>v<>^v^>^v^<<^<v>v<>^><<v^<<vvv<^>>><vv<>^><^>^<<<<^<v<vv>v>>v<^v><v<<^v<>>v^>v^<<>v>^<<<^><><^^vvv><^v^v<><<^<>^^>>v<<^<^^<^^^vvv>^vvv<<v<><^<<<>^^^><<v><<^^><^^^v^v^><^^^<<v>^v<vv<<^<<v^<>v^<>v>^<>v<v^^v><^>^<^<v^^>><^<v^<>^<>v>>v^>v^<>>^v>><<^<^>^<^<^v^>>^<v<<v>>>^v>v<^^<v<>^>><>^><<>^>^>>v<^<vv^^^<>vv^v>^^^^v<v^v>^>^vvv>>^^v<v<v>>>>^>^^v><<^v>><v><^>^<^>^>^><vv>v<<<<v><v<>>^vvv><<v<^v>>^>^>v><v>^<>><v<v<>^^>^vvvv>^^<^><<>v^<^v^v>^>>^v^<><><<<<^^>^>^>>><><^<v^>^v>>v>v<<>^^v>v<<>^v>^>>v<^^<^<<v>v><>^>^v^<vv<^<<<^^^v>^><>>>>^v>v^^v>^<><^v>vv<^v^<>>^<<<^><^>>vv^vvvv<^<<^>>><v^^^^^<vv^<><^^>^>v>><<<<v^^^v>v>v>><><<v<>>^^><<>v^<><^v<^<>^><<<^<<<>^>^^<>vv><>v>v>>vv^v><<<vvv>>v>>^>vvv<^<^>>v^<<vv>^^<v>^>^^>v>>>v^<v^^v^<<<v<>v^vv>><>v<^<^^<^>>^<>vv>
v^<^v^<vv><<v^<^<v><^v<vv<v^vv^^v>><<><v>>^<<v<^>^vv><^>>>v^>v<v^<<v>v<<^>v^v<^><v<>vv^>>>^<vvv>>v<^><^>^^>>v^^v>vv><<<<>v>v>v><><^<<^vv><^v>v<<<v<^v^^<>^<v<^<v^<>>>^^<^v>v^>>v^vvv^<>^<v><><<^<vvv<>^v>>^vv^v><>v<>v<<vv>v^<>><^^<v^^>><>><>^><v<>^v<<><>v^<>><<^v><^>^>>^^^v^<^<>^v><v>^<v<^>vvv<^>^<v^>><><^<^^^><^^v>><v><^<<><v^>^<<^>^>>^^<^><<^<<><v^v>v<<v>^<>>v>>><>><>vv><>><^^^v<^>v<^v>v^v>><>v^<v^v^v<^>^<^<<><v^^vv<<v<^<^<<v>^<>v>^<^vvv<^>^^>^<^^^v^v<v^<>^>v>vv><><<><>v^vv<><>><v<v>v<^vv^v^v<^v<v>><>^>>v^>>vv><>>vv^v^^<vv<v<<^><^^^>^><<<<><<v^>><>v^v<>>vv>>>v^>v<><><>^<v^v<>v<<v>v><>><^<><^^<^>^<^<>^<<<v>vv>v^^<^vv><v^^^>vvv>^v>^<v^<<>>^^<>><<<><^vv^v^v<<^v>vvv<^>><vv^>>><<v>>v>>vvvv>^v<>v>v^>v>v^<^>^><^>^^>^<<v>>>v<v<>^><^>>>><v<^v<^^<>^>>^v^v^>^^>^>v>>^^<>><>v^>>><<><^<<^^>v>v<^>^<v^v>v<>>><v>^>v^vv^vv>>^^><v>><>>>>v<>^^^^^>>vv<>>^^>^>>^^^>v>^vv<<v^<>v<<^<^vv<<v>^^vv<>vv>v^<>vv^^<<<v<^<<>v<^><<^<vv>^^><^v<<><>>>>v<v<^^v<>^v^>>v<^>>>>>>v<^>>^^v<>>>^>vv<vv^<>><>^^^<>v^^^v>><<^v>^^^v>^>
^v<<<^<>>>^^v>>^^<>^>vvv<<>>><>v^<>^v>^v><^^v^<^v>^^^v><<vv>vv<>>^>^^<>v<<<>^v<^>^^v>^^<v^v^<<>vv><^^v^v^>v<<><><v>v^>>>v><v<v^^>>vv^>^<vv>><<<^>^>vv^>v><>v^^>v<>><<^<<^v>vv<<^^^<^<^^^vv<v>>>><<>^^^^^><><<^>>v>^^<^vv^v^^><<^>>><^vvv^<^vv>v^<v>^^<<^>^^<><v>^><^v^<>v<v><><v^v>>v<><v^<<>>^vvv><^>v^<^^vv<>>>^<>v>v>^<^v^vvvv>^^<>v^<v>>^v<v><<^<>v^><^^><v><^>>v>v^vv<<v<>^^^<>><<^>^v<><v^^>^v><^>v^v>>^<<^^<<^>^><><>>><^<<v<<v<^^<^<>^vv<<^^<v^<^<vv^<v>>v<<>v^v^v>^<^<<v<>^^^v><v^vv>v^><<^^v^v>^v^v^<^<v<^<<>vv<<vv<>>^v><^v>><vv<<^v^v^vv>^v<^^v><<^^<v^^^<^<v<^v>^>^^v><><v<^<><<^<>^<<^^^vv<>^<>>>^^<v>^^^v>^vvvv>>><>^>^>vv><v^vv<v><^v^v>>>>>v<v>^<>v^^v>>>>v<<><vv<v^>^^^^<^><v>v<^><<>vv>^^vv<v^v^v>><>^^<>v>v>v><>^>^v>>>v>v^^<^>>^<v^<<>>>>v>^^^vv>v>vv<<<<><>vv>><>^v^<<^>^>>>v<><v>><vv<<v^<vv>^>vv<>vvv<v^>v^>v<^<vv><v<vv^><v<^>^<^^v<>vv>><v<^^<>>^><>v^v<><vvv<>v<>^^v<><v<>><v^^v<<>^>>>>v>>^>v^^^<v>v>><vv^>>v^<v><>v<^>><<v^^><vv^<^>><<^<v<v<v^^^v^^v>^^v<<v<>^^<<^>v><vv^<<><>^v>v^v^^>^<^<<><^<<v>>v>v^^v
<^vv<>>>>^>>><^<><<^^<<^vvv<^^v<<^<<>v>v<vv^<<<><^^^v>v^<>v^>>v^v<^<><^^^v<<vv^^>v><^<^<^^^<v>>>vv>vv<v^>vvv<<<^v><<<<^v<<>^v<>v>v<vv>^^><^>>v>>^vv^v^v^<<v<v^<vv^<v>v>v^<^v<^>^<^<vv^^<<<<^<>>>vvv<>>v^v^><v<>><<^^>^^^>^v<v<^<vv>v>>v<><^vvv>>v<^^v<>>^^^^vvv^^>>>^^<v<>><v<<^>>><^<><v<><<^v<<^<^v>><<>^<><^^v^^<^^^<><<<v><^v<<<>v<<<>>v^><><v>>>^^><^v<<><v>>><>>v<^^<^^v>>vv^><<^v>^>>v<^^vvv<^<>^^^^^^vv>><<v>v^^^<^<v<>v<>^<^<vv^<v><><>vv><vv>>v^v<v<vv^>^<<<>>>v>^^^v<v>^vvv>^^<>^v^<^^<<^^>vvvvvv<>><<v^^<><^<^^^<<^v^><>^^>v<v^v^<^vvv^>>^v^<>^>^><<^>vvv>^vvv<vv<>>^v>^>v>>^v>v<^>v<v<<><v>v^>>vv<<><><v^<>><^v^<<>vv^v>^<<^vv>v><<vvvvv<v^>v<^vv^^>v<><v<^>^<^v<v^^>>v^v^vv^^v>v<><<^v<v<<^v>>v<^>v<v<v>v>>^v^<v<>^v<>>v^<<v>><^^<^^^<>><<<<>v><v<^^<>>^^<><^^v^<^vv>v>^v^<>><>^^>vvv><v^>^<>v^<<vv><v<vv^><v<<<^v<^>v<^v><<^<>^<<v^<v><^<^<v>^<<v><v^^<>><>vv^v^^<<v<>vvv^^<><<v<vv<^^^^>^v>>vvvv>><^><<<<vvv><<<vvvvv>v<^^<<^^v^><<<^<^^^v>v<>^<vv>vvv>^v<>>^>^^v<v^<<v<^v>^<v><vv^<<^v>v><<^><>vv<vvv^v>>v^vv>>^><v<v><
v^^v<><>^<<vv<><v^v<>^<<vvvv>^v^vv^v^vvv^>v^<^<>v^>^>^v^^v^^v>>v<>^v<^^<>^^^v<><^<v^<^>>>^<><>>^v^^^>^v<^<<>v^<><^><v^v^vv^v<vv>>vv^^v^><<>v>^<<vv><>^^><vv^>^v>><^<>^<>^^^^v<>v><v><<v^v>v<><^v^v>>v>>vvv<v^<v<<><v<vv>vv<^<^^v><^<<>^^^<v>>><<v^^<<<<^v^>vv>v^>>^^<>^<<<^<>^>^^><<>v>^><>vv^vv^<v<v>^^^>>^>vv^<>v^>>^<>v>^^>v^<^><<<<>^^v^>v^>^<^>><^>v>^<v<^<>^<<^>>><><<<v<v>^v>^v<v<><v<<^>v<>^>>^^<>^>v<<<><<v<^^v^v^v>><<v<<<<>><>>^vv>^>>vv^vv<>^>^<v<v^>>^v<><<^v<v>^<^v>^v<^<v<v<v^<v<<>^vv><v<v^^<<>>^vv>v<<<^^^><>>v>>>>v<>^<<v^>^<<^^v>>v^>v<>^>^<v<<v><vv<v<v<>><<<>^<>>v<<><<^v^^<><>><vv^>v>^vvv>><>v<><^>^v><<>^^>>v<vv>^><><>^^v<v^<<^<<>><v^>v>>^>^>^>>^<<^vv<v<v<^vvv^v><^v>v<^<v^^^<>>>^<v^^vvv>^^^>><>^<v<v^vv<^v^<v<v><<>vv>^^^>v>><v>v^>><vv^<^>>>v<><>v>vv>>><v<><>v<^<^v>>>>^vv<^^vv<><v><<>>v<v<<^<<>>v<<<^v^>v^>^^^>v>v<><<><>^vv>v><<vv>v<^<v>v^><<>v>><><v<><>><^v>^^^>><v><v^v^<<>v^v<<<<^>^v>>>>v<<<>>v^>>^>v^<><>>vv<^^v<^v<<^v>v>>v^^^><^^^v>^<^<<>>>v^v>v<>vv^>>v^v^<v<v<>^>>^^<<><>>vv><<>^^^^>^vv>^
>v<v>><<<vvvvv^v^<v^^<v>>^><<<<v><>^^>v^<><><v<<<<^vv^^<<>>^><>v<^vvv<v<^^^<^v<>^^<><>v^v><v<<>vv>^v<v<^>>^>^><^v>v<^>><^>v>^^vvvvv^v^<>vv<vv<v^<^><v><<^v^^><<<><>^>vvv^><<vv^<vv>v<<>v^>>v><>v<^<<^^^<>v<^^><>v^^>^v>><v<>^<v><v<v^vv^v<v^<<<<<<>>><>v^vv^>^v<v>>v<vv>^v>^^>^>^vv><>>>^<^v^v>^^<>v>vvvvv>>>^>^<^v^<v<<v<>^><<^>^>^>v>>^v<v<>^<vv><vv>^v<^>v<>>^^v<^^>><>^><>^><^>^<^<><>^>^<^><^<>^>v>v<<><v<^v><^^v><<^<^^><^vv>><^vv<<^>>^<^^v>>v<v<^^^vv<>vv^^^^^<v<<^v><<v<^<><><^^^<>^>^v>v<><>v<<v<<^v><v>>^^<<<>>><>><vv<>v>^vv>>^<<>^v^<vv<>^v^>vv^<v>>v^v^v^v<<<^^v<<v><v>>><<>v^>^>>v><^v><<^^^v<v>^v<>^^^><<v>^>^^v<^v>><>^>^>v^<<^^^vv<>^><vv<^>^<v<v>>>>><<<^v>^vv^^><^>><^><<v^vvv>^<<<<v^v^<<^v^>v^<^<v>>^><>v<v<^^<vv<^<v<^^^<<v^>^v^^v>v<v^>>v><v^vv<^<><v<>^v^<><>v<>>>vv^v^><<v^<<vv>^><<^>^^><v>v<^<v>^<^v><v<v<v>vvvv<>>v>v^<^^<^><<v<^>^^^vv>^>vv>^<>>v^<<^>>^>vv^<><<vvv^^<^^^<<>v^^^v<><vv>>^>^>v<<vv^^^^v>vv^>^^>>>v<<^>><>v>v>>^>>v^vvv>>v<<><v<vv>^<^v<v<^vv>v<v<<vv<v<vv><^>^<><<^v<^<^^>>^^^<>><^<v>>v<>^

135
2024/day-15/solution-1.sh Normal file
View File

@ -0,0 +1,135 @@
#!/usr/bin/env bash
MAP_FILE=input-map
DIRECTIONS_FILE=input-movements
MAP_WIDTH=$(( $( head -1 "$MAP_FILE" | wc -c ) -1 ))
#MAP_HEIGHT=$( < "$MAP_FILE" wc -l )
# Load map
read -r -a TEST_ARRAY <<< "$( < "$MAP_FILE" paste -s -d "" | sed -E 's/(.)(.)/\1 \2 /g' )"
read -r -a MAP_ARRAY <<< "$( < "$MAP_FILE" paste -s -d "" | sed -E 's/(.)(.)/\1 \2 /g' )"
printf "%s " "${MAP_ARRAY[@]}" | fold -w $(( MAP_WIDTH * 2 ))
printf "\n"
MAP_LEN=${#MAP_ARRAY[@]}
# Count boxes
BOX_COUNT=0
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${MAP_ARRAY[i]} == "O" ]]
then
(( BOX_COUNT++ ))
fi
done
printf "Box count: %s\n" "$BOX_COUNT"
# Get robot position
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${MAP_ARRAY[i]} == "@" ]]
then
ROBOT_POSITION=$i
break
fi
done
printf "Robot position : %s\n" "$ROBOT_POSITION"
# Hardcode direction values
UP=$(( - MAP_WIDTH ))
DOWN=$MAP_WIDTH
LEFT=-1
RIGHT=1
# Iterate through directions
MOVES=0
while read -r DIRECTION
do
# Interpret directions
if [[ $DIRECTION == "^" ]]
then
DIRECTION_VALUE=$UP
elif [[ $DIRECTION == "v" ]]
then
DIRECTION_VALUE=$DOWN
elif [[ $DIRECTION == "<" ]]
then
DIRECTION_VALUE=$LEFT
elif [[ $DIRECTION == ">" ]]
then
DIRECTION_VALUE=$RIGHT
fi
NEXT_POSITION=$(( ROBOT_POSITION + DIRECTION_VALUE ))
if [[ ${MAP_ARRAY[$NEXT_POSITION]} == "O" ]] # Box in front
then
END_POSITION=$(( NEXT_POSITION + DIRECTION_VALUE ))
while [[ ${MAP_ARRAY[$END_POSITION]} == "O" ]]
do
(( END_POSITION+=DIRECTION_VALUE ))
done
if [[ ${MAP_ARRAY[$END_POSITION]} == '#' ]]
then
printf "Next: %s End: %s Stacked boxes. No change.\n" "${MAP_ARRAY[$NEXT_POSITION]}" "${MAP_ARRAY[$END_POSITION]}"
: # Boxes are stacked up against wall
elif [[ ${MAP_ARRAY[$END_POSITION]} == "." ]]
then
printf "Next: %s End: %s Robot: %s Move boxes and robot\n" "${MAP_ARRAY[$NEXT_POSITION]}" "${MAP_ARRAY[$END_POSITION]}" "${MAP_ARRAY[$ROBOT_POSITION]}"
# Move the box
MAP_ARRAY[END_POSITION]=O
MAP_ARRAY[NEXT_POSITION]=.
# Move the robot
MAP_ARRAY[ROBOT_POSITION]=.
ROBOT_POSITION=$NEXT_POSITION
MAP_ARRAY[ROBOT_POSITION]=@
fi
elif [[ ${MAP_ARRAY[$NEXT_POSITION]} == "#" ]] # Wall in front, do nothing
then
printf "Next: %s Skipping\n" "${MAP_ARRAY[$NEXT_POSITION]}"
:
elif [[ ${MAP_ARRAY[$NEXT_POSITION]} == "." ]] # Empty space, move forward
then
printf "Next: %s Move robot forward\n" "${MAP_ARRAY[$NEXT_POSITION]}"
# Move the robot
MAP_ARRAY[ROBOT_POSITION]=.
ROBOT_POSITION=$NEXT_POSITION
MAP_ARRAY[ROBOT_POSITION]=@
fi
(( MOVES++ ))
done <<< "$( < "$DIRECTIONS_FILE" paste -s -d "" | sed -E 's/(.)(.)/\1 \2 /g' | tr ' ' '\n' )"
printf "Moves: %s\n" "$MOVES"
printf "%s " "${MAP_ARRAY[@]}" | fold -w $(( MAP_WIDTH * 2 ))
printf "\n"
# Calculate GPS values for boxes
SUM=0
BOX_COUNT=0
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${MAP_ARRAY[i]} == "O" ]]
then
(( BOX_COUNT++ ))
X=$(( i % MAP_WIDTH ))
Y=$(( i / MAP_WIDTH * 100 ))
GPS=$(( X + Y ))
printf "Box %s X: %s Y: %s GPS: %s\n" "$i" "$X" "$Y" "$GPS"
(( SUM+=GPS ))
fi
done
printf "Sum: %s\n" "$SUM"
printf "Box count: %s\n" "$BOX_COUNT"
# Compare and test if walls have moved
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${TEST_ARRAY[i]} == "#" ]]
then
if [[ ${TEST_ARRAY[i]} != "${MAP_ARRAY[i]}" ]]
then
printf "Index %s Wall changed.\n" "$i"
fi
fi
done

250
2024/day-15/solution-2.sh Normal file
View File

@ -0,0 +1,250 @@
#!/usr/bin/env bash
FUNCNEST=99999
MAP_FILE=input-map
DIRECTIONS_FILE=input-movements
MAP_WIDTH=$(( ( $( head -1 "$MAP_FILE" | wc -c ) -1 ) * 2 ))
# Move the robot
move_robot() {
MAP_ARRAY[ROBOT_POSITION]=.
ROBOT_POSITION=$NEXT_POSITION
MAP_ARRAY[ROBOT_POSITION]=@
}
# Function to move box in n direction
vertical_move_box () {
local BOX_COORDINATE=$1
local BOX_MOVE_DIRECTION=$2
# Normalise coordinates
if [[ ${MAP_ARRAY[$BOX_COORDINATE]} == "[" ]]
then
local L_SIDE=$BOX_COORDINATE
local R_SIDE=$(( BOX_COORDINATE +1 ))
elif [[ ${MAP_ARRAY[$BOX_COORDINATE]} == "]" ]]
then
local L_SIDE=$(( BOX_COORDINATE -1 ))
local R_SIDE=$BOX_COORDINATE
fi
local L_SIDE_MOVE_COORDINATE=$(( L_SIDE + BOX_MOVE_DIRECTION ))
local R_SIDE_MOVE_COORDINATE=$(( R_SIDE + BOX_MOVE_DIRECTION ))
# Recurse if there are more boxes
if [[ ${MAP_ARRAY[L_SIDE_MOVE_COORDINATE]} == "[" ]] || \
[[ ${MAP_ARRAY[L_SIDE_MOVE_COORDINATE]} == "]" ]]
then
vertical_move_box "$L_SIDE_MOVE_COORDINATE" "$BOX_MOVE_DIRECTION"
fi
if [[ ${MAP_ARRAY[R_SIDE_MOVE_COORDINATE]} == "[" ]] || \
[[ ${MAP_ARRAY[R_SIDE_MOVE_COORDINATE]} == "]" ]]
then
vertical_move_box "$R_SIDE_MOVE_COORDINATE" "$BOX_MOVE_DIRECTION"
fi
MAP_ARRAY[L_SIDE_MOVE_COORDINATE]="["
MAP_ARRAY[R_SIDE_MOVE_COORDINATE]="]"
MAP_ARRAY[L_SIDE]="."
MAP_ARRAY[R_SIDE]="."
}
# Function to check if box can be moved in n direction
vertical_check_move_box () {
local BOX_COORDINATE=$1
local BOX_MOVE_DIRECTION=$2
# Normalise coordinates
if [[ ${MAP_ARRAY[$BOX_COORDINATE]} == "[" ]]
then
local L_SIDE=$BOX_COORDINATE
local R_SIDE=$(( BOX_COORDINATE +1 ))
elif [[ ${MAP_ARRAY[$BOX_COORDINATE]} == "]" ]]
then
L_SIDE=$(( BOX_COORDINATE -1 ))
R_SIDE=$BOX_COORDINATE
fi
# Check if boxes are movable
local L_SIDE_MOVE_COORDINATE=$(( L_SIDE + BOX_MOVE_DIRECTION ))
local R_SIDE_MOVE_COORDINATE=$(( R_SIDE + BOX_MOVE_DIRECTION ))
if [[ ${MAP_ARRAY[$L_SIDE_MOVE_COORDINATE]} == '.' ]] && \
[[ ${MAP_ARRAY[$R_SIDE_MOVE_COORDINATE]} == '.' ]] # Can move
then
return 0
elif [[ ${MAP_ARRAY[$L_SIDE_MOVE_COORDINATE]} == '#' ]] || \
[[ ${MAP_ARRAY[$R_SIDE_MOVE_COORDINATE]} == '#' ]] # Blocked by wall
then
return 1
fi
# Recurse if there are more boxes
if [[ ${MAP_ARRAY[L_SIDE_MOVE_COORDINATE]} == "[" ]] || \
[[ ${MAP_ARRAY[L_SIDE_MOVE_COORDINATE]} == "]" ]]
then
vertical_check_move_box "$L_SIDE_MOVE_COORDINATE" "$BOX_MOVE_DIRECTION"
if [[ $? -eq 1 ]]
then
return 1
fi
fi
if [[ ${MAP_ARRAY[R_SIDE_MOVE_COORDINATE]} == "[" ]] || \
[[ ${MAP_ARRAY[R_SIDE_MOVE_COORDINATE]} == "]" ]]
then
vertical_check_move_box "$R_SIDE_MOVE_COORDINATE" "$BOX_MOVE_DIRECTION"
if [[ $? -eq 1 ]]
then
return 1
fi
fi
}
horizontal_move_box () {
local BOX_COOR=$1
local BOX_MOVE_DIRECTION=$2
local NEXT_SPOT=$(( BOX_COOR + BOX_MOVE_DIRECTION * 2 ))
if [[ ${MAP_ARRAY[$NEXT_SPOT]} == "#" ]]
then
return 1 # Failed to move box
elif [[ ${MAP_ARRAY[$NEXT_SPOT]} == "[" ]] || \
[[ ${MAP_ARRAY[$NEXT_SPOT]} == "]" ]]
then
horizontal_move_box "$NEXT_SPOT" "$BOX_MOVE_DIRECTION"
if [[ $? -eq 1 ]] ; then return 1 ; fi
elif [[ ${MAP_ARRAY[$NEXT_SPOT]} != "." ]]
then
return 1
fi
# Move the box
if [[ $NEXT_SPOT -lt $(( BOX_COOR + BOX_MOVE_DIRECTION )) ]]
then
MAP_ARRAY[NEXT_SPOT]="["
MAP_ARRAY[BOX_COOR + BOX_MOVE_DIRECTION]="]"
else
MAP_ARRAY[BOX_COOR + BOX_MOVE_DIRECTION]="["
MAP_ARRAY[NEXT_SPOT]="]"
fi
MAP_ARRAY[BOX_COOR]="."
}
# Load map
read -r -a MAP_ARRAY <<< "$(
< "$MAP_FILE" paste -s -d "" |
sed -E '
s/#/##/g;
s/\./../g;
s/@/@./g;
s/O/[]/g;
s/(.)(.)/\1 \2 /g'
)"
MAP_LEN=${#MAP_ARRAY[@]}
print_map () {
printf "%s " "${MAP_ARRAY[@]}" |
fold -w $(( MAP_WIDTH * 2 ))
printf "\n"
}
# Get robot position
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${MAP_ARRAY[$i]} == "@" ]]
then
ROBOT_POSITION=$i
break
fi
done
printf "Robot position : %s\n" "$ROBOT_POSITION"
# Hardcode direction values
UP=$(( - MAP_WIDTH ))
DOWN=$MAP_WIDTH
LEFT=-1
RIGHT=1
# Iterate through directions
MOVES=0
print_map
while read -r DIRECTION
do
# Interpret directions
if [[ $DIRECTION == "^" ]]
then
DIRECTION_VALUE=$UP
elif [[ $DIRECTION == "v" ]]
then
DIRECTION_VALUE=$DOWN
elif [[ $DIRECTION == "<" ]]
then
DIRECTION_VALUE=$LEFT
elif [[ $DIRECTION == ">" ]]
then
DIRECTION_VALUE=$RIGHT
fi
NEXT_POSITION=$(( ROBOT_POSITION + DIRECTION_VALUE ))
# Box in front
if [[ ${MAP_ARRAY[$NEXT_POSITION]} == "[" ]] || \
[[ ${MAP_ARRAY[$NEXT_POSITION]} == "]" ]]
then
#printf "Hit box.\n"
if [[ $DIRECTION_VALUE -eq $LEFT ]] || \
[[ $DIRECTION_VALUE -eq $RIGHT ]]
then
#printf "Left right box movement.\n"
if horizontal_move_box "$NEXT_POSITION" "$DIRECTION_VALUE"
then
move_robot
fi
elif [[ $DIRECTION_VALUE -eq $UP ]] || \
[[ $DIRECTION_VALUE -eq $DOWN ]]
then
#printf "Up down box movement.\n"
if vertical_check_move_box "$NEXT_POSITION" "$DIRECTION_VALUE"
then
vertical_move_box "$NEXT_POSITION" "$DIRECTION_VALUE"
move_robot
fi
fi
# Wall in front, do nothing
elif [[ ${MAP_ARRAY[$NEXT_POSITION]} == "#" ]]
then
#printf "Next: %s Skipping\n" "${MAP_ARRAY[$NEXT_POSITION]}"
:
# Empty space, move forward
elif [[ ${MAP_ARRAY[$NEXT_POSITION]} == "." ]]
then
#printf "Next: %s Move robot forward\n" "${MAP_ARRAY[$NEXT_POSITION]}"
move_robot
fi
(( MOVES++ ))
#print_map
done <<< "$( < "$DIRECTIONS_FILE" paste -s -d "" | sed -E 's/(.)(.)/\1 \2 /g' | tr ' ' '\n' )"
printf "Moves: %s\n" "$MOVES"
print_map
# Calculate GPS values for boxes
SUM=0
BOX_COUNT=0
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${MAP_ARRAY[i]} == "[" ]]
then
(( BOX_COUNT++ ))
X=$(( i % MAP_WIDTH ))
Y=$(( i / MAP_WIDTH * 100 ))
GPS=$(( X + Y ))
#printf "Box %s X: %s Y: %s GPS: %s\n" "$i" "$X" "$Y" "$GPS"
(( SUM+=GPS ))
fi
done
printf "Sum: %s\n" "$SUM"
printf "Box count: %s\n" "$BOX_COUNT"

View File

@ -0,0 +1,10 @@
##########
#..O..O.O#
#......O.#
#.OO..O.O#
#..O@..O.#
#O#..O...#
#O..O..O.#
#.OO.O.OO#
#....O...#
##########

View File

@ -0,0 +1,10 @@
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^

141
2024/day-16/input Normal file
View File

@ -0,0 +1,141 @@
#############################################################################################################################################
#.....#.........#.......#.....................#.....#...#.........#.#.....#.......#.........#.........#.......#...#.........#...#.....#...#E#
#.#.#.#.#####.###.#.#####.###.#.#.#.#.#######.#.###.#.#.###.#.###.#.#.#.###.###.#.###.#.###.#.#######.###.###.#.#.#.#.#####.#.#.#.#.#.#.#.#.#
#.#.#.#.....#...#.#.#.......#.#.#.#.#.#.....#...#.#...#...#.................#...#.....#.#...#.#.....#...#...#.#.#...#.#.....#.#...#.#...#...#
#.#.#######.###.#.#.#.#######.#.#.#.#.#.###.#.###.#######.###.#.#.###########.#######.#.#.###.#.#######.###.#.#######.#.#####.#####.#######.#
#.#.#.....#...#...#.......#...#...#...#...#.......#.....#.....#.#.....#.......#.......#.#.#...#.......#.....#.#.......#...#.#.#...#.....#...#
###.#.#.#####.#############.###############.#.###.#.###.#######.###.#.#.###########.###.#.###.#####.#########.#.#########.#.#.#.#.#.###.#.#.#
#...#.#...........................#...#...#...................#.....#.#...........#.....#.#...#.....#.......#...#.....#...#...#.#.#...#...#.#
#.#.#.###.#.#.#.#####.#.#####.###.#.#.#.#.#.#.#####.#####.#.#.#.###.#.#########.#.#.#####.#.###.#####.#.#########.#####.#######.#.#########.#
#...................#.#.#...#.#...#.#...#...#.....#.....#.#.#...#.#...#.......#.#.#.....#...#...#...#.#.....................................#
#.###.#.#.###.###.#.#.###.#.#.#.###.###.#####.###.#.###.###.###.#.#####.#####.###.#.###.#####.###.#.#.###############.#######.#.###########.#
#.#...#.#.....#...#...#...#...#...#.......................#.......#.....#...#...............#.....#...#.....#.....#.#.................#.....#
#.#.#.#.###.###.#####.#.#########.#.#.###.###.#.#.#######.#####.#.#####.###.#.#.#.###.#####.#.###########.#.###.#.#.#######.#.#.#.#####.###.#
#...#.#.......#.....#.#.#.....#...#.#.....#.....#...........#...#.......#...#.#.#.#...#.......#.....#...#.#.....#.......#...#...#.....#.....#
#.###.#.#.#.#.#####.###.###.###.#####.#####.#.#############.#.#.#########.###.#.###.###.#####.#.###.#.#.#.#####.#########.#######.###.#####.#
#.#.....#.#...#...#...#...#.#...#...#.....#.........#.......#.....#...#.....#.#.....#...#.....#...#...#...#.#...#.........#.........#.#.....#
#.#.#.###.#.###.#.###.###.#.#.#.#.#.#####.#########.#.#######.###.#.#.###.#.#.#.#####.###.#######.#########.#.###.#########.#########.#.###.#
#.#.......#.....#.#.....#.....#.#.#.#.........#.....#.........#.#...#...#.#.#.#...#...#...#.......#.......#.....#.........#.#...#.....#.....#
#.#.#.#####.#######.###.###.#.#.#.#.###.#######.###############.#######.###.#.#####.###.###.###.###.###.#.#.#############.#.###.#.###.#.###.#
#.#.#.......#.......#.#.#.#.#.#.#.#...#.#.......#...............#.....#.....#.#.....#...#...#...#.....#.#.#.#...........#.#...........#...#.#
#.#.#.#####.#.#######.#.#.#.#.###.###.###.#######.#######.#.#####.###.#.#####.#.#####.###.###.###.###.#.###.#.#########.#.###.#.#.#.###.#.#.#
#...#.#.....#.....#.......#.#.......#.#...#.......#.......#.#.......#...#.....#...#...#...#...#.#...#.#...#.#.....#.#...#.#...#.............#
###.#.#.###.#####.#.#######.#########.#.#.#.#######.###.#.###.###########.#######.#.#######.###.###.#.###.#.#####.#.#.###.#.###.#.#.#.#.#####
#.............#...#.#.......#...#.#...#...#...#...#.#.#.#.....#.#.........#...#...#.#.....#.#.......#...#...#.....#.#.....#.#...#.#...#.#...#
###.#.#.###.#.#.#.#.#.#######.#.#.#.#####.#####.#.#.#.#.###.###.#.#########.#.#.#.#.#.###.#.#.#########.#####.#####.#.###.#.#.#.#.#####.#.#.#
#...#.....#.#.#.#...#.......#.....#.....#.......#.....#...#.....#.#.........#...#.#...#.#...#...#.............#.....#.#...#.#.#.#.......#.#.#
#.#.#.###.#.#.#.###########.#.#.#.#####.#.###########.###.#####.#.###.#.#########.#####.#######.#.#######.#.#######.#.#.#.#.#.###.#####.#.#.#
#.#.#...#.#...#.#...#...#...#.#...#.....#.#.....#...#...#...#...#.#...#.#...........#.......#.....#.....#.#...#...#.#.#.#...#.............#.#
#.#.#.#.#.#####.#.#.#.#.#.###.#####.#####.#.###.#.#.#######.#####.#.###.#.#######.#.#.###.###.#####.###.#####.#.#.#.#.#.#.#####.###########.#
#.#.#.#.#.......#.#...#...#.....#...#.#...#.#.#...#.......#.#.....#...#.#.#.#.....#...#.#.#.....#...#.#...#...#.#...#...#.......#.........#.#
#.#.###.#######.#.###.#########.#.###.#.###.#.###########.#.#.#######.#.#.#.#.#####.###.#.#.#####.###.###.#.###.#######.#.#######.#########.#
#.#.....#.......#...#...........#.#...#...#.#...#.......#.#.#...#...........#.#.......#...#.#.#...#.#...#...#.#...........#.........#.......#
#.#.###############.#.#########.#.###.###.#.#.###.#.#####.#.###.#.#.#######.#.###.#.###.###.#.#.###.#.#.#####.#.###########.#######.#.#######
#...#.............#...#.....#...#...#.#...#.#.....#.....#.#.#...#.#.......#.#...#.#...#.#.#.....#.....#.........#.....#...#.#.....#.#...#...#
###.#.#########.#.#####.#.###.#####.#.#.###.###.#######.#.#.#.###.###.###.###.#.#####.#.#.###.#.#.#######.#######.###.#.#.#.#####.#.###.#.#.#
#...#.#.....#...#...#...#.#...#.#...#...#.#...#.#.....#.....#.....#...#.#...#.#.#.....#...#.#.#.#.#.....#.#.....#...#...#...#...#.#...#...#.#
#.#.#.#.#####.#####.#.#####.###.#.###.###.###.###.###.#############.###.###.###.#.#######.#.#.#.###.###.###.###.###.#########.#.#.###.#####.#
#.#...#.....#...#.....#.....#...#.#.#.#.....#...#.#.#.......#.......#.......#...#.......#...#.#.......#.#...#.#.....#.........#.#...#.....#.#
#.#.###.###.###.#####.#.#.#####.#.#.#.#.#######.#.#.#######.#.#.#####.#######.###.###.#####.#.#########.#.###.#######.###.#####.#.#.###.#.#.#
#.#...#...#...#.....#.#.#...#.......#.#.......#.#.#.......#...#.#...#...#.....#.....#.#.....#.....#.....#.#.....#.......#...#...#.#...#.#.#.#
#.###.###.#.#.#####.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.#.###.#####.###.###.#.###.#####.#.#.#########.#.#.###.#.#.#.#.#####.###.#.###.###.#.#.#.#
#...#...#.#.....#.#.#.#...#...#...#.#...#.#.#.#.#.#.#.#...#...#...#...#...#...#...#.#.#.....#.#...#.#.#...#...#...#.....#...#.#...#.#.#.#...#
###.###.#.###.#.#.#.#.#####.###.###.###.#.#.#.#.#.###.#.#####.###.#.#.#####.#.#.#.###.#####.#.#.###.###.###.#.#####.#.###.###.###.#.#.#.###.#
#...#.....#.#.#...#.#.#.....#...#...#...#.#.#.#...#...#.#.......#.#.#.........#.#...#.........#...#...#...#.#...#...#.....#.#...#.#.#.#.#...#
#.#.#.###.#.#.###.#.###.#####.###.#.#.#####.#.#####.###.#.###.###.#############.###.#.###.###.###.###.###.#####.###.#######.#.#.#.#.#.#.#.###
#.#.#.#.#...#...#.#.........#.#...#.#.#.............#.....#.#.#.............#...#.#.#...#...#...#...#...#...#...#.....#.....#.#.#.#.#.#...#.#
#.#.#.#.###.###.#.#########.#.#.###.#.#.###.#######.#######.#.#.###.#######.#.###.#.#####.#.#######.#.#####.#.###.#.###.#.#.#.#.#.#.#.#####.#
#.#.#.#.......#.#.....#...#.#.#.#...#...#...#...#...#.....#...#.#...#.....#...#...#.....#.#...#.....#.......#...#.#.#...#.#...#.#.#.#.......#
#.###.#.#######.#######.#.#.#.#.###.#####.###.#.#.###.#.#.#####.#.#####.#########.#####.#.###.#.###############.#.#.#.###.###.#.#.#.###.#####
#.....#...#.....#.......#.#.#.#...#.#.....#...#...#...#.#.#.....#.....#...........#...#...#.#...#.#.....#.......#.....#.#.#...#.#.....#.....#
###########.#####.###.#.#.###.###.#.###.#.#.#######.###.#.#.###.#####.#######.###.###.#####.#####.#.#.###.#.#####.#####.#.#.###.###########.#
#.#.........#...#.#...#.#.....#...#.#...#.#.#...#...#...#...#.#.....#.......#...#.............#.....#.....#.#...#.......#.#...#.....#...#...#
#.#.###.#####.#.#.#.###.###.###.###.#.###.#.#.###.###.#######.#.#.#########.#.#.#####.#######.###.#########.#.###.#####.#.###.#####.#.#.#.#.#
#.............#...#.....#...#...#.....#...#...#...#.............#.....#.....#.#.#.....#.....#...#.#.....#...#...#.......#.#.......#.#.#...#.#
#.###.#.#.#.#.###########.#.#.#.#############.#.###.#########.###.#.###.#######.#.#####.###.###.#.###.#.#.#####.#######.#.#.###.###.#.#####.#
#...#.#...#.#.......#.....#.#.#...........#...#.#...#.#.....#.....#...#.........#...#...#.#.....#...#.#.#.#...#.........#.#.#.........#...#.#
#.#.#.#####.#######.#.#####.#.###########.#.###.#.###.#.###.#.#######.#######.#.#.#.#.###.#########.#.#.#.#.#.#.#########.#.#.#.#.#####.#.#.#
#.#.#.#...#.............#...#.........#...#...#.#.....#.#.#...#.....#.......#...#.#.#.....#...#...#.#.#.#...#.#.#.....#...#.#...#.....#.#...#
#.#.#.#.#####.#.#.#.###.#.###########.#.#.#.#.#.#####.#.#.#########.#####.#.#####.#.#####.#.#.#.###.#.#.#####.#.#.###.#.#.#.###.#####.#.#####
#.#.#.#.....#...#.#.#...#.#...........#.#.#...#...#...#.........#.....#...#.#.....#.....#.#.#...#...#.#.#...#.#...#...........#.............#
#.###.#####.###.#.#.#.###.#.#.#########.###.#####.#############.#.###.#.#####.#####.#####.#.###.#.###.#.#.#.#.#####.#########.#.#.#######.#.#
#.....#...#...#.#.#...#.#.#.#.........#.#...#.....#.....#.....#...#...#.........#.#.#.....#...#.....#.#.#.#...#.#...#.#.....#.#.#...#...#...#
#.#.###.#.###.#.###.#.#.#.#.#####.#####.#.###.#####.#.#.#####.#####.#######.###.#.#.#.#####.#.#####.#.#.#.#####.#.###.#.#.#.#.#.###.#.#.###.#
#.#...............#...#.#.#.......#...#.....#...#...#.#.....#...#.......#...#.#...#...#...#.#.....#.#.#.#.#.....#...#...#.#.#...#.#.#.#.....#
#.#.#.#####.#.###.#####.#.#.#######.#.#########.#.###.#####.#.###.#######.#.#.###.#######.#.###.#.#.###.#.#.###.###.#####.#.###.#.#.#.#######
#...#...#.#.....#.......#.#.#.......#.........#...#...#...#...#.....#.......#.....#.....#.......#.#.#...#.#.#.....#...#...#.....#.#.#.......#
#.#####.#.#.###########.#.#.#.#########.#####.#####.###.#.#####.#####.#####.#.#######.#.#.###.#####.#.#.#.###.#######.#.#######.#.#.###.#.#.#
#.......#...#.......#...#.#.#.#.......#...#...#...#...#.#.......#...#.#.....#.#.......#.#...#.......#...#...#.#.....#.#.#.........#.........#
#########.#.#.#####.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#########.#.#.#.#.###.#.#.#.###.#########.###.#####.#.#.#.###.#.#####.#.#####.#.###.#
#.....#.#.#...#...#...#...#.#.#.#...#...#...#.#.#.#.#.#.........#.#...#.....#...#...#.#.........#.#.......#.#...#.....#.#...#...............#
#.#.#.#.#.#.###.#.###.#.###.#.#.###.#.#####.###.#.###.#.#.#######.#########.#########.#########.#.###.###.#.#######.###.#.#.###.###.#.#####.#
#...#...#.#...#.#...#.#...#.#.....#.#.......#...#...#.#.#.#.....#.......#...#.......#...#.....#.#.....#...#.#.......#...#.#.....#...#.....#.#
###.#.###.#.#.#.#####.###.#####.###.#########.#####.#.#.#.#.###.#########.###.###.#.#.#.#.#.###.#####.#.###.#.###.#.###.#.#######.#.#.#####.#
#...#.#.....#.#.......#.#.......#...#...#.....#...#.#.....#...#...........#...#...#...#.#.#.#.........#...#.#.#.#.#...#.........#.#.#.#.....#
#.#.#.#.###.#.#.#######.#########.#.#.#.#.#####.#.#.#########.###############.#.#.#####.#.#.#.###.###.###.#.#.#.#.###.#######.###.#.#.#.#####
#.............#.............#.....#.#.#...#...#.#...........#.#.......#.......#.#.#...#...#.#.......#.....#.....#...#.#...#...#...#.#.#...#.#
###.#.###.#.#.#############.#.#####.#.#####.#.#.#.#.###.#.#.#.#.#####.#.#.#.#.#.#.#.#.#####.#######.#########.#####.#.#.#.#.###.#.###.###.#.#
#.........#...#.......#.....#.#.....#.......#...#.#.....#...#.#.#...#...#.#.#.#.#.#.#.#...#.#.....#.#.......#.#.....#.#.#.#.#...#.#.....#.#.#
#.#.#.#####.###.#.#####.#####.###.###############.#.#.#.#.###.#.#.#.#####.#.#.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.#.#.#.###.###.#.###.#.#.#
#.#.....#.......#.#.....#...#...#.#.............#...#...#.....#...#...#...#.#.#.....#.#.#.#.....#.#.#.#.....#.#.#...#...#.#...#.#.#.#...#...#
#.#.#.#.#######.###.#####.#.###.#.#.#####.###########.#################.###.#.#######.#.#.#.#######.#.#.#####.#.#########.#.###.#.#.#######.#
#...#...#...#...#...#.#...#.#...#.#...#.#...........#.#.....#...........#.#.#.#.......#.#.#.#.......#.#...#...#.#...#...#.#...#.#.#.........#
#.#.#.###.#.#.###.###.#.#.###.###.###.#.#######.#####.#.#.#.#.###########.#.#.#.#######.#.#.#.#######.###.#####.#.#.#.#.#.###.#.#.#.#.#######
#...#.#...#.......#.....#...#.#...#...#.......#.......#.#.#...#.....#.......#.#.#.....#.#...#...#.......#.......#.#.#.#.#...................#
###.#.#.###.#.#.###.#######.#.#.###.#########.#.#########.#####.###.#.#########.#.#.###.#######.#######.###########.#.#.#######.#.#.###.#.#.#
#.#.#...#...#.#.#...#.....#.#.#.#...#.......#.............#...#...#.............#.#.#...#...#...#.......#...#.......#.#.........#.#.....#.#.#
#.#.#.###.###.#.#####.###.#.#.###.###.#####.#####.###.###.#.#.###################.###.###.#.#.###.#.#.###.#.#.###.#.#.#.###.#####.###.#.#.#.#
#...#.#...#...#.......#.#...#.....#.....#.........#...#.....#...#.....#.........#.....#...#...#.......#...#.#.#...#.#.....#.......#.#.....#.#
#.###.#.###.#########.#.#.#############.###########.###.###.#.#.#.###.#####.#####.#####.#######.###.###.###.#.#.###.#####.#########.#.#.#.#.#
#.....#...#...............#.............#...#.....#.#...#...#.#.....#...#...#...#.#.....#.....#.#.....#.#...#.#.#...#.#...#.....#.........#.#
#####.###.###.#############.#######.#.###.#.###.###.#.###.#.###########.#.###.#.#.#.###.#.#.#.#.#######.#.#####.#.###.#.###.###.#.###.#.#.#.#
#...#...#...#.#.......#...#...#...#.#.#...#...#...#.#...#.#...........#.#.#...#...#.#.....#.#...#.....#.#.....#.#...#.#.#.....#.......#.#...#
#.#.#.#.#.#.#.#.#####.#.#.###.###.#.###.#####.#.#.#.###.#.###.#######.#.#.#.#######.#.#####.#####.###.#.#####.#.#.#.#.#.#.###.#.#.###.#.#.#.#
#.#...#.#.#.#.#.#.#...#.#...#.#...#.....#...#.#.#.#.#...#...#.#.....#...#.....#...#.#.....#.....#...#...#...#.#...#...#.#.....#.#...#.....#.#
#.###.#.#.#.#.#.#.#.#####.#.#.#.#.#######.#.#.###.#.#.#####.###.###.#########.#.###.#####.#.#.#.###.#####.#.#.###.###.#.###.#.#.#.#.#.#.#.#.#
#.#.............#.......#...#.#.#.........#.#...#.#.#.#...#.....#.#.#.....#.#.#.#...#...#.#...#.#...#.....#.#.#.......#...#.#.#.#.#.....#...#
#.###.#####.#####.#####.#.###.#.#####.#####.###.#.#.#.#.#.###.###.#.#.###.#.#.#.#.###.###.#####.#.###.#######.#.#####.###.#.#.###.###.#.#.###
#...#.....#.#.#...#.......#...........#.......#.#...#.#...........#...#...#...#.#.#.....#.....#.......#...#...#.....#...#.#.#.#.....#...#...#
#.#.#####.#.#.#.#.#.#######.###.#######.#######.#.###.#########.#.#####.#####.#.#.#####.###.#.#########.#.#.#######.#####.#.#.#.#####.#.#.#.#
#.#.#.....#.#...#...#.#.....#.........#.#...#...#...#...#.....#.#...#...........#.....#.....#.....#.....#...#.....#.#.....#.#.....#...#...#.#
#.#.###.###.#.#######.#.#############.#.#.#.#.#########.#.###.#.#.#.#.#####.#########.###.###.###.#.#########.#.#.#.#.#########.###.#.#.#.#.#
#.#...#.#...#...#.....#.....#.......#.#...#.#.........#...#.#.#.#...#.....#.........#...#.#...#...#.#.......#.#.#...#.#.......#.#...#...#...#
#.###.#.#.#####.#.###.#####.#.#####.#.#####.#######.#.#####.#.#.###.#####.#####.###.###.#.#.#.#####.#.###.###.#.###.#.#####.#.###.###.#.#.###
#.#...#.#.#...#.#...#.#.....#...#...#...#.......#.#.#.....#.......#.#...#.#...#...#...#.#.#.#.#.....#.........#.#...#...#...#...............#
#.#.###.#.#.#.#.###.#.#.#######.#.#####.#.#####.#.#.###.###.#####.#.#.#.#.#.#.###.#####.#.#.#.#.#######.#######.###.###.#.#######.#.#.#.#.#.#
#.#...#...#.#.#...#.#.#.#.......#.....#.#.....#...#.#...#.........#...#...#.#.....#.....#...#.#.....#...#.....#...#...#...#.........#...#.#.#
#####.#######.###.#.###.#.#.#########.#.###.#.#.###.#####.#####.#######.###.#####.#.###############.#####.###.#.#.###.#####.#########.###.#.#
#.....#.......#...#...#.#.#.#.....#...#.#...#...#...#.....#...#.#...........#...#.#...#...........#.......#...#.#...#.#...........#...#...#.#
#.#######.#.###.#####.#.#.#.#.###.#.###.#.#####.#.###.#####.#.###.###########.###.###.###.#######.###.#####.###.###.###.#########.###.#.###.#
#.#.....#.#...#.......#...#.#.#.#.......#.....#.#.#...#...#.#...#.....#.....#.....#...#...#.....#...#.#...#.#...#.#...#.....#...#.......#...#
#.#.###.#.#.#.#.#####.#####.#.#.#####.#######.#.#.#.###.###.#.#.#####.#.#####.#####.###.###.#######.#.#.#.#.#.###.###.#####.#.###########.#.#
#.#...#.#...#...#...#.#.....#.#.......#.....#.#.#.#...#...#...#.......#...#.....#...#.....#.........#.#.#.#.#...#...#.....#.#.............#.#
#.###.#.###.#####.#.#.#.#.###.#.#####.###.#.#.#.#.###.#.#.###.###########.#.#####.###.###.#.#########.###.#.###.#.#.#####.#.###.#.#########.#
#.....#.....#...#.#.#...#.....#.#...#.....#.#.#.#...#.#.#...#...#.......#.#...#...#...#.#.#...#.#...#.....#...#...#.#...#.#...#.#.#.#.......#
#.#########.#.#.#.#.#.###.#####.#.#.#########.#.###.#.#####.###.#.#####.#.###.#.###.###.#.###.#.#.#.#####.###.#####.#.#.#.###.#.#.#.#.#####.#
#...#.....#.#.#...#.#.#...#.......#.........#...#...#.......#.#...#.....#.....#.#.......#.#...#...#...#.....#.#...#.#.#.#.#...#.#.#...#...#.#
###.#.#####.#.#####.###.###.###############.#.###.#.#######.#.#####.#########.#.#########.#.#######.#.#.#####.###.#.#.#.#.#.###.#.#####.#.###
#.#.#...#...#...#...#...#...#...#...#...#...#.#.....#.....#.#...#.#.........#.#.....#...#.#.......#.#.....#...#...#...#.#...#...#...#...#...#
#.#.###.#.#.###.#.###.###.#.#.#.#.#.#.#.#.###.#.#.###.###.#.#.#.#.###.#####.#.#####.#.#.#.#####.#.###.#.###.###.#######.#######.###.#.#####.#
#.#...#.#.....#.#...#.#...#.#.#...#...#.#.#.....#.#...#.#.#...#...#.........#.....#...#...#.....#...#.#.#...#.......#...#.....#...#...#...#.#
#.###.#.###.###.###.#.#.#.#.#.###.#######.#.###.###.###.#.#######.###.#.###.#####.#########.###.###.#.#.#.#######.###.###.#.#.#.#####.#.###.#
#...#...#...#...#.#.#.#...#.#...#.#...#.......#...#.....#.........#...#.#.....#.....#.......#.#.#.#.#...#.......#.....#...#.#.#.#...#...#...#
#.#####.#.#.#.###.#.#.###.#.###.###.#.#.###.#.###.#####.###########.#.#.#.###.#.###.#######.#.#.#.#.###.#######.#.#######.#.#.###.#.###.#.###
#.......#...#...#.#.#.#...#...#.....#.....#.#...#...#...#.....#.....#.#...#.#.#.....#...#...#.....#.#...#.....#.........#.#.#.....#...#.#...#
#.#########.###.#.#.#.#.#####.#.###.#.###.#.#.###.###.###.###.#.#.#########.#.#.#####.#.#.###.#####.#.###.###.#.#######.#.#.###.#.###.###.#.#
#...#.#...#...#.#.#...#.#...#...#.....#...#.#...#...#...#.#.....#.#.........#.#.....#.#.#...#.#...#.#.#.#...#.#.#.....#.#.#.#.#...#.........#
###.#.#.#.#.###.#.#####.###.###.#.###.#.#######.###.###.#.#.###.#.#.#.#######.#####.#.#.###.#.#.#.#.#.#.###.#.#.#.#.###.#.#.#.###.#.###.###.#
#...#.#.#...#...#.....#...#...#...#...#.........#...............#...#.......#.....#.#.#.....#.#.#...#...#...#...#.#.....#.#.#.........#...#.#
#.###.#.#.###.###.#######.#.#.#####.#.#.#######.#.#####.#.###.###.#########.#.###.#.#.###.###.#.#######.#.#######.#########.#.#.#.#######.#.#
#.....#.#.....#.........#.#.#...#...#.........#...............#...#.....#...#...#.#...#...#.....#.....#.#.......#.#.........#.#...#.....#...#
#####.#.#.#####.#.###.#.#.#####.#.###.#.###.#########.#.###.#.#.#.#####.#.#.#.#.#.#####.###.#########.#.#######.#.#.###.#####.###.#.###.###.#
#.#...#...#.#.........#.#.#.....#.....#.#...#.....#.#...#...#...#.......#.#.#.#...#.#...#...#.......#.......#...#.............#...#...#.....#
#.#.#####.#.#.#####.#.###.#.###.#####.#.#.#.#.#.#.#.###.#.#######.#.###.#.#.#.#####.#.###.###.###.#.#####.###.###.#.###.#####.#.#.###.#######
#.#.#.......#.......#.......#.......#...........#...#...#...#.....#.#...#.#.#.#...#.....#.#...#...#...#...#...#.#.....#.....#.#.#.#...#.....#
#.#.###.#.#.###.#####.###############.#.#.#.#.#.#####.#.###.#######.#.###.#.#.#.#.#.#####.#.###.#####.###.#.###.###.#.#####.###.#.#.###.#.###
#.....................#.........#.....#...#.#.#.....#...#...........#...#.#.#.#.#...#...............#...#.#.#.......#.....#.#...#...#...#...#
#.###.###.#.###.#.#.###.#######.#.###.#.###.#.#####.###.#################.#.#.#.#####.#####.#.###.#####.###.#.#.###.#####.#.#.###.#######.#.#
#...#.....#.....#.#...#...#...#.#.#...#...#...#...#...#...........#.......#.#.#...#...#.......................#.#.......#...#.#...#.........#
#.#.#####.#######.###.###.#.###.#.#.#.#.#.#######.#.#############.#.#######.#.#####.###.#######.#.#.#########.#.#.#.###.#####.#.#####.#.###.#
#S#...............................................#.................#.......#...........#.........#...........#.......#...............#.....#
#############################################################################################################################################

253
2024/day-16/solution-1.sh Normal file
View File

@ -0,0 +1,253 @@
#!/usr/bin/env bash
FUNCNEST=99999
FILE=test-input-1
# Load map
read -r -a MAP_ARRAY <<< "$( < "$FILE" paste -s -d "" | sed -E 's/(.)(.)/\1 \2 /g' )"
#read -r -a CHECKPOINT_ARRAY <<< "$( < "$FILE" paste -s -d "" | sed -E 's/(.)(.)/\1 \2 /g' )"
MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 ))
MAP_LEN=${#MAP_ARRAY[@]}
MAP_HEIGHT=$( < "$FILE" wc -l )
printf "Map len: %s Map width: %s Map height: %s\n" "$MAP_LEN" "$MAP_WIDTH" "$MAP_HEIGHT"
DIR_UP=$(( - MAP_WIDTH ))
DIR_DOWN=$MAP_WIDTH
DIR_LEFT=-1
DIR_RIGHT=1
print_map () {
printf "%s " "${MAP_ARRAY[@]}" | fold -w $(( MAP_WIDTH * 2 ))
printf "\n"
}
# Get starting position
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${MAP_ARRAY[$i]} == "S" ]]
then
START_POSITION=$i
MAP_ARRAY[START_POSITION]="X"
break
fi
done
printf "Start position: %s\n" "$START_POSITION"
# Get end position
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${MAP_ARRAY[$i]} == "E" ]]
then
END_POSITION=$i
MAP_ARRAY[END_POSITION]="X"
break
fi
done
printf "End position: %s\n" "$END_POSITION"
print_map
# Mark all checkpoints
declare -A CHECKPOINT_ARRAY
CHECKPOINT_ARRAY[$START_POSITION]=0
for (( i=0; i<MAP_LEN; i++ ))
do
if [[ ${MAP_ARRAY[$i]} != "." ]] ;then continue ;fi
STEP=$i
ADJ_COUNT=0
UP=$(( STEP + DIR_UP ))
DOWN=$(( STEP + DIR_DOWN ))
LEFT=$(( STEP + DIR_LEFT ))
RIGHT=$(( STEP + DIR_RIGHT ))
if [[ ${MAP_ARRAY[$UP]} == "." ]] && [[ $UP -gt 0 ]]
then
(( ADJ_COUNT++ ))
fi
if [[ ${MAP_ARRAY[$DOWN]} == "." ]] && [[ $DOWN -lt $MAP_LEN ]]
then
(( ADJ_COUNT++ ))
fi
if [[ ${MAP_ARRAY[$LEFT]} == "." ]]
then
(( ADJ_COUNT++ ))
fi
if [[ ${MAP_ARRAY[$RIGHT]} == "." ]]
then
(( ADJ_COUNT++ ))
fi
if [[ $ADJ_COUNT -gt 2 ]]
then
MAP_ARRAY[STEP]=X
CHECKPOINT_ARRAY[$STEP]=0
fi
done
CHECKPOINT_ARRAY[$END_POSITION]=0
printf "%s " "${!CHECKPOINT_ARRAY[@]}"
printf "\n"
CHECKPOINT_ARRAY_LEN=${#CHECKPOINT_ARRAY[@]}
# Iterate over checkpoints and print pairings
declare -A CHECKPOINT_PAIRS
declare -A CHECKPOINT_PAIR_WEIGHTS
PREV_UP=$(( 2 * 5 * 7 ))
PREV_DOWN=$(( 3 * 5 * 7 ))
PREV_LEFT=$(( 2 * 3 * 5 ))
PREV_RIGHT=$(( 2 * 3 * 7 ))
get_weight_change () {
local POSITION=$1
local NEXT_POSITION=$2
local DIRECTION=$3
# Check if next position is moving in line with the previous direction
if [[ $(( NEXT_POSITION - POSITION )) -eq $DIR_UP ]] && [[ $(( DIRECTION % PREV_UP )) -eq 0 ]]
then
printf "1"
return 0
elif [[ $(( NEXT_POSITION - POSITION )) -eq $DIR_DOWN ]] && [[ $(( DIRECTION % PREV_DOWN )) -eq 0 ]]
then
printf "1"
return 0
elif [[ $(( NEXT_POSITION - POSITION )) -eq $DIR_LEFT ]] && [[ $(( DIRECTION % PREV_LEFT )) -eq 0 ]]
then
printf "1"
return 0
elif [[ $(( NEXT_POSITION - POSITION )) -eq $DIR_RIGHT ]] && [[ $(( DIRECTION % PREV_RIGHT )) -eq 0 ]]
then
printf "1"
return 0
fi
# For different directions, weight change is 1000
printf "1000"
}
recurse_travel () {
local POSITION=$1 # Current position
local CHECKPOINT=$2 # Previous checkpoint
local DIRECTION=$3 # Allowed adjacent tiles
local WEIGHT=$4 # Weightage so far
# Search adjacent tiles
# Recurse if it's movable
# Add a checkpoint pair and weights if checkpoint found
# 2 : Up
# 3 : Down
# 5 : Left
# 7 : Right
if [[ $(( DIRECTION % 2 )) -eq 0 ]]
then
local UP=$(( POSITION + DIR_UP ))
if [[ $UP -gt 0 ]]
then
if [[ ${MAP_ARRAY[$UP]} == "." ]]
then
WEIGHT_CHANGE=$( get_weight_change "$POSITION" "$UP" "$DIRECTION" )
recurse_travel "$UP" "$CHECKPOINT" "$(( 2 * 5 * 7 ))" "$(( WEIGHT + WEIGHT_CHANGE ))"
elif [[ -v CHECKPOINT_ARRAY[$UP] ]]
then
WEIGHT_CHANGE=$( get_weight_change "$POSITION" "$UP" "$DIRECTION" )
CHECKPOINT_PAIRS["$CHECKPOINT-$UP"]=0
CHECKPOINT_PAIR_WEIGHTS["$CHECKPOINT-$UP"]=$(( WEIGHT + WEIGHT_CHANGE ))
fi
fi
fi
if [[ $(( DIRECTION % 3 )) -eq 0 ]] && [[ $DOWN -lt $MAP_LEN ]]
then
local DOWN=$(( POSITION + DIR_DOWN ))
if [[ $DOWN -lt $MAP_LEN ]]
then
if [[ ${MAP_ARRAY[$DOWN]} == "." ]]
then
WEIGHT_CHANGE=$( get_weight_change "$POSITION" "$DOWN" "$DIRECTION" )
recurse_travel "$DOWN" "$CHECKPOINT" "$(( 3 * 5 * 7 ))" "$(( WEIGHT + WEIGHT_CHANGE ))"
elif [[ -v CHECKPOINT_ARRAY[$DOWN] ]]
then
WEIGHT_CHANGE=$( get_weight_change "$POSITION" "$DOWN" "$DIRECTION" )
CHECKPOINT_PAIRS["$CHECKPOINT-$DOWN"]=0
CHECKPOINT_PAIR_WEIGHTS["$CHECKPOINT-$DOWN"]=$(( WEIGHT + WEIGHT_CHANGE ))
fi
fi
fi
if [[ $(( DIRECTION % 5 )) -eq 0 ]]
then
local LEFT=$(( POSITION + DIR_LEFT ))
if [[ ${MAP_ARRAY[$LEFT]} == "." ]]
then
WEIGHT_CHANGE=$( get_weight_change "$POSITION" "$LEFT" "$DIRECTION" )
recurse_travel "$LEFT" "$CHECKPOINT" "$(( 2 * 3 * 5 ))" "$(( WEIGHT + WEIGHT_CHANGE ))"
elif [[ -v CHECKPOINT_ARRAY[$LEFT] ]]
then
WEIGHT_CHANGE=$( get_weight_change "$POSITION" "$LEFT" "$DIRECTION" )
CHECKPOINT_PAIRS["$CHECKPOINT-$LEFT"]=0
CHECKPOINT_PAIR_WEIGHTS["$CHECKPOINT-$LEFT"]=$(( WEIGHT + WEIGHT_CHANGE ))
fi
fi
if [[ $(( DIRECTION % 7 )) -eq 0 ]]
then
local RIGHT=$(( POSITION + DIR_RIGHT ))
if [[ ${MAP_ARRAY[$RIGHT]} == "." ]]
then
WEIGHT_CHANGE=$( get_weight_change "$POSITION" "$RIGHT" "$DIRECTION" )
recurse_travel "$RIGHT" "$CHECKPOINT" "$(( 2 * 3 * 7 ))" "$(( WEIGHT + WEIGHT_CHANGE ))"
elif [[ -v CHECKPOINT_ARRAY[$RIGHT] ]]
then
WEIGHT_CHANGE=$( get_weight_change "$POSITION" "$RIGHT" "$DIRECTION" )
CHECKPOINT_PAIRS["$CHECKPOINT-$RIGHT"]=0
CHECKPOINT_PAIR_WEIGHTS["$CHECKPOINT-$RIGHT"]=$(( WEIGHT + WEIGHT_CHANGE ))
fi
fi
}
ITER=99999
for CHECKPOINT in "${!CHECKPOINT_ARRAY[@]}"
do
recurse_travel "$CHECKPOINT" "$CHECKPOINT" "$(( 2 * 3 * 5 * 7 ))" "0"
(( ITER-- ))
if [[ $ITER -eq 0 ]] ; then break ;fi
done
for CHECKPOINT in "${!CHECKPOINT_PAIRS[@]}"
do
printf "Dest %s from checkpoint %s\n" "${CHECKPOINT_PAIRS[$CHECKPOINT]}" "$CHECKPOINT"
done | sort
for CHECKPOINT in "${!CHECKPOINT_PAIR_WEIGHTS[@]}"
do
printf "Weight %s for checkpoint pair %s\n" "${CHECKPOINT_PAIR_WEIGHTS[$CHECKPOINT]}" "$CHECKPOINT"
done | sort
if [[ ${#CHECKPOINT_PAIRS[@]} -ne ${#CHECKPOINT_PAIR_WEIGHTS[@]} ]]
then
printf "Checkpoint count with weight counts do not match.\n"
fi
# Map out full paths for calculate final results for it
# Quite akin to BFS
declare -A FINAL_PATH
FINAL_PATH[$START_POSITION]=0
for (( i=0 ; i<CHECKPOINT_ARRAY_LEN ; i+= 1 )) # Start to end should only have these many iterations
do
for PATH in "${!FINAL_PATH[@]}"
do
CHECKPOINT=${PATH##*-}
PATH_SCORE=${FINAL_PATH[$PATH]}
if [[ $CHECKPOINT -eq $END_POSITION ]] # This path has completed
then
continue
fi
for NEXT_CHECKPOINT in "${!CHECKPOINT_ARRAY[@]}" # Check if there is a next mapping
do
if [[ $PATH =~ -$NEXT_CHECKPOINT- ]]; then continue; fi # Prevent loops
PAIR="$CHECKPOINT-$NEXT_CHECKPOINT"
if [[ -v CHECKPOINT_PAIRS[$PAIR] ]]
then
FINAL_PATH["$PATH-$NEXT_CHECKPOINT"]=$(( PATH_SCORE + ${CHECKPOINT_PAIR_WEIGHTS[$PAIR]} ))
unset "FINAL_PATH[$PATH]"
fi
done
done
done
for PATH in "${!FINAL_PATH[@]}"
do
END=${PATH##*-}
if [[ $END == "$END_POSITION" ]]
then
printf "Path: %s weight: %s \n" "$PATH" "${FINAL_PATH[$PATH]}"
fi
done
#print_map

15
2024/day-16/test-input-1 Normal file
View File

@ -0,0 +1,15 @@
###############
#.......#....E#
#.#.###.#.###.#
#.....#.#...#.#
#.###.#####.#.#
#.#.#.......#.#
#.#.#####.###.#
#...........#.#
###.#.#####.#.#
#...#.....#.#.#
#.#.#.###.#.#.#
#.....#...#.#.#
#.###.#.#.#.#.#
#S..#.....#...#
###############

5
2024/day-17/input Normal file
View File

@ -0,0 +1,5 @@
Register A: 64196994
Register B: 0
Register C: 0
Program: 2,4,1,1,7,5,1,5,4,0,0,3,5,5,3,0

160
2024/day-17/machine.sh Normal file
View File

@ -0,0 +1,160 @@
#!/usr/bin/env bash
adv () { # OPCODE 0
$DEBUG && printf "OPCODE : 0 OP: adv OPERAND: %s\n" "$1" >&2
OPERAND=$( get_combo "$1" )
#REG_A=$(( REG_A / (2 ** OPERAND) ))
REG_A=$( printf "%s / (2 ^ %s) \n" "$REG_A" "$OPERAND" | bc )
}
bxl () { # OPCODE 1
$DEBUG && printf "OPCODE : 1 OP: bxl OPERAND: %s\n" "$1" >&2
OPERAND=$1
REG_B=$(( REG_B ^ OPERAND ))
}
bst () { # OPCODE 2
$DEBUG && printf "OPCODE : 2 OP: bst OPERAND: %s\n" "$1" >&2
OPERAND=$( get_combo "$1" )
REG_B=$(( OPERAND % 8 ))
}
jnz () { # OPCODE 3
$DEBUG && printf "OPCODE : 3 OP: jnz OPERAND: %s\n" "$1" >&2
OPERAND=$1
if [[ $REG_A -eq 0 ]]
then
return 0
else
POINTER=$OPERAND
fi
}
bxc () { # OPCODE 4
$DEBUG && printf "OPCODE : 4 OP: bxc OPERAND: %s\n" "$1" >&2
# OPERAND=$1 # Deprecated for legacy reasons
REG_B=$(( REG_B ^ REG_C ))
}
out () { # OPCODE 5
$DEBUG && printf "OPCODE : 5 OP: out OPERAND: %s\n" "$1" >&2
OPERAND=$( get_combo "$1" )
printf "%s\n" "$(( OPERAND % 8 ))"
}
bdv () { # OPCODE 6
$DEBUG && printf "OPCODE : 6 OP: bdv OPERAND: %s\n" "$1" >&2
OPERAND=$( get_combo "$1" )
#REG_B=$(( REG_A / (2 ** OPERAND) ))
REG_B=$( printf "%s / (2 ^ %s) \n" "$REG_A" "$OPERAND" | bc )
}
cdv () { # OPCODE 7
$DEBUG && printf "OPCODE : 7 OP: cdv OPERAND: %s\n" "$1" >&2
OPERAND=$( get_combo "$1" )
#REG_C=$(( REG_A / (2 ** OPERAND) ))
REG_C=$( printf "%s / (2 ^ %s) \n" "$REG_A" "$OPERAND" | bc )
}
# Get combo operand
get_combo () {
if [[ $OPERAND -eq 0 ]]
then
printf "$1"
elif [[ $OPERAND -eq 1 ]]
then
printf "$1"
elif [[ $OPERAND -eq 2 ]]
then
printf "$1"
elif [[ $OPERAND -eq 3 ]]
then
printf "$1"
elif [[ $OPERAND -eq 4 ]]
then
printf "%s" "$REG_A"
elif [[ $OPERAND -eq 5 ]]
then
printf "%s" "$REG_B"
elif [[ $OPERAND -eq 6 ]]
then
printf "%s" "$REG_C"
elif [[ $OPERAND -eq 7 ]]
then
printf "Reserved operand. Exiting.\n" >&2
exit 1
fi
}
# Check if the program is a quine
check_quine () {
$DEBUG && printf "%s," "${INPUT[@]}"
$DEBUG && printf "%s," "${OUTPUT[@]}"
for (( i=0; i<${#INPUT[@]}; i++ ))
do
if [[ ${INPUT[$i]} != "${OUTPUT[$i]}" ]]
then
return 1
fi
done
}
# Check digits
check_tail () {
$DEBUG && printf "%s," "${INPUT[@]}"
$DEBUG && printf "%s," "${OUTPUT[@]}"
for (( i=${#INPUT[@]}; i>=${#INPUT[@]}-$1; i-- ))
do
if [[ ${INPUT[$i]} != "${OUTPUT[$i]}" ]]
then
return 1
fi
done
}
# Interpret opcode
read_opcode () {
local OPCODE=$1
local OPERAND=$2
if [[ $OPCODE -eq 0 ]]
then
adv "$OPERAND"
(( POINTER+=2 ))
elif [[ $OPCODE -eq 1 ]]
then
bxl "$OPERAND"
(( POINTER+=2 ))
elif [[ $OPCODE -eq 2 ]]
then
bst "$OPERAND"
(( POINTER+=2 ))
elif [[ $OPCODE -eq 3 ]]
then
# jnz itself moves the pointer
jnz "$OPERAND"
elif [[ $OPCODE -eq 4 ]]
then
bxc "$OPERAND"
(( POINTER+=2 ))
elif [[ $OPCODE -eq 5 ]]
then
out "$OPERAND"
(( POINTER+=2 ))
elif [[ $OPCODE -eq 6 ]]
then
bdv "$OPERAND"
(( POINTER+=2 ))
elif [[ $OPCODE -eq 7 ]]
then
cdv "$OPERAND"
(( POINTER+=2 ))
fi
}
execute_machine () {
POINTER=0
while [[ $POINTER -lt $INPUT_LEN ]]
do
OPCODE=${INPUT[$POINTER]}
OPERAND=${INPUT[$POINTER+1]}
read_opcode "$OPCODE" "$OPERAND"
$DEBUG && printf "Registers A : %s B: %s C : %s\n" "$REG_A" "$REG_B" "$REG_C" >&2
$DEBUG && printf "Pointer : %s\n" "$POINTER" >&2
(( MACHINE_ITER-- ))
if [[ $MACHINE_ITER -eq 0 ]] ; then break ; fi
done | paste -s -d " "
}

31
2024/day-17/solution-1.sh Normal file
View File

@ -0,0 +1,31 @@
#!/usr/bin/env bash
FILE=$1
ITER=99
DEBUG=false
REG_A=$(grep 'Register A:' "$FILE" | cut -f2 -d: )
REG_B=$(grep 'Register B:' "$FILE" | cut -f2 -d: )
REG_C=$(grep 'Register C:' "$FILE" | cut -f2 -d: )
read -r -a INPUT <<< "$(grep 'Program:' "$FILE" | cut -f2 -d: | tr ',' ' ' )"
INPUT_LEN=${#INPUT[@]}
printf "Registers A: %s B: %s C: %s\n" "$REG_A" "$REG_B" "$REG_C" >&2
printf "Input : " >&2
printf "%s " "${INPUT[@]}" >&2
printf "\n" >&2
# Load machine operations
. machine.sh
POINTER=0
while [[ $POINTER -lt $INPUT_LEN ]]
do
OPCODE=${INPUT[$POINTER]}
OPERAND=${INPUT[$POINTER+1]}
read_opcode "$OPCODE" "$OPERAND"
printf "Registers A : %s B: %s C : %s\n" "$REG_A" "$REG_B" "$REG_C" >&2
printf "Pointer : %s\n" "$POINTER" >&2
(( ITER-- ))
if [[ $ITER -eq 0 ]] ; then break ;fi
done | paste -s -d ","

52
2024/day-17/solution-2.sh Normal file
View File

@ -0,0 +1,52 @@
#!/usr/bin/env bash
FILE=$1
ITER=1
MACHINE_ITER=999
DEBUG=false
INCREMENT=100000000000
TAIL_NUM=3
# Load registry values
REG_A=$(grep 'Register A:' "$FILE" | cut -f2 -d: )
REG_B=$(grep 'Register B:' "$FILE" | cut -f2 -d: )
REG_C=$(grep 'Register C:' "$FILE" | cut -f2 -d: )
# Rewrite registry A starting value
REG_A=100000000000000
#REG_A=164541160582800
# Load input string
read -r -a INPUT <<< "$(grep 'Program:' "$FILE" | cut -f2 -d: | tr ',' ' ' )"
INPUT_LEN=${#INPUT[@]}
printf "Registers A: %s B: %s C: %s\n" "$REG_A" "$REG_B" "$REG_C" >&2
#printf "Input: " >&2
#printf "%s " "${INPUT[@]}" >&2
#printf "\n" >&2
# Load machine operations
. machine.sh
# Iterate registry A until last nth digits are matched
PIN_DIGITS=0
while ! check_tail "$INPUT_LEN" "$PIN_DIGITS"
do
while ! check_tail "$TAIL_NUM" "$PIN_DIGITS"
do
read -r -a OUTPUT <<< "$( execute_machine )"
printf "Register A: %s\n" "$REG_A"
printf "Output:\t"
printf "%s " "${OUTPUT[@]}"
printf "\n"
printf "Input:\t"
printf "%s " "${INPUT[@]}"
printf "\n"
(( REG_A+=INCREMENT))
#(( ITER-- ))
if [[ $ITER -eq 0 ]] ; then break ; fi
done
PIN_DIGITS=$TAIL_NUM
printf "Matched digit. Reducing count"
(( TAIL_NUM+=1 ))
(( INCREMENT/= 50 ))
done

5
2024/day-17/test-input-1 Normal file
View File

@ -0,0 +1,5 @@
Register A: 729
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0

400
2024/day-19/input-designs Normal file
View File

@ -0,0 +1,400 @@
rubbgwuwbrwgrgrgrbrbbubgbggrbwrurwuggggwrbrgwbrrwb
urwgurrubuguruwuuuruwbbgrbbuwrbwrruuuubbuububuubrw
gguurrubwbuwgrbrrurrgbgburbrrurwbrrrubburuggbbgb
rgbuuwwwgbbwgurrwurgwgrgrbbbuggwgwugbrwb
rwggurbrgwrrwuururwwubgrurwwrubgguububururwb
ggrgrruwwwgrwuubgrggbbwrrgbrwrwgwwububrubguurggbrwbg
ggurrgrggwrwruuwrbrgbrubrbuggugwgrwgwurbub
wwwwuburrwbwugguwuwgwwrbggbwuwuuuuruwwurbwurgbwbggrr
urburguuwwwgrbrbgbbgbgrbgbubguugwubugwgrruuuugbbbbgubggu
guurrgwububururwgugrguuubrwrguurbuuuugrgbuwru
urwuwuuguwwwgrgbuwbgubwuwuurwuwggbwgubrbrguurrgrwb
bwwbbwuwbubgrbbgwuubrrbwgbggubbrbbwrwuuuguugwrwbub
wwwguwbgrrgbrgggwrgwuuwwwgwgwrgbrbgwgwruuruguubruug
gruuwuwbugubrwbbubrubgrruubuwugurbggrrbbbbg
wurubbwuggrrurbwwgrwubgbwguurbrwgwwwgrwuuuggwbguwwr
ggbguwrwguguwubgurgggrguuwugbuwbwwgwburgbwwuwgbrwbub
gwugrwruguwuugubbbrubbwbuwwwrgburrbbguwbgbgwrwb
grgugwwrgggbbbubububwuggrrgwruwrubwbrbbgwrwrggbuwrururrrrg
guwgggwrwrggbgwrrubrwburbuuububrbwrrrgurwugwggr
wuwwugwrbbuuburuururuwwrggbubwwugbuwugbburrwuwbubgbw
ugbggwbgurubbwrgwgggggwggrruubrgrwrgugwwgurrrbwbrwwur
wurubwrrbbgruurbbgurbbubuggubrrwwgbgwrwuuuwrgwbbrbw
rwwbruubgwrrugggwubgwwubwruuwggwrbwwbbrrwb
ugwgbguggggwwbwgwwuggurbwwgrbbuwurugwwrrrgugburruwb
brrrugbwrwbwwurbgbwwuugrbwbrgwgrgrbgrurwgwurgwruuguwbrurwu
rruwrrbgubguurwwugurrgrwbbuuwuburrbwwbbrggwuwr
uuwrburgruurrbuwwguurwbwwbwggrbubrwuuwuuwrbbg
gbbrrwgggbwwggwgwuurubrrurgwgwgbwgubwggrrbggug
wrwuggugbrwuuubbgrbugubbgurgrrburgwrbugrwb
bbbwgbuwbgrgggugrugwwwbwgrrbbbuubuguuugwburrrwrggwrrruwug
urbwwguugwrgbrrrrrrrbbwggrrubwgwugbbbuurugggrg
uugrugurbbruubwgbwbbbwubbrbbgwuuuwggwwwuubrrrwuwubrgrbrw
wbrugrwrwrrgugwugrrugugwubugrrrwbrwbwrggbwurrbgubgwbgbbgrwb
uwwbbubgrrrurgwrbgurugwbbrbbburggguugbwbrbgwbubuwbbgubgwg
rrbwbrbruwurwbwgggwrguwbbubuwuwurwubgwbwwgbubggwbbubbrbr
wwrwggbwwwrgubwrbwuuwbuuuwbrgwwrbrbrguruwrwbrrgrugb
wwbwrrubbbgwurbrbubwwbbbgbrbgbwbbuggrurbrwgwbubguurrwrwwb
rwurrgwuugrubggwbuubrbuwrggguwbgrbbgrgbbuwggbgwrbwgwbuuru
gwrrugbuurgrrwgbggwggguwwrrbgrbwwrrgwwbwubwbwrgbrgbgwwbgu
brrrwbururwwrwwrrgbwbubgbwgrgwwruuuwgugrwwrgbubru
uugbwguruwuwubburrgbbgbbrwrrbubuguugwgwwbw
gwburgbrwgwwubugrrrbuwugrbbwrrguwrbgbbgrggggbwuuwwgwgbww
rwwwbgwuubugurwbwururgbwbwwrwubgwuuruurbwbwgbwwbuwgg
bwwwbuwwrwgurbbwbguwwgwubwuwgwwubbwwwuwuuubbwr
urugrwggbbrburugwggbwbbuubbrbguuggwurgbrbbbgrbwuw
bgrbrbgbgwrrwgugbubbgbrurwrrgbwbbgrwrwbwwb
gbwubwgurggwbbgwwgbrrubguwgwwbrgwgrgwwwgwwbruwrwbuurwb
wuuwrwrbugruurrrrgwurguggbgwubugrugwwuguwwruuwbrrrwwruggb
ugrugbrrwuuwrwuguggwwgggubuwrrbwrugwwuugwbburrbrwb
wrrggbggbrgurbwguurugbwgrgwwgbwbgrbgwrbrwb
bugubbrwbuwugwwrwbgwugbuuubrwbugwrugggbwwrbgbwuurgw
bwrrwbrruuuugugggwgrgrwwrwwgwwgrbggwruwrwwwgrurwgggwbbw
gwwuwbuwwgwuurwwwgbruwuugruuwrgbbwugwbbwbguguw
uwrwwrurwwuwwwuwuubbbwbbrrwwbrrgbwbwggwgwruurrwb
rguuugbrbgrbwbbrwuuwwubwrrwggrwrgwwrgwuubwgbbwubbwbgbrruwu
gbgrgrwgbbbrwgubugwwuuwrrgbwbwgbwuwrugrbururbwrwrwbubrr
ruwrgurgguuurrggrurbuurubrbbguwbbrrbuuuwrgrwb
guurwgbwrbuurrrbugrbgbbrurbubbuugrgbwugbru
uggbgwrrgrrubgbbgwubwurgbbugububwrwbrgwbbbwwrwb
gwwgbbrrurbwwwrrrbruurbruggbrgwbgurbrwggwbrgurbbbwubbuw
wbgrwbuguguwrbbuurbubgubwgwwbrrrrbugurgggbbgb
buurgwggbbwgrrbruwuwruububuubrrbrrwrgbwbbwbwwururbgurbrrgrwb
rbgggbwrugrgwrwgwurggbrbgwgwgwwrbubbrwrbbuurugrrgwbrggbu
grrbbbwwguwbruwggwruwurrgrbgwubbubggwuugwubuwrrugurwb
rrbububbrrbbuwwuuwggbbwuwuwwrwgwwgwgrburbgrgrw
uuurugrbrrgwbrrggurrbubbuwguwuwgrurwbrbgwurwurw
rwubrwbuuuwbggrbwrwgwwrgrbrrbbwgrrwrwrrgbruggwwwgbbrwuuwrg
bburuwbugrggrwggrwbgbbuurwubuuugrbrrwgwgbrggrgggwbuuwbwbuw
wrbrbugwgrbuwrubwgwuwugbrgbwrwrgwururwrrrggrgurrwb
rggrbururgwuuwgbuwuwrruguugwbgubuwrubuwbrggbggbggrwb
gwurbruwrrgrrwbbwuwbgwrgwubbbuburrgbwrwrwb
urbrugbrwurgrgbrruwrbbrgwbrrbrwurbbbugwuugrwguwr
brrgurwwrguuubrggbggwwbgbgrrwwbburwuwrrwggbwubrrbggugubu
rwgwwuugbwrwrguwrrbrgwrurbwurrggwuwuwbgwgwwguurgrwb
guggggubguggwugbgbbwwgurubwugrbwgububbggbbrwb
wgwrguwggbugwwgrrrrwgwwwwrwwubgugwugbwgwggubwubrwb
grwwgbrwbubbwrwwwubugbgrubuuwbgurwurrugbwrgrrr
uugwwbuubggggruwugrurguwwwbrggggggrwwwrbrgugu
rgubgwbwurrguwgwburwubgrgbubbrbrruugrugbgrwwru
wbwwrubbbguggwbuugrgwguruuggurwggrrbruwbwrgbuw
rgugbrwuurrrrrurubrrgguuwbrrwruggubbbubgbwguurburggbrwb
rbuuggwwurwuuwgubgrbrruwrburugurwuubbburrguuruwr
rwurwrbbubgrwgggwwwbruuubwrwuwuwgrgbrgrgbugwrubrrbwbwbwrwb
gwrgbggrwrgbbbuuggbgrrgrrrruurbrwuugbubgbwur
rrurrwuuwuguuwbububrrwugbwuurbbgguwrwrrgrwwgbrggrburwg
ubruwgwbrubwrgbbrbbubggggwrggrgwbgggbgrburuwrbbrurgrgbbww
wrwgubgbwruugwubbggwugbgwwugwrbruuuwrwbbrrrru
rwubrrgbwrbgrbrwggugbbuugrguruwwwugrgurwb
wrgruuwrgguwwbrurbbugbrgruwrgrwggrbwwbwbgwrbrwubwubrwb
bggwugbrbwbgugwuwwurrwrrrwrgrguwuwurwguggwbrrbugrwr
ugubbwurburwrrbbbgwrbgwuwgbubrrgwgubrubrgrbb
gbwuggwruuuguurrwuurubrbwwbbwwuburgwgwurbbubg
uubwugrgburwubbbuururrwrwrgwurbwrrwurrubrwb
urbrwgwbuugbrwgbugggbbwwbuguuubbubwbguuubgbrrbububrru
rrbwwwbgrgwgurwwuwrbgwrwgrruwbgwbgugurwgrbugrbgbrbruw
ugrwbgrbrburugwbgugwugurrgwgrgwwrbgguwgrwrwb
wwbgbrgrwgggrbrugwwrwrbgubgrwguwbwubwwbgguggbbrgugbugrbbr
ubrwgwuwguwbwgguugrrbwuggwubbwwrrurbwruwbuw
gubrwwrbbrwwbuugrbwwugbgwwbbbugwrgbwbwwbwguggb
rurwgbbggugrwbubugrrwugrubuwwwwrwububgwwrwgwbr
wgbbrbbubgrrwwwgugugurbrubbuwbgwwwgwwgwrbwbw
ubgubwgwrwbuubgbbgrwbubugbbbrugrgwurubwgubguwugrrbu
gruuuwggwwwguwwguubggbguguuugwugwwgugwrwb
wrwbrgbgurwgbrbgurbbbggrbgwgubwbbggwrbwgbbu
bggubwbggbgrrrrggwbwbbgrguurrrggwbgurgrgwbuwbwurg
wuwbggrwwwbubrbwgrgrwgbrurggwwwubwwgwgbwuwwuguuwwgggbb
rwrugrubggrbururrwuwurbrwbuuggrbrbuugrwubbruggrbwuuru
wbrgggbwgrwwubbbguuuugrburubbrbrrrwubwgwguu
wrugrwruurrbwwwurggwbbwbuggrbwuruugwrburrwb
rburbbrwwrwgwbrubgwgwrwgrbwurgubuguwwwruuggbbuwwwggrwb
gwuugurgwwwrwwgbrbwwugwgurwbbbrwuwwwgrgbwbbgbbgruwgwwgwrb
rruwgbbwwrugugugrwubgrguguuwggbrrbrbubbwugurbgbubb
uuubwuburgrrwuugububuuwwrwrgbwbbgwgubwwgwgubrrbgbruggbu
wgrwuruuurwwbrwbwgrrwwrgurrbubwrwbgwrggbrrgugbuu
ugwbrgbbbwrgrgwbrguwrbrrgggbbuubgwbwgbgrwbrrwrrrgbrbgg
rgrggguuguwgbgrgrrgwrbbwbgurrrgwbwwguwbgggrbugugrbrurwb
bbwuwgrbbbbwrbrgbrgbbbburgruggrrrrbwrbbrwb
wbwuuwrruwggubggbgwbwwbggwbgbrrruggbwrrrbrwrb
wuubruggbruggbwbwuuugwrrwuwrgbwwbwuwwwrrgwrr
uwwgrbuubwbwbbrwburbrggburubwgguuwbwgbwburggwrgbrwb
ggbrubuwuurubruuubrbrgwuubguwbgbgwrrubrrrwb
rwgbbburwggwwgbbbrruuurbgrgbggrbgruuggbrgggg
rwwbwgwgwwbrbugbuuwbgggggwgrurbgrgwgwrgbbbuugbbgruwgwwwbg
rbwubbwuugwggrruuuugbruwwwwuuuuurgbgwwwgwbggwgbrurww
rwguwwrgugrbuwrwwbbugurrrwubruwugbrwubrwrgrbggbgr
ubbbugrbugrwgwggbwugwwbgwguubugbggbggrbuuwwbbbbbwr
gburuuwbrwrguwbrubgbwgruuwrwgbrwbrwwgwbgwggw
ggwwwguwgbuwrggbugurrrwwwrbrrbgurbbbgbruwrwwrbgrwwbuugrwb
rgbgrbrrubwuggruuwbgggwguuwwwrrrwuwrrgrubbbgrr
uwwgrrbugrrbwgggwuruwuuwggwbgwggwrbbuwbrrruubuguwugbrurwb
brwruwruwggrrubrwugbgbwwuggggruubrruugbgurrgwwugrurbrr
rgbbrrrbubrgbbbuuggruuurguubwgwgrwwgrbbwruwwb
rrbuuwgbuwwwbggrgbuurrbwwbwbwbrwwubuurrggrbg
urgbuwuwwugbrbguugbrbbggwggwgburgwgrwgurrbwwgrbbgw
uubrrugwggwgwbgbbwggwrrwbruwbrwuurgwwugrwgrwg
rgrguwguwrgwwgruggbwwbugbruubgurgrwuwrugbbggbuwrrggrwuug
uwubrubgbbwrgbgugwwwwwubwwubrburbbuurgwrrbwbubrbw
rgrbbwggrbgrrggrgbububggwggwwwwbrubguwgbuwbruwgugrgwrww
bbrwwrwgbgbgbrwwubbrgwuruwbrbubrrburuurwb
uuwgwgubwwbburwgrrbwgwrugrbwwgbggrurgwbuwru
uuggrgwuguuwwrbwrbuwrbrbgbuburuwwbbgbggbbugwwbu
bwbgwgwbrbbbwwbwrwgwbwgurggguwugrubrubrbrbuwwuugubru
uwuwrgwuubbruurbbbururrurrrbrwggbgbbgwrbuwubgbrrgwuurwb
bwgbbrgbbbbuugurgrburrrugbuubgbbwwwwgbuuwuggbgwguubb
uubwbuurbbwgbrgruwbugguguwbubbgrgbbgwbubggrrbwrwb
rrrguwbgwuwwbrrwrrwguwurbgbrburrwgrrburgwbbrruwwrrwbwrb
rruguburbgwgrgbguggggrugrgwbwwbwrbggwwgbruwuwrwwbubgburgr
rurgbwbugrbrgbgrurruwbubugubbgwuubgrwgrwwwgwbwrwbbwb
bbgbwggwgbbwbuugrrubbubgbrbrgubrugugrwbrwwbg
gwgugbburwwwwgbwwubwrwrwuurruuwuwwurugrrrgb
wwwrrrgruwrrrwuubwbrrurwbwrwrwbwggggrrbwuwggg
gbwrwguguggbwwrrbwgwwbwgbbbgwbuwuwrgwwrgbwuurb
guguuugbrbgruwbwbubwurrwggrubruwwggbwwubguub
uubbrubgrwwwuwrwgugbwbgurgrbbrugbrurguwrwwbbuguuuburwb
gubbuuuuubbwubgrwwguruggrbrgrrubuuuurrwrwb
uwwgbgrgrbrrgrguwgubuuwbwgguwbgurbwugbbrgguw
buwbgrggwwubrgrggbwurubgrbuuuwurrbuwurbbbbbrubgbrbuwwwrw
uwbrrbbwwruurgrrgrwruruwuubrgbrwwgwbugrbbrggrbwwbgrrwb
rbwgwbrguubbbugwguwrgrgbggbrruggrwubrwbgbwwuuwrrgwg
rbrbbgwggwuuburggwwrruruuruggwubruwwbrurubwbu
rbubuuurbwrugurggbwwbugbguuuuuwrubbguwrwb
bbwbubwrbuwgubguwrwrwgbgrrwwruurwwrbugrrurwb
bbuguurruwrrbguuuugwrguubwuubrbggrwubgugbwbwrrurugrugrwb
gbuuwurrbrwwrubgurbuubugrrbwubuurwuwwwgbbgbrwbrrrubggrwbgwb
grggrugrrbruuwbbbrrugbbbbuwbrwurrwgbwbuwrwb
bguurbwgwgbgbgrgrbbwgbbwubbwggrbubrwrbrubrbrgrwbburwb
grrrbrrwubuuggrgrurruuwwubwuuwubrrbburbrwwggrwgurgwgggwr
wbgubuuubwuwbrububrbwgrugrrbrrwbugguwwuuugu
rrgwgrguwruwgrwwrbgrgbbbbbwrgbugbggbrrwb
gwbrrgrruurwurburwbgrbggruuurbrbwubguwgrrburbgwwwu
bwwbugbruwrrguubruwbruuwrrwuwbruwgrwgwruwurgrbgurgruguwbg
brgrrbururwguwbburgurgrggbgubuwgruuuurbrrrrwugg
uwrbugwwrwuwgwwbuugbuurbwwbrwwrgrbggbgwwwrbrbwrrubbgrugw
uuggwbwrrwgrruwgggbggbgbubgwgbugwwrggrgbrgrururgugur
bwwwrugrrgbggbggbwubburrgubgwgwwrbwwgwbgurw
gburbuurwgbwgwwgggwbguwuwruububuwububwuwbgg
gbwggbgguwggbgwwrurwggbuburwrrgrbgbbuwuuuwrggwggwb
gbbwwwgbgwurgrbbwbgguwrwrggguwbugwbrgbwurgwuwgrrug
rgbugwrgugwbbbgggrwgwubbbwuurbrbrwbrgrwuurwgrg
ruwbuwurgwbuwrrrgwbrwrrruwwgggwugbwwrgruwgwubbgrwrrrwu
brrbwbbgwwwuururbrbuuwwwuguwwburbrurwuwgbwrbuubrbbww
rrrwrwugurubugbubbgwgrggwbbggbrugwbwrbggburgbrwr
ubrggrgbgwgruggrgrrwbruubwrrurubrbgwrwbggbrgbbrgwbbbr
ggrbbggrurbrbruwwugwrbrwrrbwgbrwwgubwrbrrgrbbwwwruwggww
wugbrbgwwwwrbugbwwrrburuwrbruruwuuuurbuwwwbgrgbrwb
bbgbgruurgbubburgwruwgrwuuubbwbwgugwbrbuuwwgurrurgwwrrb
wwburbbgbwurubrbrurwwgrwgubbgwbgrguuugurbwuwbuwuwuru
bwrgbuwrrrbubbwugbbrrgwgrbbbuguugrwbrurwrugguubbrubuggrwb
rgrwugwgbuuwubwrguuburuuuwuwbgguwuubggrrbugrbugwbgwwubwwbb
wbwrgurwrwrgggbbgggwwrbrbgurggubbbgrgbwbug
rbwbuwgurbbbgwuubwbgrwwubwbbwbgggwurbbbgbuu
wbburugwgrwwwgwwrwrbubrwuwrbgbwgbbwbrrbwbubbwbruubgrug
wrwggwgwwuuubbgrrwggrguubrgurrwuurubwurggwbrbbbugwuuwubwgu
bggrgbruwguurrurrbwuuwgugbrbwbuwwgwrgurggwburbbwgbuw
wwwbbugrrwwbrbwwgwububbuggrgrurggrwgrurruggbburwwgwurwb
rbrrwubgrwrbrbrggwwrurrwbwrurbwgbubggbrrrwwrwb
wuburwgwrwuwggbwwrgwwwugbwbggrurgbrurruwburuugwrwb
gwbwurbrbuurgwwbuuurrubbbrbwgruwuwuuuugwgbbb
wguwrbrbrgbbbggbggbgbgwgwbrggbggwguwurwwbbwbrrrrbwrwgrwb
wwwbruruubrurbugrrwwuburubbguwwrrbbwbbbrgbbubuwrurugr
brurrgggruwgrburwuggugrrbwbuuwbwuubgurwubruwrgwurbrwb
gwrruuwbrbwwbbbuwbwgrgubgggggwubgugubrbgugwuuburubugruwu
uubwruurruwwbrwburwggugggrguuurrgbbwbuggbwbuuurbgrwb
ggwrurbgrwgbbbruuurbbuubrwururgwwbuuwgrgwrgbubugrbrrgg
gubrurubwbrgrwwgggwwbwwguubbgggbggwbwwrguwrgwuggr
rwwugrbggburrrrbgwwgwgrurbbrguwrrbbbruwubgrgbrrwb
bgrrrbbgrguwgwwgurwwwrwugwwgrgrrwwguugbbruruuuwburbbuur
gwrgubrbubbbbrggrrbgwuwwbgbbuubugwgrwubgbbr
bwwwgwguwrrguruugwwbwgrgrwwbbwbrrgwbburuubbugbbrgggw
wburrbwwgubwbbwrbrgrwrbwugwuwwgwuugwwwgurgrguwuwgrgruu
wggrrrbgbgwurwrrwbrubbwbrwgrrwuugbrwwuwgruwwurw
rrbwggggurwrbwrrwubbrrurwwgbbrwuuwrruuwbrwb
ugwwwrbrbugbgrbuwbubwuggbwwugbgwrrwurrrwrrbgwrub
gbwgguuguuuugwgbuubggwuwbgrrbrbgwwbgugguruwrwggwwrwgwgu
wuubbbugwgrugububgrbgwugrurruwbwrbggwbgbbgurgrgbw
gwugwbbrwbwgwrwbrgurbwuwuugrrrbwwrburubgwrwwbbg
wwrgrrbubbuuwwbuwgrrwrrgggguwrrubbugrgwwbbug
gwubbruruuuwbbgrugbbbgbgwurwgwgwbwbwugggugbwuburwb
grgwgwrugugbgbwwbwubgwgbrgwguuwrrwwwugbgwgbgwruwwrwgwwrwb
rwrggugrwbbwgbubuwuwrrrgguguwrggbwbbwrrwb
rbgbwuwbwrbbwbbgugwgbbbwbrrrugwbrbubgruburwgwrrwb
wrrgbbbbwwuwgrgrrrbgurugbuwuubrgbgrbbbrrwb
ggrbwgwgrugrbrrwgugwguuwubuwwrugbbwwbbwuwggwuu
rwuuwwbugruwrruubuwuruuwubrugwrrwgruwrwrubbruruuwwg
rwrwuwbuwugbubgbbrguwgubuubbuwbwbgurubggbgubgwu
ugrrrruuwruuguwggubguwwwgrwuuwrwugwruwgrrbbw
ggwgwgurwrggrrwgwruuguwrugubrbuurwwruwbgrgrwb
rwbrrwuwbbbgbrrbwburwbbgbggwbbggwggugggrrrwbugg
ugbruwrruwgrbwuggrwwbruwwubrurrggbubgubugbgruugrrwb
wwwuubbwubwrubgubwrugrurbugguurburrrrwgguwwuggugurguwurwr
bwwbrruwbugbwguubbgggbrwbbrurgwbrwgggbgugbbgrbww
brgbwwubgubguwugwwuruubggwwuuwgwgwggbbwwbubbbggu
rbbrbbrurbuwwwguggguwgwggburbggubuwwbrbbubruuwwbgbru
rwuuugbwgwuugurbwrrwwbugbggbuururrbgwbwuuurggrurbgwbgggrrwb
bbgrgwwugwbwugggbugbgubgbgwbbuwrruurbwurwrgwurwb
bgwgguuwggrbbugbgwwwrwurrrbugrgguugrbgwbgwgwggruwwggwwgrwb
urrwggrubuwgbwggbbuwwbwbbwwrrgwrwbgurwurru
uwwbugruuuwggrrrrrbrrrbrurgwrrwwrrwbwbruwbbbuggwuu
wrururubbrugbggubggrbruuuubuubwuggggwwwubbwbbwbgbgbbgurwb
ubrubrbrgugurbuwrwuuwgbgwwrrwrrbbgwgbwruwrrrggggr
rbwguruwbgbgbbbbubbrrrugrruggurwwgrrrbrwb
rurgwubwbwgubwrbgguugrruururgwgbuwwurgugww
bwugrgruugguguwbgrbbbwuuwrrgwrrwrrubgrbrgbrggbww
rrgwbrwggbbgrggugurwgrgbrgwgbwrruwgwggwgrwuwrwbburwwbu
uurbwggwubwgwwguwbbgwwggugrrruggbgwbrrgwrr
grwbwbwrgrwrrubbbgwgrbbwrbgrurwrguwwwwggrbwbrwubbwrggr
gbuwbugrgubbrrbwwrbgwuwrwrbrbrwwbwbwrwuurrruurwb
ubrwurrrwwrbgwwgguubuwwgwbguwggurwbbgrugwbbrubug
rbugbwbguwggwwrwbbgwwuuruwwbrububbrurbubrgwwrbugugwbubggru
uuguruubgwwrrrwwugwurbgwbubrgrurrgwuuuuuggwbgrwbugu
gwwbugrrburuuwbwwbbugguubuuwwbuwbuwgubuwbruuugrgurgbuuubbw
ugwwgubwubbrubbrugbbbrurwgrgubgubugururgwgwwburgr
uggrgbruwrrbwrwgrruurwgguguwrwrwgbrggububgwrbguwbugwwguw
gruruurbgwrggggbrrugrbrgubrurrgugbbgrbgrwwugbrubw
ruggggwgbubuuubbgbburuwwgbbugrwubbrubgbrgbggrgubrb
wrguwbuwbrrbbbwbwrbgrrubwggbuwrrrgugbbrwbrguugrbrwgbrgg
rrgrwbgurgbbrgrbgugwrgrruruuugrgrrbbrrrwb
uuggrwugruuggrurbwggwgrwbwrgrbbbgbwbubugwg
rwwwrwrrbgrrgrgrwrgururgwrwburubwgrguwbuwwrrugugbbrwb
bbgguuwwuwbbuuwgwgurrwrwgbbrgurwgbrrbwrwbrwrbuggbwwrwrbuw
wrwwbgwgwruwrubbwrrwurwubgrrwrggbbgbbbgwwbgwggrbbwbrbbgbg
wgggrbrbwuwgubrguubgrguwrwuuuwbwwubuuwgbgrgbruubb
uggrwrwwbguwurbbburrgwgwururgwrgruwbwuubugubrurbuubrwrbuurwb
wrugguwugrgbuuwrbugrubrggggwwrbuwuurbuwruwwuww
wugwrwbbbrbbbrggrwbuwrwgwwbbrbwwgbruwugwruggggbw
uguurbwgwbbuuguwrwguubuugwurbgwrrbgbrrguwuwug
uwwuubgrrwgwrbbrgwwwbwugbbggbuuuurgubgwugrbgurbbwug
gwuwgwrrwgrwbwggugrbrggubbuburbbbgugrbuwrurrwbrwgggr
wwgrugrwuguwbruwugguurguwrugubwubrbgwwbrwbrwgbwrgwrruwurbr
gwgburrgwuurwburubuuwwwwgbbwbggwwgwuugrgwrbwrrw
rbgwgbbruuwwugugugrubbuugggwgubrguwwgrwgrrrgwbggbuguwu
rwwrrbrggruuubgruburgwubrrguwbwwgrgbwggruggwg
burgwuwugwbbbgrwgrubguuwugrbrbguubwwwrbbrwbrrugubuwwguuurw
gburugwwrwrrugugbbubrwrburrugrubbrurbrwwgrbbww
wuubbrbubbrbuubuwuwwgbuubugbrrgrugwrgwgwwwwwwwuurb
wuwgrrgwbbgrurbrgrrurbbgwuggggbgwuurwggurrwb
grbbggbgrugwbuubruwrgbwrbbwuugwrrugwrggbrurbwrrurbrwb
uuubbgrbwrurbwbuggbbgrwuguuwubrwgbgrrwurubbrwgggwbggrwb
urgwrgbbuwwrbrrrbbrwgwugwwrgrugwbgbbgrwb
wgbrwggguwwruuwwggwwrwbbbugbruwugbbbuuuwwgurrrbwwbubbwgburwb
buggbbgbgbbwwwurwrwrwbruwgwbbgrruwwgruubgwwwuggur
rbgbwubgbbgrurwwguwubrwubbuuggrugurubwuwgrwgubgugwguugrgw
urbbgurbubwwgbbwburrrbgrbwwubggwugbrrbugwrbgubrb
wbrurrrbgrgbgbwwwrwurrwbuuwrwwgrburwrrbgruggubgrguwgbwur
uuururbwrrwgwbwwrwwgwgruwurrbugwrgburgwrwrbrbw
rrwrurbrgubuguwurwgururugbgrbgubrgrgggurggugurgrbbuwgw
rrwuwrugwwbbubbrbrwrbwbwubgubgwwgrbugwgrugbgb
grwgbggwwwgwrwgruggbbgwrgwubgwrwguwgrguuuuuwgbbubgguugg
rbuurugruurwuwgburwgwgugrwgwwgwwgbrrugguwruw
urubgguwggurwbgrwwbubguwggbbbgrugwgrbgbrwgwrrbrbbrguub
wrbrurgwbubbwbbrwbbrugwgbubrwbgrgwguwuugbgugrgbg
rwuruwurgugggrgrrrugrurgggrrubguurbububugugbwurwuwwug
uubwuwrwwgrbbwgrrgubwgguggbrrwuruuwuubgrwuggbgruggbrr
uurbbgrgbrgbbgrgrbwwugbrrubgubgurrbbrrrbubr
guguggbgggwbbwrwrbwbgggrurburgurgbbwwgruru
wbrrbbuurwruuuwugrgubwuuurbrwurwurbwwbwububwbbbrwb
ubbrwgggwrwbwwwrbgbrrrbrubwrgurgbbgbuuuuugbwgwgrwuwwbuu
bwrbggbgrbbgubbwrrrubgwburgrgrrruurwuuggbguwbwwurrwrwb
gwuguuwbruwuuggrbrrbuwurbggbbwguwwgwwbgrurrwb
rrggbbgurwbbbgurbgbggubgrruuwbrbwgbrguwubbggguwbgruwwrwb
uwugbwwwrbbruubwbrgbuuubbgrubururrbrrgwwbgrwgbrwruwrwb
bwurruruwuguwrbuuggbwbrubbrwuwurbgwwbrgurgwuggr
ruuuwugrrurbwrgrbgurbrwbrbubbwwuuwwuwwuugugbbgrbggwr
uugrgwgwwgrbrubbugbgbrguwbbwwgrubbbgbgbruwugrrwb
brbgbwwwbbuuugrwrugbwurrgggbwwuubwruuburrbrr
wrwrgwwrwrugrwrrurbuuwgurgbrgbrwwbwrggwbrbbuugrbbwugrwb
rugbbggbuggwgwwuruwrwbggwgburuubuwugbggbrbgubrwgr
ubrrwuwguwwrbgwbbbrrgrggrgrgwgbrugubuwwwwuwguuurwb
ruguguwuruubbwwwgwgrrrwrwwuuuruuuwuwgwubwwrwu
brggrwrbrwwwuwwbwrgwbwurbuwwrbrgrrugbwugrbguuwb
gwuugwuuuggrgurbbwggrubbwuurruuwrggrggurgrrwrrgbrb
ugwggbgbbrrwgwrbuggurrbuugbwrurbbuggubwbgwgwuwgwrrrwubuwurwb
wwuugrrggrbrrgwuuugbwbwrurrbuwwwubwrbrggubbubbgrrr
ggwuubgurubrurbwgrwwuggururbrgruwgruugugrbwgrbubrbrb
rwggguwwubburgwwuurrurrrgwgbrgbbbrruguwbwugguuurr
rrbwbrrwbuwwbwrrbbbwwubuwgurrguwugguwrbuwuubbwuwrbggbuu
grgrbggrburrbgwbwbuugugbburbrwrrrguuwbugggugrrrgrwrwb
buubrrggburbggwgwgrbgurwbwwwubbwbgbwwuwbwwrwb
wguuurrggwguurburgugugbrwrgbwrrwbgrugwuugbwgbbuubggrugbub
wbwgruuugggrrubbwrwwubugguguwwguubwurwgwwrbgubwrgbbubrwb
ruwrggugbbbbgurwggruuggwwggrwwrwbbbrwguuuuug
bggwwuwgwbuguwggrgurbwugbbbuurwgwuggubgrwbwwwbwgrrbuug
rrgwugbuwugubuuggbrwwguurwuwugwuuuubgrwrrwrbgrgwbuggwr
grguwrrurgbwbwrgwwwrggrwbwgbuwbbbwbggrbrwbbrwb
uubgbrgrwbbgwrbrwwgbgburbuurbubbguuwbgbuuwburbubggguug
gwbgwrbwwwubuwwrwbbwrrrgwuwbrubwbgggubugbwwgggburrbugrgu
bwgwguugggbrrbuggwggwgbrbugurbwwuuwwwugbbubbrwb
rwgwbgbwwuwrbgbgwbrwuwruuubbrbwwuruwbwrbrwrwrgru
wwrbwwwurggbgggugwuggubbbwgrrwrbwwuugwrbubwgrbgrrr
ubrubggrgguugburwgbbrwurbrburuuwwrrbrrwwbgwbgggwugurugwwrwb
gbggrubrgubgubbwwwwuwrbburrgrwbrgrwbrwguuwwuwrgguwrwb
bbwgbrwggwrbwugbgubugwwuwwggbgubwubgggwwrbgrwrwwgb
uubrbgbbguugrruurbrwbbuuuubbwwuruuuwbbgwbgrbwrrrgb
bbbwugurwrwurgbuuugrrruubrwrgwguwubrurgburbgrrwrr
gggwwgwubwwwrrbubuuuggrgrgburugbgbuurbgrugrwrgwgruu
burugbguwbuwgubugubbburrgrrwuruubbrbrwwbwrburubwubbb
wrwbwrbggggbgbruwwwubuurwbgwgrrgrwubwrrbbggrgbwbwbbbuwbbrwb
uuurggrbbwubuwbwbwrgrbbwgrgugbrruguuugrgrubb
buuugbwbbgwrgruuwrbwbgwbbrgwbrgrwruwwwgwruggrb
rgwrrguwuugbgrbubgbuburgrbuuwwgbbwgurrwwubrgwguw
ruuwwurgwurgbuwurruurbbbbugrubrrgwrgurgubbgbbwgugrwb
urrwrwgugrrbbrgggrgubwbrwwgbgururbwruguwwrgburg
rugrggruuubgguuwwwbgbgbbgugrwgurrruubrgburgrrwb
ubwwrugbguwrrrbwuwggrwrwrububurbgruwbgwrbbbgrrrgggwr
wuggwbgwbbbwugrbbwwubgrbwrgrgrrgwuuwgrwgwwurug
bgwwbbbwrrwugwgwwrruggrbwuwbwwgrwrgrrguwgrurwgurgggrrwb
guwrwubwrwwwgugguuwwurbgugbuwrrbwrguuwgbwbbgbgurrgwbbu
gwugguubwruguubuguguugbuuugrrwrrrurrbwgrbwgwugburuu
brwgwrbbgwurgrugggrrbbwruugrgburrwggwguwuuwrrbw
bwbugwurgbgurwwrugurgbbgbuurugggwugubrwb
bbbuuubggggggwrbrgbbwruwuuwugurbubgwgrrguugbwuggrubrwbwgr
wgrrrurugrbgwbgbbrrgurrgwrurrwwwbgrguuggrgurwww
gubbrbwurgwwbbggurwgbgrwrwbrugrwrburgrrugb
uubuubgguwwbrrwwwwubgwbbwbwwwwugguguwburgbrbbbg
ubgrwugugrruwuurrwguggwuwbrwbwrugruuuwrugwwuwrubuugbrwrrrwb
wrgwguugruurububuurwurrwuggrrubbrrrgugwuugwurgrg
bwubggubrrburbrbwggrurwrbwbgbbgwggubggbubrububrwb
urugwwbubbrrwwwrbrwuwbwurwgrurbwbrurbrwrgrruburwb
rruubgwwwgrwrggubgubwrbbgwgbguruwwgrgburgwrg
rgugrgrbbrgwbguwgguguwrrubgwwgwgwuwubwbwrggbwuuuwrrbwgwu
gwuwbwuwwbwwggbbgrgwugwrgugruuubgwguwwgbbrwb
bbwuguwwwuguuuuurrbbububurbwruuubugbgrbuwgrururwb
bbbugrrrbrgburgwuuruwrbwgwrgwgrugbrgububrbwwgrbrgbuwbgguu
bubwuuwwuwbggrwwubruwbubbwwgwrubuguwbuuwugwrbbugr
uwrgubbrrgguggubuuwrrrwrrurbuubrgbbbwgrwub
wbbguubbbbguwuwbwrgwwubwrurgwurbrrwurrbgrbbburw
rgbwugbubggbrbwgbuuubrwgbrruwggbbggbbuggwg
rgrugbgrwbwgwuwrbggrwuburrbguwguguuugwgubrgruwwbw
uuuruwuurbwubrwgwuuwbugrrwggbwwubbugwgubbrwgwwwugbwwrwb
brgbguwuwggbbwrbggggbrbubbwbrwbbgwuubbbbgwrgwgbbwu
uggrgrubuuuwruuurbuwwugbwwgwwguubuggubwwugrrwbggwrgubrbwrw
wbburbgbbrbbggrgrrurwwgurbubwuurwwgwbwrgbguuuwrubwwubuu
buwbgbrwgbubbrbrgwuwbgbrwburgbbrwgguwwbwgbwbgbww
gurwggwurgwbbubbgbgruggbrbubuwbruwwrwguggrbbbrggwgbrgbgu
wbwwwbbbwgruuuwubbrrgbbggwbrgwwbgurbbwgwgwgrbggwrugrugggbrwb
bbgrwgruggrwwurwwrggbruugbbrgwggrrugrwuuugbrrwb
wwbugbwuguwgbrwrwgrrbuwgwuwgwrbbbubwwgbrguwuw
ugwbgbwrrgbwrrrbrwwguggruwugwwurwrrbgwubbwrggugbruuw
bbbruuwuwwurrwbuwbuguuggurgbgbruruwurgbgbgrrwb
bggwgrggrrugwwbuwgbrbbgwbbuwwuwbrgbwbggwbbgggugwggrwbbur
uuurruuuuugrbuwwgrbwwuuwbruggggbgrbuuggbuuuwgrrb
gbgrgubggbgrgguuwbwbrwbggwurgbwwwbrubwgwrggrbwurggrwrrr
ggbrbrbguwguuugubruggbgwbbuwwrbuuugbuuwgww
wurrbururbgrbrgwggwggrgrgrgbgrrgbbwwgbrgwururwb
uubugrgbrubuggrggrbwbbbruwbrrwugugrurwbgwwwbubgrggr
rgwwbwgbwugugrwrrwubrwbgwuwuruggbguubbwbugururu
wbuwrbggrrwbgbrbwwwbbgwbwrrggubrubbwbubrgwrwburbgb
gbwuruuwuwwwbggurugrwgwubbgbwwwurgwbruwgbgrbwrgurwb
gwururwwugrrubbruwbuwrbgwrbruugbuuugggwbubwubb
wgrgrrgwwruugbrrrbwwrwrrgbguwwgwrbgwuuwbgwuwrugg
ugurwrbgrbubwbbgrwgrwrbgwbwuwubgrbuwwrubrggwuguwbgbu
ugrrburuwwrrwgrugbruwgwbbubrbuwbwwruuurgbuwwgwgbwwbuburwb
wurugurbrbubbbbburuubrbrrbwubguwggwubbrbrbrgurrbwwwuggwg
bwrburggbggbbgbuguwbgwwbbbubugwguwbbgbgwbg
gbwrbgbgbrugbbguruuwgurwwruggggbuburbgwwrwb
rubrgwubrrrrrwbwbrurbwwggrrburrugrrubwbbguwbbgrwwrbburrwbr
wgbuurbrrbgrugwgubuwbgurrwwuwgrbrgrbgwrwwbrururuuwrrrwb
grwuuggwugwgrbggggbwbgwububwrgwgburrugurbugurrrwrwrububrwb
bbggugurwurrgggrrbbrurubbwbuwbbwwbrwgrrrubrgur
gwwwugwuguubuuwgbgruruwguugrbbwgbbwwgrgrwwrrrrrbuwbbwburwb

1
2024/day-19/input-towels Normal file
View File

@ -0,0 +1 @@
rwgw, ruwgb, urwbr, wu, uurbubr, gbbr, uwwb, rubgwu, wggwbwr, rugubuww, uw, rgru, rgrr, rrg, rbb, uurbrww, br, uwrwrwgb, bwbw, wgbu, wggu, urg, ugr, ugur, gurrbrr, ubgrruu, bb, rburguu, urgg, wggugggr, brww, bwwgr, wugub, grgg, ugw, grubw, gbwru, rww, wbu, ggwbu, ugurw, ggwb, uubuwgb, bbugw, rgg, wurr, bwbb, wburbb, rbrb, bbrwgw, gwbb, ubggr, gurr, rrr, rburg, uug, bbrubu, bwgu, gwug, guw, buwurgw, rruwggg, ubb, wwb, wbrg, wgr, wgrw, gubrr, rrwru, gbub, rbr, rwr, rubwu, ub, bgwr, gu, ggggwrbr, wrw, grg, rbuwu, bgbr, ugww, wrg, brwub, gruu, gbwbw, wubw, wur, grggwb, uuwuug, wug, rruuw, wgwg, uww, gbgu, rurr, gwguu, gwrwbw, guuww, rbugw, gg, uwbw, ubgrubur, wurrb, rgugurr, wrr, buggb, urwrb, ubuu, rgu, gwggb, uuu, uub, bruubb, bww, uwgb, rrubwg, ubwu, ugu, buwrrbwr, bbr, rbrww, ubuwg, bwwrr, gbwg, bw, gguugu, bgbbw, ggb, wrruuwbr, rug, uur, rgw, gbb, wuwg, r, guug, gwb, wbgr, bbbw, grwgwr, gwg, rurur, bubu, rguu, brb, ugbbbrr, wugrrr, bbw, bbru, bgrbubg, ubw, uruu, wgrgrwwr, bbwrugu, gbbbwur, rubbwbuw, wuwrwbu, brwbru, wub, rbrg, wwbwrbu, grbbu, ubbbwb, urw, gwuw, uu, urwugu, bgw, gw, rbwwwurg, gubr, bbu, rur, rburwgr, gwwgr, gb, rbur, rbw, ug, wurur, gbbrrb, ruuuwugr, wwrgug, gbrugu, wrww, wuwbgw, uwwwgrgb, gww, grwwu, ggu, rrurr, bgr, ubugwu, wwgwur, urrrbw, bwr, wrbgbu, wrwbb, gug, bwu, ruurw, rw, wbb, bbwgwrr, wgg, ugwu, wr, wwwr, w, wbwbuw, guugg, bug, bbbb, brbb, brur, rbg, wuu, wurwgb, rru, urrrbugr, grr, rubu, uugrwbb, bgbrurr, wgw, gub, ugwwgr, urwr, wbwbg, wrrb, rwrgg, ggwgrgw, bwbu, uwb, rg, urr, brrur, wg, u, bu, ubbbrw, brgbbbbu, wgrgu, bgb, ubu, uugubg, bub, rwrr, gggbrw, gwwrww, grub, urgrgw, bru, wgwgb, wubrg, ugrwwbb, wbgwrru, gbwb, wugu, uwwwg, ubr, gwr, bguwb, guwbw, wrb, grw, gwwgbb, wbwwr, grbwub, ubg, bwbgw, rwu, uurb, rbwgur, ubbr, grrr, ubwg, rgwuug, rgb, grrbub, bwb, uwuuubg, wrugb, brurub, wurg, urur, uru, bwwrrr, urwub, uwr, brr, ggg, bbg, bgg, guuruuu, ubwb, uburgbb, gbgrgug, rbwr, uwu, rwwbuugr, ubwwg, wwr, brg, wruububu, bgbb, ww, wrgbu, ugb, gru, bbwgbr, brw, bwwbb, wbr, grbg, wbbb, brbrwwbw, gbgwrrub, wwu, wgb, rruruu, wuggr, urb, bwg, wbg, rbu, wwg, wuw, wrbbugg, rb, rrgrbrg, guu, bwwugr, rwrb, gwbrb, wrugub, ubbrwu, uggbb, ggr, wwru, rgbb, bbgbgrr, wuruw, gbg, ubbwrg, bur, wuwuu, bgu, ruwgur, gbu, wwuwb, ggbgg, ugrbb, bugw, rggrb, rrw, rgwru, ubru, grbbuw, wbrr, wruu, ggw, wbgguuw, rggrugw, gbgwwg, gwwru, gur, rr, wbgb, burbwr, rggu, wgwu, rwuug, gwrbr, wbbwbgb, wurb, gbbuggg, gbbgbg, ur, ugwwu, wgu, bg, urrbgr, gurwg, bbb, urrr, bwurbrr, gbr, gwurb, ugg, uwbbrr, buggr, rub, bwrgbw, uwbb, ububggw, uuwrbbu, rrrwr, ruwgub, bugb, wwrw, gwbg, wwwrrr, urgggwb, gwuwr, www, g, wgrg, wbuwb, grwrg, uuw, wuwgb, buru, rgr, rrgu, urbgb, wgrr, gbuwww, rrgrgw, rgbrg, gugbuw, rrb, rrgbug, ugwbrgw, rwuw, grugrrbr, gbgww, ruw, wubb, gr, ruu, ubbg, brgurb, rwg, gwu, ruwr, grb, uwg, wgww, bgbbrww, buu, rurbgr, rwbw, gwwr, rwwbbugu, grgbr

90
2024/day-19/solution-1.sh Normal file
View File

@ -0,0 +1,90 @@
#!/usr/bin/env bash
TOWEL_FILE=$1
DESIGN_FILE=$2
TOWEL_ITER=10
read -r -a TOWELS <<< "$( < "$TOWEL_FILE" tr ',' ' ' | paste -s -d " " )"
read -r -a DESIGNS <<< "$( < "$DESIGN_FILE" paste -s -d " " )"
#printf "Towel %s\n" "${TOWELS[@]}"
#printf "Design %s\n" "${DESIGNS[@]}"
# Check if towel is a viable match
match_towel () {
TOWEL=$1
MATCH=$2
FULL_DESIGN=$3
TO_MATCH="$MATCH$TOWEL"
PARTIAL_DESIGN=${FULL_DESIGN::${#TO_MATCH}}
if [[ $PARTIAL_DESIGN == "$TO_MATCH" ]]
then
return 0
else
return 1
fi
}
TOTAL_VALID=0
declare -A UNMATCHED_TOWEL_LIST
for DESIGN in "${DESIGNS[@]}"
do
printf "Starting design : %s\n" "$DESIGN"
declare -A MATCH_LIST
# Get all viable starting matches
for TOWEL_IDX in "${!TOWELS[@]}"
do
TOWEL=${TOWELS[$TOWEL_IDX]}
#printf "Testing towel: %s\n" "$TOWEL"
if match_towel "$TOWEL" "" "$DESIGN"
then
#printf "Starting match found. towel : %s\n" "$TOWEL"
# Copy towel list and remove the starting towel
read -r -a TOWEL_LIST <<< "$( printf "%s " "${TOWELS[@]}" )"
unset "TOWEL_LIST[$TOWEL_IDX]"
# Add to combinations
MATCH_LIST["$TOWEL"]=$( printf "%s " "${TOWEL_LIST[@]}" )
unset "TOWEL_LIST"
fi
done
if [[ ${#MATCH_LIST[@]} -eq 0 ]] ; then printf "No available starting matches.\n" ; continue ; fi
# Now iterate over starting matches
LOOP_COUNT=${#TOWELS[@]}
while [[ $LOOP_COUNT -gt 0 ]]
do
for TOWEL_MATCH in "${!MATCH_LIST[@]}"
do
read -r -a TOWEL_LIST <<< "${MATCH_LIST[$TOWEL_MATCH]}"
# Iterate over towels and find subsequent match
for TOWEL_IDX in "${!TOWEL_LIST[@]}"
do
TOWEL=${TOWELS[$TOWEL_IDX]}
if match_towel "$TOWEL" "$TOWEL_MATCH" "$DESIGN"
then
#printf "Match found for %s towel : %s\n" "${TOWEL_MATCH}" "$TOWEL"
unset "TOWEL_LIST[$TOWEL_IDX]"
# Add to combinations
MATCH_LIST["$TOWEL_MATCH$TOWEL"]=$( printf "%s " "${TOWEL_LIST[@]}" )
unset "MATCH_LIST[$TOWEL_MATCH]"
fi
done
done
(( LOOP_COUNT-- ))
done
# Calculate proper matches
for MATCH in "${!MATCH_LIST[@]}"
do
if [[ $MATCH == "$DESIGN" ]]
then
printf "Match found for design %s\n" "$DESIGN"
(( TOTAL_VALID++ ))
fi
done
# Remove matches
unset MATCH_LIST
done
printf "Total valid designs: %s\n" "$TOTAL_VALID"

76
2024/day-19/solution-2.sh Normal file
View File

@ -0,0 +1,76 @@
#!/usr/bin/env bash
TOWEL_FILE=$1
DESIGN_FILE=$2
read -r -a TOWELS <<< "$( < "$TOWEL_FILE" tr ',' ' ' | paste -s -d " " )"
read -r -a DESIGNS <<< "$( < "$DESIGN_FILE" paste -s -d " " )"
# Check if towel is a viable match
match_towel () {
TOWEL=$1
MATCH=$2
FULL_DESIGN=$3
TO_MATCH="$MATCH$TOWEL"
PARTIAL_DESIGN=${FULL_DESIGN::${#TO_MATCH}}
if [[ $PARTIAL_DESIGN == "$TO_MATCH" ]]
then
return 0
else
return 1
fi
}
TOTAL_VALID=0
# Loop through designs
for DESIGN in "${DESIGNS[@]}"
do
# The idea is for each design, keep a sum of combinations
# for each index position of the DESIGN string
# Since the branches "multiply", just take the sum
# at the starting index, and add it to the end
# of the "combined" index
# for each possible combination.
printf "Starting design : %s\n" "$DESIGN"
declare -A POINTER_LIST
POINTER_LIST[0]=1
POINTER_END=$(( ${#DESIGN} ))
while true
do
POINTER=${#DESIGN}
# Pick lowest pointer value
for P in "${!POINTER_LIST[@]}"
do
if [[ $P -lt $POINTER ]]
then
POINTER=$P
fi
done
POINTER_VALUE=${POINTER_LIST[$POINTER]}
# Check if end has reached
if [[ $POINTER -eq $POINTER_END ]]
then
break
fi
# Loop through towels and remove earliest pointer
for TOWEL in "${TOWELS[@]}"
do
TOWEL_LEN=${#TOWEL}
END=$(( POINTER + TOWEL_LEN ))
if [[ ${DESIGN:$POINTER:$TOWEL_LEN} == "$TOWEL" ]]
then
POINTER_LIST[$END]=$(( ${POINTER_LIST[$END]} + POINTER_VALUE ))
fi
done
# Done looping through for specific point
unset "POINTER_LIST[$POINTER]"
done
printf "Total matches for %s is %s.\n" "$DESIGN" "${POINTER_LIST[$POINTER_END]}"
TOTAL_VALID=$(( TOTAL_VALID + POINTER_LIST[$POINTER_END] ))
unset "POINTER_LIST"
done
printf "Total valid designs: %s\n" "$TOTAL_VALID"

8
2024/day-19/test-designs Normal file
View File

@ -0,0 +1,8 @@
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb

1
2024/day-19/test-towels Normal file
View File

@ -0,0 +1 @@
r, wr, b, g, bwu, rb, gb, br

View File

@ -1,6 +1,6 @@
#!/usr/bin/env bash
INPUT_RULES=$(cat input-rules)
INPUT_RULES=$(sort -n input-rules)
{
while read -r LINE
do
@ -27,7 +27,10 @@ INPUT_RULES=$(cat input-rules)
do
# Loop through rules and build all the KVs
DAG_GREP_EXPR=$( printf "%s" "$CACHED_LINE" | paste -s -d '|' )
KV_ARRAY=( $( < input-rules grep -E "($DAG_GREP_EXPR)\\|($DAG_GREP_EXPR)" | tr '|' ' ' | paste -s -d ' ') )
read -r -a KV_ARRAY <<< "$(
< input-rules grep -E "($DAG_GREP_EXPR)\\|($DAG_GREP_EXPR)" |
tr '|' ' ' |
paste -s -d ' ')"
# Going through dependencies to find final key
KEY=${KV_ARRAY[0]}
while true
@ -38,18 +41,17 @@ INPUT_RULES=$(cat input-rules)
if [[ ${KV_ARRAY[$i]} -eq $KEY ]]
then
KEY=${KV_ARRAY[$i+1]}
BREAK=1
break
BREAK=1
break
fi
done
if [[ $BREAK -eq 1 ]] ; then continue ; else break ; fi
if [[ $BREAK -eq 0 ]] ; then break ; fi
done
printf "%s\n" "$KEY"
CACHED_LINE=$( printf "%s" "$CACHED_LINE" | grep -v "$KEY" )
done | tac | paste -s -d' '
done
} |
tee final-output |
awk '
BEGIN{ total = 0 }
{

130
2024/day-6/input Normal file
View File

@ -0,0 +1,130 @@
.....#..#................#...#.....#.......................................................#.............................##.......
......................#..............................................................#..............#..........................#..
.........#........................#.....................................................#..............#...........#........##....
..........#......................#.....#...#............#..........................#.....#........................................
#....................................................................................................................#............
.#....#......................#.......................#...............................#...#.....#...................#........#.....
..#..#.......................##........#...............................................................#........#.........#.......
..............................................................#...#.........#..#..................................................
.............####..................................#................#..#.....................................#.....#..............
..........#................#................................................#........................#.....#......................
..............................................#.........#.....................#..................#.......................#........
.........................................##..#.................................#.....#............................................
............#..#...#...............................#.#.....#...............#...............................#..............#.#.#..#
.................#..........#..#....#.....................#......................................##............#..................
.......#....#.....................#......##...................#..............#.................#........#..#......#...............
...............................................#.............#....................................................................
..............#..............................................##..................#..........................#............#........
................#.......................#..#............................................................#..........#..#.........#.
.#.......................###............#.........#.................................................#.............................
........#......................................................................................#.....#.......#...#................
#.#.........................#..#.............................................#....#........................#......................
.......#.....#...............................#.....#......................#.................................#.....#...#...........
................................................................................................#............#....................
.......#......#...............#...#............................#................................#................................#
.#.....................................................................................................................#......#...
...........#..........................................#........#...................#..............................................
....#......................................................................................#.....##.#...................#.........
...#..........................................................................##.......................................#.....#....
#........#................#...............#.........#..#.#..............##..............#........#............#....#.....#........
......#......................................#...............#....#..#...........................#................................
#..............................................................................#............#...#..#....................#......#..
.......#.........................................#.........#.......#....................................#.........................
......#......#.............................................#.....................#...........#.............#..#...................
#.......................#........#............................................##..............................#...................
..........................................................................#........................................#....#......#..
..........#..#...............................................#............................#.#..............................#......
....#...........#..#...................................#................................................................#.........
..............#..........#...............#....#.....................................#.......................#.....................
.............#........#....#.........#...............#.........#..................................................................
.#......#...................#.......#...........................................................................#.............#...
.............##...........#.........................................#......................#.......................#..............
.....#................#.....#...................##.......#......#...........#.......#............................................#
.#..#.............................................................#..............................................#................
...#......#............................#..........................................................................................
...................................................................................#..............................................
#...................................#...................##..................#...............................................#.....
................#.....#...........................#...............................................................................
.................................#............#........................................................#.............#............
..................#......#........................................................#..^.....#......................................
..#.....#.................................................#........#.........................................................#..#.
................#..............................#....................................................#.............................
................#....#..........................................#............................#....................................
...............#.......................................#.....................................#..............................#.....
..................................................#............#..............#........##.#.....................................#.
.#..................................#......#..#............#.................#.............#......#..#.......................#....
..................#..............................#..........................#..........................##............#.......#....
.........#..................................................................#...................#..........................#......
................#....................................#............#............................................................#..
..##..........#.#..#........................#....#.................................#.............................................#
............................................#.........................................................#..#...................#...#
.......................................#......................................................................#...................
....#.......................#...#.........................................................................#................#......
...........#...........#............#.....#...#...................#........................................#.................##...
....#...........................................................................................#.................................
..............................................................................#.#.............................................#...
.........#..#..............................................#......................................................................
#...................#........#............#.......#.....................#................#.#.#............#..................#....
.......................#................#.....#...........#.....................#...........................#..........#.........#
........................................................................#.#.....................#.................................
...#.................................................#..........................#........#.......................#................
............................#...........#.......#.................................#.##...........#............................#...
...##.....................................#.........................#...........#...................................#.............
#.#..#................................#.........#..#.#..........#......................#............#......................#......
....#.............................................................#...............................................................
...............#.#......#........................................................................#.........................#......
................#.....#...#...............#.........................................#....#...........................#.......#....
...............#.........................................................................#........................................
..........................#..##...................................................................................................
.##....................#..#.....................#..............................................#........................#.........
............................................................................................#............#........................
#...................#...#......................#...............#............#....................................#................
...........................#........#......................................................................#......................
................................#...#...#.#.......#.................#.......#................##...................................
........................#.......................#.................................................................................
#...#...............#.........................................................................#.......................#...........
.........#...................#...............................................#...................##..............................#
.....#............................................................................................................................
.#.......#...............................................................#.......................#................#..........#....
....................................#..........#......#...........................................................#.#.#..#...#....
......................#..............................................##..................#........................................
....#......#...................#................#..............................................................................#..
...........#.................##.#...................................................#..#................#.........................
......#.....#......#...#........#.....................................#....#...........#................#..........#..............
#.......##.....#........#...........................................#...#..........#.............#........#.......#...............
......................#......#...................#.........................#........................#..................#...#......
.....#...........#...#.........................##.......#.....................................#...................................
....................................................................#.............................................................
........#...............#.........................................................................................................
.......................#.........................#..........................................#.#....#..#....#......................
........................##............................................................#.....#.........#....#......#..#............
........................#........#..................#................#.#.##............#..........................................
.......................................................#.........................#...............##...................##....#...#.
........#...#.............#...........#........#......................#...#.........#..#..................#.#............#........
#.#....................#..........................................#...................................................#........#..
...............................................#............#.....#.#...........#........#.#....................................#.
......#..........................................#............................................................#..........#...#...#
....................#......................................#....#..............................#....................#.............
......................#.#.....#......#....#..#....................................................................................
.....#..........................................#.........#...................................#................#.......#..........
........##....................................................................#...................................#.............#.
#.........................................#..#....#................#.#.....#....................#............................#....
#....#..#..........#..................#......................#....................................................................
...................#..#....#...................#...........................#.#..#............#......#................#.......#.#..
...............#......................................................#......#..#..............#.....................#............
............#.....................#.........#....#...............#.......#...#...............#.......................##.#.........
....#............#..................#....#.......................#..............................................#...#.............
..........................................#....#..........#..#....................#......#......................#...#.............
............#..........#...........#......#..#......................................................................#.............
...#.................#.............................................................#..............................................
.....#.#.........#....................................................#..................#...............#........................
..#......................##.....#.........#..............#..#............#..#............................................#........
...................#.....#.........#........#....................#..................................#................#............
....#.............................#.............................#.......................#.......................#.....#...........
...#......#....#...........#............................#.....#........#......#...................................................
........#..........#............................#..#..#.......................................#....#.##...........................
.......#......##........#.................#.............................................................#....#........#...........
.....................#............................................#.#......#.....##....#........#.................................
...........#.....................##.#....#..#.....................................................................................
....................#......#................................#.....................................................#.......#..#....
.....................................................#.........#.......................................#.....##..#................

56
2024/day-6/solution-1.sh Normal file
View File

@ -0,0 +1,56 @@
#!/usr/bin/env bash
ARRAY_SHAPE=130 # It's a square
FILENAME=input
read -r -a MAP_ARRAY <<< "$( paste -s -d '' "$FILENAME" | sed -E 's/(.)/\1\ /g' )"
# Get initial position
POSITION=$(( ( $( grep -n '\^' "$FILENAME" | cut -f1 -d: ) -1 ) * ARRAY_SHAPE -1 + $( grep -o '.*\^' "$FILENAME" | wc -c ) -1 ))
MAP_ARRAY[POSITION]=X # Remove position after save
# up = 0, right = 1, down = 2, left = 3, following 90 degree turn
TURNS=0
while true
do
EXIT=1
# Get direction and travel
DIRECTION=$(( TURNS % 4 ))
if [[ $DIRECTION -eq 0 ]] # up
then
TRAVEL=-$ARRAY_SHAPE
LIMIT=$(( POSITION % ARRAY_SHAPE ))
elif [[ $DIRECTION -eq 1 ]] # right
then
TRAVEL=1
LIMIT=$(( (POSITION / ARRAY_SHAPE + 1) * ARRAY_SHAPE )) # Never verified
elif [[ $DIRECTION -eq 2 ]] # down
then
TRAVEL=$ARRAY_SHAPE
LIMIT=$(( (POSITION % ARRAY_SHAPE) + (ARRAY_SHAPE * ARRAY_SHAPE) ))
elif [[ $DIRECTION -eq 3 ]] # left
then
TRAVEL=-1
LIMIT=$(( (POSITION / ARRAY_SHAPE) * ARRAY_SHAPE )) # Never verified
fi
while [[ ${MAP_ARRAY[$POSITION+$TRAVEL]} != '#' ]]
do
if [[ $POSITION -eq $LIMIT ]] # Walked out
then
EXIT=0
break
fi
MAP_ARRAY[POSITION]=X # Mark walking path
(( POSITION+=TRAVEL ))
done
if [[ $EXIT -eq 0 ]] ; then break ; fi # Walked out
(( TURNS++ ))
done
# Count all coordinates
printf "%s" "${MAP_ARRAY[@]}" | tee travel-path | sed 's/[^X]//g' | wc -c
< travel-path fold -w $ARRAY_SHAPE

10
2024/day-6/test-input Normal file
View File

@ -0,0 +1,10 @@
....#.....
.........#
..........
..#.......
.......#..
..........
.#..^.....
........#.
#.........
......#...

850
2024/day-7/input Normal file
View File

@ -0,0 +1,850 @@
7101833: 8 23 8 638 9 15 529 8
7780812: 8 204 1 59 366 16
89615: 530 79 8 5 18 8 47
464790: 242 2 32 5 30
39059: 106 23 16 42 9
24598226: 58 30 7 3 3 61 84 8 338
4571167: 40 86 23 132 7
10387964196: 3 99 7 9 99 5 4 96 41 9 7
2564794: 3 1 641 7 86 4 1 3
707818803: 34 656 1 409 24 85 1
35441062: 8 3 1 364 3 3 6 6 773 1 7
56870: 79 4 13 631 12 2
28644: 43 99 46 77 2
360441: 31 8 7 5 6 34 8 1 55 9 9
206255659: 55 625 941 2 6
954432: 188 559 6 286 664 9
80328848: 99 1 74 563 164 5 8
123216: 7 409 43 3 86 9 9
13503056: 21 1 66 91 8 2 4 24 83
1126406052: 2 99 57 3 2 1 47 3 8 2 50
1330: 1 8 6 8 9
3072475: 133 660 35 175
167379808: 3 315 8 61 638 32 89
3407292461: 97 5 61 97 9 167 7 46 4
835800: 823 566 11 597
2891773: 4 803 27 81 9
5749267952: 4 27 8 427 78 6 1 7 373
488720845: 512 28 5 1 954
1446688: 70 29 34 46 424
2561802992641: 7 41 1 54 3 720 9 296 8
33303: 56 1 7 82 399 106 80
229572441: 629 7 869 4 6
57795644: 6 7 835 100 2 659 25 1
4188: 691 1 1 5 6
179760753: 85 78 7 885 7 569 6
6490694: 6 3 8 253 8 727 4 1 37
806642157794: 672 31 6 1 160 57 242
358281075197: 846 5 847 134 617 95
16673934692: 7 870 79 67 3 898 1 4
342016891916: 91 9 29 17 1 2 9 8 2 7 14
1309152: 708 8 570 21 4 5
158201: 36 135 925 19 5
3198550: 53 850 1 71
8459: 836 9 9
358261919652: 6 2 2 1 3 2 757 7 91 3 76
2654750: 6 2 17 1 8 4 887 2 7 370
1799: 32 52 122 7 6
15090313022: 277 38 672 874 544
489: 7 8 3 6 2
11292858246: 41 630 98 93 3 3 3 97
50924541: 9 152 8 62 5 2 3 3 3 9 6 3
4108700: 79 95 963 582 454
17033004: 8 606 65 79 225 2 2 27
49809068987: 3 561 2 9 5 9 2 8 2 1 7 84
10675: 5 66 887 3 4 671 6 859
9179: 75 9 2 985 602
18669464: 1 4 4 51 2 4 2 7 726 706
48495: 9 6 737 4 61
480747725: 7 4 4 97 44 11 4 4 4 41 5
21026492251: 700 13 8 66 3 3 922 50
10912112: 2 79 2 97 4 89
13871882: 529 4 517 26 441
232442656: 404 8 118 931 608
6811200: 55 3 8 60 86
3146536: 8 596 3 106 645 870 1
12102281: 15 27 6 5 10 71 46 1 7 9
694740250: 6 94 7 40 10 7 3 56 77 9
599701273686: 8 48 1 86 1 7 4 2 736 86
1446: 61 7 4 651 2
36268684863: 330 7 8 42 6 8 99 59 15
3784: 3 41 204 51 1
22691: 640 34 87 22 822
21245261: 236 9 50 2 58
3539: 1 348 8 729 1 17
2402633760: 58 2 6 2 86 8 1 5 2 8 2 8
13674: 5 4 74 393 4
26300: 9 370 52 61 9
412170: 80 3 2 17 827 190 961
1682678: 39 24 89 3 5 78
220786769: 885 1 8 8 2 874 4 47 8 7
9804704: 300 722 7 7 91 8 13
1009698: 62 2 5 1 811
47772073: 682 3 1 573 7 61
1680743: 1 7 94 9 749 68 1 9 4 1 2
10287000371: 834 749 716 23 683
231: 8 1 5 217
299104: 3 63 530 8 52
3984313369: 4 990 24 313 371
302706: 6 714 6 27 402
6592950: 6 7 245 90 23
22408805: 635 4 797 44 335 16 2
25300956: 5 4 316 5 2 39 4
670014687: 9 456 2 6 5 4 2 2 2 3 5 6
2994640: 4 9 5 80 913
11160: 50 8 3 6 62
8048754: 31 5 5 8 93 9 64 6 3 9 7
1100950422: 917 2 5 3 7 2 4 5 46 3 4 2
148411: 405 7 9 8 76 6 43 1 8 53
201703999068: 9 465 76 54 11 739 78
7930833540: 7 9 26 2 8 3 889 62 6 5
2560177235: 54 64 81 1 81 8 57 2
3197868660390: 9 5 1 8 5 973 6 28 5 78 5
797967: 74 1 1 1 2 6 7 23 53
31800381: 683 8 45 2 462
104425891: 714 5 750 85 39 76
13388732520: 87 6 56 8 39 6 2 734
74503972: 4 6 74 3 99 7 73 6 7 4 1
56066: 95 155 1 8 68 3 9 7 6 1
9789: 23 5 85 12 2
1883356738: 14 582 3 4 7 9 5 41 5 9
1122843692: 7 5 8 7 802 4 1 2 1 59 9 9
174: 1 1 6 1 17 38
618640525: 1 63 1 8 94 440 527
200992: 7 33 9 2 7 1 542 371 81
1431: 768 6 102 53 465 39
3651582565: 80 285 1 57 3 3 6 86 6 4
5275893: 961 3 5 366 5
8543031603: 47 7 84 668 10 259
28824872722: 6 776 6 838 619
1913: 26 581 3 43 49
593569: 7 25 229 81 1
37958928: 1 3 8 2 2 7 1 7 9 2 51 36
543002: 3 620 150 4
83584938: 8 357 5 9 941
8982484: 57 57 14 343 196
168365: 97 6 22 15 272
39964: 3 81 709 6 50 47 55 6
1170: 8 38 866
13069: 8 2 8 5 8 69 906 3 6 8 4 9
4680683: 302 19 8 347 41
284935: 7 44 10 16 56 7
215258168915: 331 65 10 813 3 8 917
1404: 21 3 9 5 8 7 2 4 1 6 64
551991910: 4 53 98 71 7 21 190 6 6
5571653: 8 4 8 7 1 59 425 306 8 5
152190048: 5 854 495 100 72 48
12859128: 627 5 83 666 6
12131355: 98 3 356 302 5 3
2436480: 5 130 94 6 32
56493: 5 562 20 69 224
337176: 3 51 18 7 669
1341288165: 2 821 207 9 5 470 789
22726: 3 500 9 5 91
3888122: 8 8 8 6 122
385113961: 705 8 174 54 1
1986229248288: 7 3 6 9 4 698 4 7 20 7 4 6
287: 42 3 1 3 32 8 117
1264569607: 969 3 971 8 6 2 8 8 56 7
17520825: 483 9 6 5 805
4807782: 5 74 7 207 42
2541221460: 3 6 60 6 682 9 84 5 457
4384372: 410 4 280 3 7 4
198714684916: 35 3 249 6 5 2 42 91 9
16450573: 1 7 8 35 4 7 48 40 6 6 7
8940765: 2 980 244 1 6 3 15
64337: 6 35 28 399 101
83837925: 5 972 1 2 5 15 57 517 4
703676: 2 9 5 9 54 3 65 38 538
24717026880: 65 504 6 6 3 7 998
42961723002: 17 2 841 2 64 2 9 33
5646535697: 13 86 5 56 4 7 1 6 569 7
117727390611597: 218 41 81 644 550 98
56133: 1 9 9 81 7
4842: 6 20 416 96 9
750: 82 82 4 2 3 89
483448142: 37 514 9 93 308 3 2 37
2184449: 34 9 5 646 8 34 3 4 71 3
767009145: 6 60 270 878 5 92 1 85
532730: 8 28 40 726 55
915886: 23 5 88 9 8 1 540 7 30 9
4959536593: 900 4 7 9 56 5 503 311
6880853056: 802 90 857 55 1
2460: 4 84 3 6 15 3 929 9 64
5503098: 8 4 4 8 3 5 682 6 98 1 7 6
180174733: 4 845 221 551 82 241
294481305088: 467 3 4 9 4 77 5 78 7 7 1
347053408060646: 601 96 27 759 9 844 9
665024: 949 2 7 2 56 1 5
131: 2 5 44 9 2 64
521990966728: 832 256 64 3 6 98
67898: 5 943 1 7 7 842 9 531 2
889: 6 2 4 56 7
71772: 8 3 868 7 81 6
17514: 9 4 2 88 61 2 5 862 7
367895094465: 6 613 950 9 44 65
3170570: 539 5 9 223 65
14894896789: 25 2 5 8 3 6 9 7 67 89
48911612401: 9 8 448 8 1 248 8 5 35 6
6952188752: 6 630 88 61 209
252428430: 7 6 9 795 2 35 2 3 6 8 4
11938840: 746 4 7 4 3 9
976937: 88 9 6 888 49
326445181: 29 1 2 8 272 3 4 517 3 6
32749919: 5 320 18 9 38
36329555157: 46 8 478 1 4 4 58 403 7
9684500: 95 2 906 5 50 2 8 875
322: 3 2 2 3 18 7 5
46079: 6 6 9 957 122
6429514256: 9 310 26 91 4 974
113: 62 7 34 7
134322120: 793 18 3 58 10 8 711 4
27533452832: 9 77 254 143 2 9 323 8
16814501284: 4 9 932 1 9 4 5 4 7 2 862
2738: 5 38 12 88 9 1 9 1 347 4
1305480: 5 34 75 6 78 5 95 3 46
282564: 722 4 47 71 2 47
81453120: 4 449 3 9 46 56 68
1593416: 2 5 710 6 8 5 8 129 8
50649: 15 517 4 541 47 30
11050695: 6 5 253 7 34 662 33
1085990967: 46 9 5 262 968
144475: 6 2 142 938 9 14
15973276: 638 462 469 25 1
1356542888: 8 942 344 180 965
109483025: 3 3 1 4 52 316 6 2 838 2
513900276: 49 8 1 3 6 1 50 273
3165348547: 8 697 9 632 455 745
5109729: 5 5 1 41 8 7 2 523 3 3 4 9
1189621: 2 50 931 8 617 4
11273432: 125 4 662 6 4 1 33 66 5
927762: 301 28 822 806 56
662365725: 3 85 3 7 7 3 918 9 86
127902747: 292 678 15 646 558 3
207984: 28 821 30 2 57 999 4
87919206658: 4 9 964 71 5 3 940 335
648: 4 11 635
5632: 121 9 3 5 4 8 5 1 2 5 17 8
7705: 4 5 8 4 960 1 7 690 63 7
5832992: 79 83 9 166 49 33 4
16344915: 667 85 69 7 9 39 5
166741080: 4 6 7 99 203 3 3 4 295 2
31084626: 45 738 52 2 3 5 6
47747: 460 17 49
95234: 30 31 3 11 34
182679: 3 1 79 316 88 85 5 2 5 7
40414098: 7 968 7 6 6 4 4 85 849 2
155364491: 60 74 72 486 11
5112274: 58 8 11 8 274
62848: 87 9 5 4 556 4 4 8
772524538: 8 1 5 3 5 36 7 3 188 81 1
3457728: 7 43 605 7 4 522
3270848119: 7 149 5 128 7 5 5 2 4 9 7
6225: 889 7 2
5323: 1 7 19 30 6 6 427
3074: 78 6 4 1 2 34 17 949
109924066: 1 64 5 2 79 3 132 6 3 1 5
9650055: 429 4 531 97 3 58
236590: 71 4 830 17 8 800 42 3
15133272: 6 98 28 57 431
928253: 5 18 1 256 7
7130057: 3 14 8 7 13 51 22 935
11219943: 5 419 51 5 58 21
13820: 9 204 5 9 3 138 95 4
151192320: 80 46 6 9 499 3 82 64
140848: 14 7 63 83 2 1 1 2 6 15
18491123: 8 5 1 98 272 4 89 3 51 2
91810280: 7 4 6 3 3 92 6 8 22 152 5
187311: 3 230 1 6 9 9 45 5 48 63
1268: 5 78 254 794 58 76
180225: 4 27 50 89 25
624152: 4 45 7 495 1 451
80600: 793 1 1 6 6 20 5
204939633: 8 481 132 33 95 1 33
1575825674865: 6 9 6 5 2 849 497 3 355
242082: 5 40 30 39 40 522
117: 9 1 24 44 41
3145408: 4 1 36 7 294 98 34 8 7
3196953: 57 4 5 6 9 1 3 896 7 9 1 9
768528332: 48 712 3 5 52 824 9 2
38770467: 351 546 287 202 1
349973: 34 225 771 1 9
43669081384243: 65 43 9 868 692 5 6 4 6
12676542351: 3 5 3 722 4 7 4 661 86 8
2806598: 506 55 320 5 1
264681119: 8 785 2 375 3 117
37144119: 86 1 88 7 44 7 7 99 6 6
39888: 8 775 2 6 576 1 4
689410: 3 3 7 8 51 4 8 6 4 750 2 5
21380: 3 117 76 4 691 875 2
7309491: 412 45 7 5 394
62449845: 3 95 69 4 1 7 92 1 6 91 6
1352472254: 1 3 384 9 88 142 110
418: 9 9 28 3 91
2065783914: 171 56 91 83 911
457753106: 40 5 7 7 52 924 182
12569: 70 60 88 612 4 513
74809: 774 900 94 42 76 477
763899: 615 8 685 584 8 1 18
2624: 8 6 1 6 9 8 6 6 15 1 11 6
702: 5 4 4 615 74
14069: 8 7 7 5 1 3 440 3 6 8 725
164285712: 325 3 55 8 13 5 1 88 24
264000: 5 47 63 235 7 2 75
53501418: 724 3 99 65 9 845 9 27
20118372397: 890 587 3 397 97
4549: 4 450 99
2323795: 6 4 52 6 36 858
5343319828135: 763 331 4 5 2 401 3 6 7
224591487120: 3 73 28 78 6 4 129 910
6721059240: 75 42 666 63 27 798 4
882595: 8 1 3 9 255 5 7 70 8 1 2 3
6254258: 8 2 13 3 407 664 354 8
369570: 13 350 1 5 570
2982: 1 4 593 8 9
742976095: 12 2 2 95 64 95
2135952: 806 4 47 1 87 953 14
2156064: 5 7 8 4 2 87 5 4 8 398 8 2
752594090: 217 3 40 1 91 7 488 59
94212721: 1 921 887 186 280 1
145325442: 673 2 224 482 512 2
1910493: 87 291 266 19 82
24501: 3 4 2 1 9 9 9 1 822 23 1 5
207154508: 1 3 6 738 1 5 724 75 4 4
6492983573: 54 30 428 29 86 21
1057040512: 6 965 5 6 556 8 2 121
771987931: 3 8 1 67 900 9 661 82
3832157005: 47 4 7 47 29 7 7 7 5 29
55024: 17 75 1 74 98 38
182377: 93 27 22 72 1
12087284004: 3 1 7 3 6 9 4 3 8 3 542 43
303319: 936 9 1 6 5 2 1 1 6 7
66626612971: 2 6 1 9 72 2 215 3 8 8 2 9
72912: 4 5 9 10 62 21 2
10426: 58 6 18 9 58
15095866: 7 5 60 6 4 4 8 7 8 8 50
22924333853: 643 89 83 82 1 4 8 5 5 4
372804: 5 86 2 2 1 3 72 455 613
23238529: 8 6 7 416 73 569
46837020: 938 6 396 61 573
384207: 52 79 1 461 53 6 83
2796564: 8 1 955 3 1 6 482
21670776754: 5 5 3 8 4 88 786 40 8 4 9
31106600: 25 41 18 7 680
662646786: 39 548 5 477 609 13 9
340: 8 2 34
16379: 3 116 3 13 6 1 7 779 60
746113957: 39 344 8 474 9 4
166880: 748 37 6 76 748
32635: 4 6 76 1 31 5 1 8 8 1 986
82026000: 99 1 32 9 90 93 70
3854: 15 49 889 3 983 9 3
17476: 3 84 69 88 1
831: 2 45 7 734
345920372: 10 810 80 93 4
266623: 3 4 4 2 118 624
7428141054: 880 7 3 310 4 6 2 9 5 2 9
6941789360: 770 662 4 7 619 5 6 22
1510040: 55 448 38 79 34
1402057: 50 42 29 59 23
315249285854: 31 5 249 2 85 85 6 1
357243: 271 9 77 240
27816661: 7 693 47 2 12 9 473 4
4056941: 7 6 16 6 3 6 46 4 2 5 37 2
894700: 1 8 2 4 65 876 929 68 5
2814: 9 3 1 7 3
3112293: 342 91 91
24044: 20 678 567 19 7
40190693: 5 824 5 6 47 509 2 52 1
5464285: 379 5 22 8 1 458 613 3
622: 28 2 3 524 8
864249: 25 29 16 23 5 14
274989: 6 4 887 31 19
22689264: 2 22 5 3 8 9 427 8 24 3 2
7629534: 56 53 703 436 3 99
1078: 3 51 5 5 211 803
114379517929: 61 5 75 9 5 17 853 73
1223996137: 9 5 2 3 5 759 90 8 8 887
65046348: 85 9 20 26 6 9 7 5 1 3 6 6
70020279998: 2 3 39 40 7 3 88 550 74
2016058: 5 3 55 1 9 8 280 2 14 2 3
1616569254: 907 949 6 8 4 288 313
406561: 403 4 84 3 337
52254720: 7 4 3 63 2 9 3 360 2 6 9
21036: 460 520 39 32 8 2
1574840: 19 8 552 59 6 86 4 8
184521: 109 7 4 3 4 5 2 5 50 7 8 6
8854722472: 72 80 28 8 8 9 1 4 478
68882273: 68 87 59 63 70
4775847: 4 767 8 690 157
52496657718: 2 8 8 620 7 3 27 1 6 9 5 4
817771: 6 2 9 3 945 64 5 5
22905492: 64 4 15 7 6 7 989 42 6
2334360053: 87 548 859 57 63 2
1267283: 783 6 2 8 307 98 45
709598: 699 19 956 84 8
390091: 12 523 31 2 979
114774660767: 4 84 7 585 572 765
2644110: 5 3 61 1 20 29 4 6 45
23348253: 856 97 28 7 85 9 8 5 93
118217861586: 376 7 986 9 558 187 3
26067719: 13 9 69 461 17 9 621 2
11870: 38 333 369 8 9 2 2 3 5
62726410774: 9 12 5 4 640 118 8 9 9
594551549: 98 44 2 344 861 77 53
719: 523 44 147 5
300: 9 16 9 44
72039: 340 3 3 7 8
745344: 77 374 7 2 3 5 2 6 8 7 9 9
7132: 14 903 271 6 4
16643031388: 77 2 6 6 1 27 9 5 59 1 3 6
1198356: 1 946 79 4 307 19 4 44
4119222: 8 903 2 7 57
45831793: 9 870 67 521 984
18179: 8 315 3 45 49
27106570: 7 1 82 804 901 5 74
157060: 2 1 8 787 7 7 8 1 82 3 9 1
58905350: 5 9 5 99 352
30297338: 724 49 854 832 2
7686339: 30 3 3 6 775 4 56 1 7 6 3
139341664: 51 17 6 5 27 8 1 48 6 2 8
102792824398: 7 3 279 2 8 1 6 8 383 8 5
14544: 9 2 2 8 7 7 822 3 56 9
14940156: 9 4 3 4 4 58 518 57
6994: 671 25 7 26
1707: 7 8 8 9 16 9 79 9 86 23 5
280253937: 9 341 7 9 80 3
379710: 6 3 6 222 46 66 859 32
191395: 8 698 271 1 69
477365: 6 3 6 569 805
2668818: 32 845 2 6 5 4 7 2 9 5 6
9605504: 7 78 33 88 808
24035157: 94 16 7 98 287 6 1 3 9
45610: 1 621 11 4 5 9 1 1 2 7 7
5558: 5 8 4 5 83
23045282644: 35 13 820 33 4 1 2 5
3386: 2 8 815 4 86
78723586944: 53 191 60 8 4 2 6 4 37
443678580: 754 64 2 748 918
249177926: 2 3 8 2 64 574 7 7 96 2 3
244864368029: 850 378 44 315 762
976: 6 27 326 2
2103170: 1 7 26 489 5 1 5 3 404 7
160087: 5 45 3 6 117 4 19 8
8502265225: 280 97 668 453 637
8634750: 143 98 22 377 99 87
21939694: 31 9 832 63 7 94
3640: 36 68 5 7
1313: 28 6 237 706 258 78
43478: 45 7 137 59 264
9364: 83 72 510 7 2 3 44 7
32970: 4 5 772 7 76 27 37
1361104: 674 77 730 919 65
35138675: 232 42 28 7 1 50 715 5
103926: 9 3 60 38 1 8 64 2 12
19517830125: 1 8 8 8 9 753 8 5 9 1 25 5
80568734400: 6 1 6 1 914 530 9 55 8
23575581642: 442 94 634 895 2
1759896: 75 967 2 802 24
2623536: 4 3 1 2 4 8 72 5 23 5 36
108242429: 9 7 82 583 68 2 420 29
13545: 50 95 540 40 18 495
451879108: 5 1 9 4 87 98 4 92 29
4476: 2 3 895 4
1225104382: 8 7 907 8 9 3 5 3 67 136
864: 2 2 1 2 533 5 297 6 1 3 9
1133: 212 3 488 7 2
2738274: 2 73 7 69 3 41 99 443 1
7279023: 8 4 70 42 53
6394059: 8 844 7 946 45
4352288: 8 6 2 746 95 827 6 5 4 2
29742: 5 12 95 2 8 64 1 961
6275: 3 4 46 48 928
2985069: 7 2 8 8 57 6 218 8 96 2 5
1303: 58 5 643 75 297
714048078: 7 4 949 803 5 48 72 7
3141176276: 2 8 7 323 8 1 3 37 2 73
17828177432: 9 5 487 8 3 7 38 892 1 1
3710: 9 37 9 7 9 8 9 7 7 4 5 7
14199: 2 5 4 9 4 6 66 5 11 851 1
22220: 9 36 1 588 297 18 458
239868213254: 89 67 33 705 322 9 3 4
3426797: 892 33 31 74 1 116 41
269695020: 8 98 9 3 3 1 9 1 6 585 1 7
21133: 4 84 24 3 2 4 4
796: 187 588 21
443822608: 3 88 9 8 33 888 6 2 9 9 5
403917: 696 58 9 3 80 3 20 9 31
631: 1 68 461 95 7
185762282618: 18 57 622 81 922 696
210940464704: 7 220 6 37 722 96 617
117033: 7 1 2 5 26 35
19535124: 6 3 427 66 4 3 5 7 5 8 1 6
75471644: 5 25 6 4 71 644
394056230652: 34 206 8 4 7 8 8 40 7 4 9
249751668482: 5 6 9 9 970 4 97 1 8 2 1 7
5198: 480 41 3 9 58 283 141
2212: 15 38 5 76 593
14544348: 2 4 7 3 2 11 2 4 57 701 1
16408: 81 57 59 59 8 3 8
2152: 346 841 958 3 4
58702067: 36 60 25 5 9 59 3 6
5031450: 66 8 9 6 83 67 675
6126: 8 82 8 8 366
43804911024: 8 5 904 620 2 4 668 8 9
3424413730: 7 8 137 93 610
48087732: 4 804 4 773 1
150365908588: 719 679 154 288 2 12
20107906: 290 97 595 58 7
73124: 40 80 983 1 66 326
9521094784: 1 2 686 842 5 9 2 810 2
54076: 7 8 512 2 3 17 1 324
7326527: 7 725 61 43 387
169509763: 844 9 5 132 3 5 9 4 1 2
209001602: 531 8 984 5 2
15794: 57 651 9 22 20
4639793: 78 9 8 1 187 3 799
7869: 78 6 9
17332662: 884 92 9 3 18 93 71
2440915: 8 9 7 653 6
15733970915: 4 861 9 9 8 9 9 5 5 2 28 4
439241: 581 756 5
47370912526: 80 2 900 7 549 7 916 6
19118489: 91 5 2 42 92
2351: 94 7 877 2 293 96 5 1
70788678480: 635 5 909 1 338 60 6
9040966: 8 824 153 63 967
147719448: 3 7 6 4 65 6 7 9 4 1 86 3
11021197: 6 5 566 31 2 963 3 9 7
3246: 1 4 97 8 133 9
44294322: 76 92 181 7 5 4
6832: 9 3 717 9 76 5 55
19494129793: 57 475 1 6 3 6 5 2 7 6 6 4
9556815244: 23 89 4 806 9 244
110947298: 43 89 4 36 99 770 73
5451085837: 2 957 3 5 8 3 3 766 35 3
240063473: 2 41 777 2 641
453866: 3 6 226 5 372 26
446578583: 41 610 372 48 23
12195: 2 7 3 189 8
3890269: 9 658 2 4 11 82 4 517
2887: 8 8 2 2 45 7
8904: 957 3 47 49 3
11794: 4 2 5 880 354
480024: 36 5 3 1 43 54 841 452
1543132419: 57 8 2 1 3 79 68 7 8 1 1 2
8760042: 66 4 264 79 87 6
13212706657: 8 148 9 71 9 6 9 6 3 9 6 4
212364454: 80 4 71 21 7 5 8 9 886
3632196262: 7 9 38 31 5 1 19 6 265
230366245561: 8 4 7 597 8 40 879 1 4
18161109: 1 88 9 4 79 90 7
2675573: 74 3 36 7 73
490: 77 58 3 3 73
2213131: 787 38 74 1 86
31346028045: 9 7 58 52 1 42 50 2 5 5 9
91722168: 29 888 218 2 88 80
44722: 7 783 4 34 6 9 9 1 1
4331734176: 8 2 5 293 40 2 6 7 4 44 3
24898715: 2 69 7 652 1 5 3 4 6 6 5
27035414: 8 5 665 87 8 3 3 3 6 9 3 2
509667438647: 5 7 91 41 1 4 59 5 5 8 8 7
6234717: 2 81 7 1 6 4 2 9 446 83
99133342: 501 50 15 565 181 7
9054980: 11 53 356 6 978
245610701: 1 1 45 3 95 215 641 62
179: 1 66 84 1 27
4840002: 97 308 2 81 12 5 76
551096: 81 754 58 8 9 836
338184: 25 2 4 1 7 57 16 2 8 61
67836: 23 607 772 3 8 1 8 2 6 1
14597232792: 5 61 754 9 7 8 1 99 582
31904: 3 1 82 371
3612155: 70 82 5 711 55
4060: 7 57 7 1 63
23424: 1 146 16 6 4
1693015: 6 7 2 2 21 6 7 6 1 23 315
2467808: 3 7 405 2 51 1 7 2 2 8 23
29: 26 1 2
207: 1 2 53 129 3 7 12
4972800: 6 1 4 6 60 5 8 7 2 48 700
30142: 1 67 4 54 2 597 2
1545836: 686 839 482 5 77 61
2704: 5 1 4 1 38 25 6 265 38 4
1563986: 23 7 1 8 8 4 7 9 281 41
10664: 5 91 11 4 6 7
350: 81 94 2
403926878: 792 51 68 7 8
79596243344: 2 6 9 5 63 6 6 3 8 593 3 3
206280675: 384 44 41 80 16 67
18112461: 43 12 1 9 2 2 39
1456398204835: 676 96 847 254 35
1344633: 2 1 8 8 636
324327360: 6 69 4 9 4 1 2 2 51 952
440823601: 255 80 441 49 1
19299856: 2 7 71 2 344 684 668
1027242: 9 3 11 7 37 9 8 9 17 9
11695: 2 48 9 5 16 64 9 5
358775: 7 527 4 97 5 468 5 76
5959070362: 8 784 950 669 5 8 62
420608: 59 19 674 4 8
107592: 156 4 2 38 71 397 5
503260: 915 55 5 1 5
531488: 412 590 76 5 871 272
1510282641: 91 109 6 828 7 8 5 38 1
132072480: 5 5 2 466 9 8 35 8 8 41
17849: 13 8 222 52 8 891
3701387523: 8 3 7 7 1 474 1 5 8 6 4
835773: 806 85 7 67 2 2 2 7
1167510261: 421 69 8 574 70 1
12029: 1 4 2 2 4 7 8 24 4 52 589
171231: 4 3 849 2 31
19016113719: 49 46 586 9 729
14155834: 13 2 17 938 7 76 53 2
91018233: 8 7 5 3 61 9 24 74 2 7 1
126876: 866 6 6 543 4
39928: 77 4 4 6 121
9525173985: 9 58 26 7 994 8
83216359: 63 125 840 286 526
2073023101759: 94 90 49 64 65 589
294072: 3 774 7 9 44 6 5 3 86 8
273916: 96 30 2 32 94
73188: 19 1 5 8 52 3 2 2 6 4 6 6
12028: 7 3 4 4 2 7 7 65 297 291
1842707: 8 665 37 74 33
37510292: 676 9 51 1 70 6 727
9814168: 18 36 73 63 17 8
12172773: 209 719 9 2 9 801
51065063: 1 4 1 38 9 6 4 3 396 7 9 8
2334810924: 778 270 301 3 22
29246170796314: 265 8 9 4 9 8 4 479 3 14
1280: 9 7 4 8 8
45238: 36 3 411 310 31 3 506
42039: 8 5 7 300 7 7 1 27 1 2 1
142732987: 41 14 35 71 939 87
13812801009: 1 298 739 29 16 4 9 1
1463253621: 40 31 363 5 6 9 52
805935954: 4 7 2 34 90 1 5 6 22 93
469930488773: 370 31 794 516 7 73
3234662819: 326 992 74 2 818
866841940: 2 28 6 92 551 2 5 82 95
875: 4 71 3 6 791
197215: 19 7 21 3
12480: 101 7 53 77 439 2
2672527509618: 685 50 867 9 96 17
496665004: 8 4 90 9 650 5
376433664: 30 2 633 248 543
5000074660: 760 851 659 67 98
6485611: 6 5 3 2 73 2 670 88 6 5
32032: 318 5 9 5 4 1 51
2709: 18 3 36 3 762
446: 79 4 9 1 10 1 3 4 7 9 2 1
2194294: 55 4 5 6 4 6 4 8 2 945 2 2
17741345: 58 510 97 322 424 9
228539502: 7 177 69 6 39 9 2 2
1599924195: 58 75 1 326 1 12 1 95
5916685992: 471 35 3 9 8 89 2 4 24 7
94186: 107 1 828 5 1 88
49372620: 45 656 3 40 231 7
428120052: 83 292 89 2 88 50
10585951548: 7 665 97 7 3 5 8 5 3 2 58
9480000: 50 9 7 4 2 185 4 5 7 87 4
37505: 1 3 91 688 20 82
11236184: 6 5 1 8 7 9 942 6 2 7 8
501946945: 7 717 3 91 13 65 36 6 3
55557272682: 95 9 40 88 3 71 5 260 2
28150754534: 6 61 3 6 16 67 3 45 3 6
2115: 4 3 33 5 47
939871812: 5 383 873 2 1 2
93547075: 86 35 741 98 271 4 40
20581705224: 5 8 8 8 7 3 66 1 3 4 19 5
6405520: 914 32 7 747 7
3596788: 877 4 1 1 87 73 3 50 7
30316467826: 6 81 7 24 5 2 5 535 31 3
37138473: 789 9 5 2 65 12 9 6 87
33816: 1 58 566 927 18 43
682046097: 7 329 4 829 31 3
2870: 61 41 3 53 6 307
7666: 7 50 39 8 9 7 747
1513: 9 5 1 69 343 561 495
1693: 1 9 4 851 802
1386357039925: 65 81 7 9 40 3 5 57 7 2 5
223981525: 33 722 82 9 9
971: 545 63 8 70 204 81
227903141: 1 54 28 7 2 458 615 47
35245491: 1 294 88 52 919
2579624: 7 906 9 109 2 5 39 8 4 8
687164624: 6 278 7 6 7 66 771 5 5 8
16510690: 9 23 36 7 51 350 1 4 8
17926: 372 99 5 66 33 40
9312: 5 3 1 5 2 8 506 996 6
53640: 62 24 4 8 9
6812766: 6 6 6 8 4 4 7 6 3 1 60 933
103952546352: 2 8 5 8 1 50 3 7 4 46 350
4693680: 8 5 96 38 33 745 954
3580: 324 3 9 8 892
1047858874: 9 95 7 579 8 271 877
1965477888: 507 1 726 88 666 8
431607: 26 6 14 3 957
13483: 7 9 842 7 4
959774: 11 79 85 5 169 588 8 9
9743488: 90 63 8 26 66 40
345969792: 9 3 1 9 9 53 8 2 8 882 6 6
973866244: 2 9 485 5 648 606 3 1
129297226: 647 293 1 852 7 97 9
1804774500: 212 10 2 63 9 9 30 10 5
161032703165: 7 9 1 5 4 654 5 3 167
30144: 770 166 610 7 331 2 8
31064922: 394 7 90 32 860 2
69427692: 10 882 472 509 68 23
1925252674: 273 953 28 74 4
30704490: 1 8 1 344 2 9 2 4 7 9 5 82
4323034: 30 1 7 50 558 196 133
1339240: 7 38 531 1 19 7 8
70185781: 98 6 443 672 1 85
813143: 7 66 42 5 140
75181551269: 75 175 6 551 269
328827175: 35 786 1 1 8 39 5 76 75
163872: 8 76 5 1 5 46 14 8
271728535: 525 7 98 4 2 4 4 9 53 1 5
19218: 5 6 9 5 7 95 28
295849: 8 9 8 3 7 45 1 554 8 191
86507: 22 6 8 657 261 9 9 566
9851235: 22 41 6 979 4 470 4 3 5
343170: 900 337 6 17 187 45
21212104074: 87 368 14 666 8 5 74
77531035: 9 54 4 624 258 49 392
4309521380: 85 845 2 6 9 383
152158271: 4 86 933 57 79 6 5
96619723194: 1 80 514 3 1 7 3 4 3 1 9 4
9108: 8 212 1 41 58 6 3 4 7 3 7
438012: 2 92 776 58 6
40384643: 6 51 485 745 5 6 508 2
694515: 69 451 5
26001558: 93 638 76 6 5 358 5 3 3
474319676837: 51 93 19 67 6 838
4824867: 4 5 559 3 849
3270605: 6 33 48 8 43 301 9 919
667: 575 7 85
5094399750: 54 196 4 14 9 114 955
3697150: 27 59 268 9 9 5
2127212032: 67 2 253 890 2 4 772 2
1362164916000: 7 85 4 5 37 4 87 5 7 254
126079693536: 85 76 10 1 748 9 7 7 3 6
1011492: 3 2 938 3 39 9 99 1 704
12283: 7 72 50 89 2 735 65
1190324: 226 30 2 18 96 7 87 77
610743265427: 4 225 8 678 6 2 65 42 5
33140363: 53 4 5 22 62
321300: 6 15 897 70 5
345316608: 19 347 6 52 2 3 14 12 3
994824: 85 759 58 574 337 2
11621232044: 2 7 40 5 9 840 1 8 7 3 8 4
61469222: 6 6 8 1 92 5 1 4 345 7 15
20439757016: 48 15 8 742 4 8 54 4
501377: 5 58 188 7 831 2 6 8 5 9
26414262270: 931 52 7 4 5 19 66 87
601177: 2 6 729 191 645 37
845203: 653 579 22 674 7
260571: 28 23 62 1 23 4 2 7 1
685358911191: 85 669 863 899 8
43059238: 2 5 80 6 9 2 488 3 36 70
24993475: 33 212 94 99 38
46054008163449: 65 5 72 781 7 454 9 2 4
1023722083: 8 1 203 2 2 7 97 6 2 2 1 4
124097282: 129 2 536 8 6 2
3307281: 14 70 44 358 7 876 9 6
1433: 47 55 7 2 5
35005582: 9 74 482 726 6 5 7 731
2557424016: 133 72 401 6 111
120274: 3 4 81 1 154
128094: 2 2 250 501 840
30203531: 74 816 18 5 5 28
1879392072: 99 7 28 16 34 6 4 3 97
566236744293: 87 709 5 798 809
4538: 7 525 9 7 8 79 670 90
6372049: 20 4 59 45 48
39931652: 50 465 32 73 651
16274678000: 6 38 342 836 413 500
97: 87 4 8
378250: 7 549 7 9 50
2006: 916 77 5 5 2
8470: 45 6 7 328 14
17113832: 17 2 821 46 99
36356: 5 14 6 3 89 71 4
82063799: 40 3 7 4 967 1 5 360 7 3
730788: 7 19 2 8 8 9 5 287 945 2
1185372875: 264 449 3 9 873
597: 3 8 8 7 464
3258982: 3 77 6 512 74 569 45
939460: 13 4 916 823 535
5090480: 6 36 7 597 985 8
3145335120: 3 1 453 35 117
546970: 6 93 2 787 5
41812: 9 3 43 206 361 9 706 4
1983136733: 90 64 8 72 7 871 491 6
24415: 9 4 415 9 7 6 3 16
67189: 629 4 424 9 1
233813964381: 49 22 188 4 13 87 7 6
105452: 2 15 54 952 41
55918632: 31 976 3 308 6
107993: 2 9 8 34 721 79
19168239: 4 2 2 222 18 153 5 8 3 9
126871: 51 3 182 52 1 439
79828530338: 360 1 8 4 6 3 6 367 9 35
16949554: 9 5 11 2 59 59 7 4 5 6 3 2
431208231: 9 119 6 9 6 69 536 5 2 4
973: 9 13 58
226314575979: 6 1 6 332 5 9 4 1 9 6 4 99
181082506: 72 730 6 7 94 4 3 2 6 8 4
38531034: 6 759 9 276 36 933
22169826336: 676 800 33 732 56
6219757568: 9 5 709 15 8 8 88 34 6 8
3011796480: 7 488 352 80 96 463
2115750: 99 6 38 8 86 1 84 93
235864382940: 736 156 356 6 90
1208: 5 9 38 7 1 1 8 5 5 3 850 5
1401: 106 58 8 2 87
261398734: 3 66 547 409 9 76 7
13517241: 58 6 475 7 7 13 4 6 2 7
198887931: 5 8 86 137 6 52 47 4 95
66539630664: 8 2 69 1 49 1 155 1 4 4 6
3829574829: 4 7 871 96 42 4 5 2 8 4
210872: 800 65 86 3 5 998 6 2
491639555: 278 41 860 7 87 4 8 8
3000446345: 71 418 3 337 5 4 6
238535178: 5 118 5 53 4 322 7 4 80
8287018777773: 274 98 87 437 4 866 3
4853715092217: 970 1 7 43 50 92 210 8
10400: 6 3 577 10 7
334724384: 8 1 2 487 8 81 840 341
831: 5 77 6 5
1708025: 540 2 315 4 5 5 630
4368960: 4 324 6 740 3
709365600: 656 5 89 54 5 3 3
1269313926: 28 2 5 347 7 6 9 2 444 8
184904693: 7 55 75 8 4 18 505 2 96
75131585: 75 51 796 5 9 7 5 396 2
549981: 7 4 46 6 21 6 5 9 72 6 1 2
4619908866429: 87 598 888 66 425 3
81234530822: 5 321 1 8 9 1 91 5 7 545
21949216: 71 3 3 9 1 1 603 7 8 5 2 9
377: 347 28 1 1 1
3923705: 2 9 22 615 5
1775196500: 5 928 9 34 907 70 770
1513952: 987 9 1 8 5 38 6 9 3 9 1 4
60084313170: 862 99 9 8 238 2 46 88
64254966056: 3 96 2 32 52 23 9 301 9
1079: 5 2 987 81
1057055: 6 12 66 42 6 54 7 815
538588: 8 972 3 7 35 6
39669: 8 6 8 53 47 5 797 97
2200: 22 29 4 5 8
3350421518: 84 5 44 4 1 428 9 5 12 6
728426: 4 9 7 4 8 181 608 644 6
9638460488609: 1 3 38 675 9 8 4 8 860 8
33605379642: 49 712 1 676 45
188328: 3 1 5 5 26 521 332 7 7
99011: 150 65 4 7 634 867
194175906: 49 7 55 402 7 8 8 90 5 1
48556303: 75 40 9 95 49 9

46
2024/day-7/solution-1.awk Normal file
View File

@ -0,0 +1,46 @@
#!/usr/bin/env awk
BEGIN {
FS = "[: ]"
total = 0
}
{
sum = $1
num_opers = 2
num_of_nums = NF - 2
num_of_results = 1
# Create list of numbers
# Create list of results
for (i = 3; i <= NF; i++) {
nums[i-2] = $i
}
results[1] = nums[1]
# Starting applying additions to results
# Starting from second number
for (i = 2; i <= num_of_nums; i++) {
number = nums[i]
for (j = 1; j <= num_of_results; j++) {
element = results[j]
results[j+num_of_results] = element * number
results[j] = results[j] + number
}
num_of_results *= num_opers
}
expected = ( num_of_nums - 1 ) * num_opers
# Check results
for (i=1; i <= num_of_results; i++) {
if ( results[i] == $1 ) {
start_val = i % num_of_nums
stack_num = (i - start_val) / num_of_nums
total = total + $1
break
}
}
delete results
delete nums
}
END {
print total
}

53
2024/day-7/solution-2.awk Normal file
View File

@ -0,0 +1,53 @@
#!/usr/bin/env awk
# Just pre-compute all possible results
# and check against the sum
BEGIN {
FS = "[: ]"
total = 0
}
{
sum = $1
num_opers = 3 # +, *, ||
num_of_nums = NF - 2
num_of_results = 1
# Create list of numbers
for (i = 3; i <= NF; i++) {
nums[i-2] = $i
}
results[1] = nums[1]
# Starting applying operator
# Starting from second number
# index range of num_of_results is for each operator
# 1 - num_of_results - addition
# num_of_results+1 - num_of_results*2 - multiplication
# num_of_results*2+1 - num_of_results*3 - concat
for (i = 2; i <= num_of_nums; i++) {
number = nums[i]
for (j = 1; j <= num_of_results; j++) {
element = results[j]
results[j] = results[j] + number # Add
results[j+num_of_results] = element * number # Mul
results[j+num_of_results*2] = (element "" number) + 0 # Concat
}
num_of_results *= num_opers
}
expected = ( num_of_nums - 1 ) * num_opers
# Check results
for (i=1; i <= num_of_results; i++) {
if ( results[i] == $1 ) {
start_val = i % num_of_nums
stack_num = (i - start_val) / num_of_nums
total = total + $1
break
}
}
delete results
delete nums
}
END {
print total
}

50
2024/day-8/input Normal file
View File

@ -0,0 +1,50 @@
..........K........................A..............
.K................................A...............
......................................D.....A.....
....................................6............D
..................................................
.............................d....................
.........4.e.......................DT.B...........
....................d.....D......A...........B....
.............K....................................
...........................k......................
...w..............4.....................y.........
........w.........................................
..............g..k..............d..........y......
.....w.....Q..............................T.......
...............b..........k................6......
.................................W...T............
................w..............BW..T..............
............g....4e.....................W.........
.......1.................g.......................W
........k..........................6.....0........
.................a................................
....................4.a........3.g..............7.
.............m........................I.0.........
..............K7..............V...................
....Q................................I............
..9........b......................I...............
...................d..............................
.......e..........................................
....e...........t..E................3.............
......1..aQ........t....v.....3..........I..0.....
...........................v.t.....3.7............
..........i.......m........M......................
...Q..29..a...................m...................
...9......q..........mt...........................
....1...............Y.....M.........7.............
..........b..1...E.v..Y...........................
................v..........q...............0......
..................E.................5.............
9...i..2b................................8........
.....q..2............Y..M.........................
............q...............................V.....
...i.................................V............
.i..............E............M....................
.........................................G........
............8................Y....................
.........2................8..............5........
......................................5....V......
............................................G.....
.....................................5...........G
.................................8................

63
2024/day-8/solution-1.sh Normal file
View File

@ -0,0 +1,63 @@
#!/usr/bin/env bash
FILE=input
LEN=$( head -1 "$FILE" | sed -E 's/(.)/\1\ /g' | awk '{printf NF}' )
read -r -a MAP_ARRAY <<< "$( < "$FILE" sed -E 's/(.)/\1\ /g' | paste -s -d ' ' )"
read -r -a SHADOW_ARRAY <<< "$( < "$FILE" sed -E 's/(.)/\1\ /g' | paste -s -d ' ' )"
#printf "MAP_LEN: %s, NF: %s\n" "${#MAP_ARRAY[@]}" "$LEN" >&2
for CHAR in $( < "$FILE" grep -Eo '[^\.]' | sort -u | paste -s -d' ' )
do
# Get indices for antennae
LINE="$(
for (( i=0; i<${#MAP_ARRAY[@]}; i++ ))
do
if [[ ${MAP_ARRAY[i]} == "$CHAR" ]]
then
printf "%s " "$i"
fi
done
)"
#printf "%s\n" "$LINE" >&2
read -r -a IDX_ARRAY <<< "$LINE"
#printf "idx: %s " "${IDX_ARRAY[@]}" >&2
#printf "\n" >&2
# Get all combinations
for (( i=0; i<${#IDX_ARRAY[@]}-1; i++ ))
do
A=${IDX_ARRAY[i]}
for (( j=i+1; j<${#IDX_ARRAY[@]}; j++ ))
do
B=${IDX_ARRAY[j]}
DIFF=$(( B - A ))
VDIFF=$(( (B / LEN) - (A / LEN) ))
HEAD=$(( A - DIFF ))
TAIL=$(( B + DIFF ))
HEADVDIFF=$(( (A / LEN) - (HEAD / LEN) ))
TAILVDIFF=$(( (TAIL / LEN) - (B / LEN) ))
printf "char: %s, A: %s, B: %s, DIFF: %s, VDIFF: %s, HEAD: %s, HEADVDIFF: %s, TAIL: %s, TAILVDIFF: %s\n" "$CHAR" "$A" "$B" "$DIFF" "$VDIFF" "$HEAD" "$HEADVDIFF" "$TAIL" "$TAILVDIFF" >&2
# Check if out of bounds
if [[ $HEAD -lt ${#MAP_ARRAY[@]} ]] && \
[[ $HEAD -ge 0 ]] && \
[[ $HEADVDIFF -eq $VDIFF ]]
then
SHADOW_ARRAY[HEAD]=X # Mark on shadow map
echo $VALUE >> values
fi
if [[ $TAIL -lt ${#MAP_ARRAY[@]} ]] && \
[[ $TAIL -ge 0 ]] && \
[[ $TAILVDIFF -eq $VDIFF ]]
then
SHADOW_ARRAY[TAIL]=X # Mark on shadow map
echo $VALUE >> values
fi
done
done
unset IDX_ARRAY
done
printf "%s" "${SHADOW_ARRAY[@]}" | fold -w "$LEN" | sed -E 's/(.)/\1\ /g'
printf "\n"
printf "%s" "${SHADOW_ARRAY[@]}" | grep -o 'X' | wc -l

82
2024/day-8/solution-2.sh Normal file
View File

@ -0,0 +1,82 @@
#!/usr/bin/env bash
FILE=input
LEN=$( head -1 "$FILE" | sed -E 's/(.)/\1\ /g' | awk '{printf NF}' )
read -r -a MAP_ARRAY <<< "$( < "$FILE" sed -E 's/(.)/\1\ /g' | paste -s -d ' ' )"
read -r -a SHADOW_ARRAY <<< "$( < "$FILE" sed -E 's/(.)/\1\ /g' | paste -s -d ' ' )"
#printf "MAP_LEN: %s, NF: %s\n" "${#MAP_ARRAY[@]}" "$LEN" >&2
for CHAR in $( < "$FILE" grep -Eo '[^\.]' | sort -u | paste -s -d' ' )
do
# Get indices for antennae
LINE="$(
for (( i=0; i<${#MAP_ARRAY[@]}; i++ ))
do
if [[ ${MAP_ARRAY[i]} == "$CHAR" ]]
then
printf "%s " "$i"
fi
done
)"
#printf "%s\n" "$LINE" >&2
read -r -a IDX_ARRAY <<< "$LINE"
#printf "idx: %s " "${IDX_ARRAY[@]}" >&2
#printf "\n" >&2
# Get all combinations
for (( i=0; i<${#IDX_ARRAY[@]}-1; i++ ))
do
A=${IDX_ARRAY[i]}
SHADOW_ARRAY[A]=X
for (( j=i+1; j<${#IDX_ARRAY[@]}; j++ ))
do
B=${IDX_ARRAY[j]}
SHADOW_ARRAY[B]=X
DIFF=$(( B - A ))
VDIFF=$(( (B / LEN) - (A / LEN) ))
# Assign heads
HEADC=1
while true
do
HEAD=$(( A - DIFF * HEADC ))
if [[ ${SHADOW_ARRAY[HEAD]} == "X" ]]; then (( HEADC++ )); continue ; fi
HEADVDIFF=$(( (A / LEN) - (HEAD / LEN) ))
# Check if out of bounds
if [[ $HEAD -lt ${#MAP_ARRAY[@]} ]] && \
[[ $HEAD -ge 0 ]] && \
[[ $HEADVDIFF -eq $(( VDIFF * HEADC )) ]]
then
SHADOW_ARRAY[HEAD]=X # Mark on shadow map
(( HEADC++ ))
else
break
fi
done
# Assign tails
TAILC=1
while true
do
TAIL=$(( B + DIFF * TAILC ))
if [[ ${SHADOW_ARRAY[TAIL]} == "X" ]]; then (( TAILC++ )); continue ; fi
TAILVDIFF=$(( (TAIL / LEN) - (B / LEN) ))
# Check if out of bounds
if [[ $TAIL -lt ${#MAP_ARRAY[@]} ]] && \
[[ $TAIL -ge 0 ]] && \
[[ $TAILVDIFF -eq $(( VDIFF * TAILC )) ]]
then
SHADOW_ARRAY[TAIL]=X # Mark on shadow map
(( TAILC++ ))
else
break
fi
done
#printf "char: %s, A: %s, B: %s, DIFF: %s, VDIFF: %s, HEAD: %s, HEADVDIFF: %s, TAIL: %s, TAILVDIFF: %s\n" "$CHAR" "$A" "$B" "$DIFF" "$VDIFF" "$HEAD" "$HEADVDIFF" "$TAIL" "$TAILVDIFF" >&2
done
done
unset IDX_ARRAY
done
#printf "%s" "${SHADOW_ARRAY[@]}" | fold -w "$LEN" | sed -E 's/(.)/\1\ /g'
#printf "\n"
printf "%s" "${SHADOW_ARRAY[@]}" | grep -o 'X' | wc -l

12
2024/day-8/test-input Normal file
View File

@ -0,0 +1,12 @@
............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............

1
2024/day-9/input Normal file

File diff suppressed because one or more lines are too long

58
2024/day-9/solution-1.sh Normal file
View File

@ -0,0 +1,58 @@
#!/usr/bin/env bash
FILE=input
# Sparse sequence
read -r -a SPARSE_ARRAY <<< "$(
INDEX=0
FILE_ID=0
while read -r CHAR
do
if [[ $(( INDEX % 2 )) -eq 0 ]]
then
for (( i=1; i<=$CHAR; i++ )) do printf "%s " "$FILE_ID"
done
(( FILE_ID++ ))
else
for (( i=1; i<=$CHAR; i++ ))
do
printf ". "
done
fi
(( INDEX++ ))
done <<< "$( sed -E 's/(.)/\1\n/g' "$FILE" | grep -v '^$' )"
)"
#printf "%s" "${SPARSE_ARRAY[@]}"
#printf "\n"
printf "Sparse array len: %s\n" "${#SPARSE_ARRAY[@]}"
# Reverse feed
read -r -a FEED_ARRAY <<< "$(
for (( i=0; i<${#SPARSE_ARRAY[@]}; i++ ))
do
if [[ ${SPARSE_ARRAY[i]} != "." ]]
then
printf "%s " "${SPARSE_ARRAY[i]}"
fi
done
)"
#printf "%s" "${FEED_ARRAY[@]}"
#printf "\n"
printf "Reverse feed len : %s\n" "${#FEED_ARRAY[@]}"
# Generate checksum for sparse array
CHECKSUM=0
i=0
j=$(( ${#FEED_ARRAY[@]} - 1 ))
for (( k=0; k<${#SPARSE_ARRAY[@]}; k++ ))
do
if [[ $i -gt $j ]]; then break ; fi
if [[ ${SPARSE_ARRAY[k]} == '.' ]]
then
(( CHECKSUM += k * FEED_ARRAY[j] ))
(( j-- ))
else
(( CHECKSUM += k * FEED_ARRAY[i] ))
(( i++ ))
fi
done
printf "%s" "$CHECKSUM"

119
2024/day-9/solution-2.sh Normal file
View File

@ -0,0 +1,119 @@
#!/usr/bin/env bash
FILE=$1
# Sparse sequence
read -r -a SPARSE_ARRAY <<< "$(
INDEX=0
FILE_ID=0
while read -r CHAR
do
if [[ $(( INDEX % 2 )) -eq 0 ]]
then
for (( i=1; i<=CHAR; i++ ))
do
printf "%s " "$FILE_ID"
done
(( FILE_ID++ ))
else
for (( i=1; i<=CHAR; i++ ))
do
printf "%s " '-1'
done
fi
(( INDEX++ ))
done <<< "$( sed -E 's/(.)/\1\n/g' "$FILE" | grep -v '^$' )"
)"
#printf "%s" "${SPARSE_ARRAY[@]}" | fold -w 100
#printf "\n"
printf "Sparse array len: %s\n" "${#SPARSE_ARRAY[@]}"
SHADOW_ARRAY=( "${SPARSE_ARRAY[@]}" )
# Start by working backwards
j=$(( ${#SPARSE_ARRAY[@]} - 1 )) # Moveable index since file blocks jump
k=0 # SHADOW_ARRAY cursor
LAST_SKIP=9999
while [[ $j -ge 0 ]]
do
# Find a file
if [[ ${SPARSE_ARRAY[j]} -eq -1 ]]
then
# Not a file
(( j-- ))
continue
fi
# Get file size
# j moved to index before file head
FILE_SIZE=0
ID=${SPARSE_ARRAY[j]}
while [[ ${SPARSE_ARRAY[j]} == "$ID" ]]
do
(( FILE_SIZE++ ))
(( j-- ))
done
#printf "File ID: %s, File size: %s\n" "$ID" "$FILE_SIZE" 2>&1
# Since search space is constantly decreasing
# Contiguous space can only keep getting smaller
if [[ $FILE_SIZE -ge $LAST_SKIP ]]
then
printf "File %s size %s skipped. Last skip: %s\n" "$ID" "$FILE_SIZE" "$LAST_SKIP"
continue
fi
# Search for available contiguous space
# Search from start until the file itself
k=0
while [[ $k -le $j ]] && [[ $k -le ${#SHADOW_ARRAY[@]} ]]
do
CONT_SPACE=0
# Skip ahead until first match of space
while [[ ${SHADOW_ARRAY[k]} -ne -1 ]] && [[ $k -le ${#SHADOW_ARRAY[@]} ]]
do
(( k++ ))
done
# Space found, now get contiguous length
while [[ ${SHADOW_ARRAY[k]} -eq -1 ]] && [[ $k -le ${#SHADOW_ARRAY[@]} ]]
do
(( CONT_SPACE++ ))
(( k++ ))
done
# Space length is ok, can proceed
if [[ $FILE_SIZE -le $CONT_SPACE ]] ;then break; fi
done
# Space length ok, can proceed
if [[ $FILE_SIZE -le $CONT_SPACE ]]
then
# Move cursor to head of contiguous space
(( k-= CONT_SPACE ))
while [[ $FILE_SIZE -gt 0 ]] && \
[[ ${SHADOW_ARRAY[k]} -eq -1 ]] && \
[[ ${SHADOW_ARRAY[j+FILE_SIZE]} -ne -1 ]]
do
# Perform copy
SHADOW_ARRAY[k]=$ID
SHADOW_ARRAY[j+FILE_SIZE]=-1
(( k++ ))
(( FILE_SIZE-- ))
done
else
LAST_SKIP=$FILE_SIZE
printf "File %s skipped. File size: %s\n" "$ID" "$FILE_SIZE"
continue
fi
done
#printf "%s " "${SHADOW_ARRAY[@]}" | fold -w 100 | tee final-result | cat
printf "%s " "${SHADOW_ARRAY[@]}" > final-result
#printf "\n"
# Generate checksum for shadow array
CHECKSUM=0
for (( i=0; i<${#SHADOW_ARRAY[@]}; i++ ))
do
if [[ ${SHADOW_ARRAY[i]} -ne -1 ]] ;then (( CHECKSUM += i * SHADOW_ARRAY[i] )); fi
done
printf "%s\n" "$CHECKSUM"

1
2024/day-9/test-input Normal file
View File

@ -0,0 +1 @@
2333133121414131402