Compare commits

...

41 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
53 changed files with 5138 additions and 10 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

@ -19,7 +19,7 @@ do
fi fi
done done
)" )"
printf "%s\n" "$LINE" >&2 #printf "%s\n" "$LINE" >&2
read -r -a IDX_ARRAY <<< "$LINE" read -r -a IDX_ARRAY <<< "$LINE"
#printf "idx: %s " "${IDX_ARRAY[@]}" >&2 #printf "idx: %s " "${IDX_ARRAY[@]}" >&2
#printf "\n" >&2 #printf "\n" >&2
@ -32,17 +32,27 @@ do
do do
B=${IDX_ARRAY[j]} B=${IDX_ARRAY[j]}
DIFF=$(( B - A )) DIFF=$(( B - A ))
VDIFF=$(( (B / LEN) - (A / LEN) ))
HEAD=$(( A - DIFF )) HEAD=$(( A - DIFF ))
TAIL=$(( B + DIFF )) TAIL=$(( B + DIFF ))
printf "char: %s, i: %s, j: %s, DIFF: %s, HEAD: %s, TAIL: %s\n" "$CHAR" "$A" "$B" "$DIFF" "$HEAD" "$TAIL" >&2 HEADVDIFF=$(( (A / LEN) - (HEAD / LEN) ))
for VALUE in $HEAD $TAIL TAILVDIFF=$(( (TAIL / LEN) - (B / LEN) ))
do 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
if [[ $VALUE -gt ${#MAP_ARRAY[@]} ]] || [[ $VALUE -lt 0 ]] # Check if out of bounds
if [[ $HEAD -lt ${#MAP_ARRAY[@]} ]] && \
[[ $HEAD -ge 0 ]] && \
[[ $HEADVDIFF -eq $VDIFF ]]
then then
continue 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 fi
SHADOW_ARRAY[VALUE]=X # Mark on shadow map
done
done done
done done
unset IDX_ARRAY unset IDX_ARRAY

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

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