Compare commits
39 Commits
ec2c4a97c9
...
main
Author | SHA1 | Date | |
---|---|---|---|
0134815002 | |||
fd78069221 | |||
ce0033c6f5 | |||
0d518e1691 | |||
de2fd03c3c | |||
e02ee993c6 | |||
ac940aad0e | |||
f17b7f75d2 | |||
f6e91fa1fa | |||
37667c0990 | |||
415f757054 | |||
615f9ec252 | |||
23076697cf | |||
9492a8ae9a | |||
004d5a7bd3 | |||
fd10d06b88 | |||
937635d773 | |||
beac193288 | |||
3764b25f6d | |||
b33653672c | |||
fc7e08ef0e | |||
0f95c6367e | |||
58f828fef3 | |||
f948a2da13 | |||
792d86423f | |||
9e60df1c2e | |||
6e636d4c34 | |||
39e8e8735b | |||
d2d4bf7a64 | |||
d9a1e9fce3 | |||
a4fa64624a | |||
29a4e45e63 | |||
e0d3bcfe9e | |||
eff5810fe3 | |||
3bf816b20f | |||
c7c4a05cb0 | |||
ad1778c8f0 | |||
b4b2a6e794 | |||
da0db2fde1 |
54
2024/day-10/input
Normal file
54
2024/day-10/input
Normal 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
151
2024/day-10/solution-1.sh
Normal 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
144
2024/day-10/solution-2.sh
Normal 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
8
2024/day-10/test-input-1
Normal file
@ -0,0 +1,8 @@
|
||||
89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732
|
1
2024/day-10/test-result-1
Normal file
1
2024/day-10/test-result-1
Normal file
@ -0,0 +1 @@
|
||||
36
|
1
2024/day-11/input
Normal file
1
2024/day-11/input
Normal file
@ -0,0 +1 @@
|
||||
2 54 992917 5270417 2514 28561 0 990
|
66
2024/day-11/solution-1.sh
Normal file
66
2024/day-11/solution-1.sh
Normal 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
106
2024/day-11/solution-2-2.sh
Normal 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
107
2024/day-11/solution-2.sh
Normal 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
1
2024/day-11/test-input-1
Normal file
@ -0,0 +1 @@
|
||||
0 1 10 99 999
|
1
2024/day-11/test-input-2
Normal file
1
2024/day-11/test-input-2
Normal file
@ -0,0 +1 @@
|
||||
125 17
|
140
2024/day-12/input
Normal file
140
2024/day-12/input
Normal 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
128
2024/day-12/solution-1.sh
Normal 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
112
2024/day-12/solution-2.sh
Normal 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
4
2024/day-12/test-input-1
Normal file
@ -0,0 +1,4 @@
|
||||
AAAA
|
||||
BBCD
|
||||
BBCC
|
||||
EEEC
|
5
2024/day-12/test-input-2
Normal file
5
2024/day-12/test-input-2
Normal file
@ -0,0 +1,5 @@
|
||||
OOOOO
|
||||
OXOXO
|
||||
OOOOO
|
||||
OXOXO
|
||||
OOOOO
|
10
2024/day-12/test-input-3
Normal file
10
2024/day-12/test-input-3
Normal file
@ -0,0 +1,10 @@
|
||||
RRRRIICCFF
|
||||
RRRRIICCCF
|
||||
VVRRRCCFFF
|
||||
VVRCCCJFFF
|
||||
VVVVCJJCFE
|
||||
VVIVCCJJEE
|
||||
VVIIICJJEE
|
||||
MIIIIIJJEE
|
||||
MIIISIJEEE
|
||||
MMMISSJEEE
|
1
2024/day-12/test-result-1
Normal file
1
2024/day-12/test-result-1
Normal file
@ -0,0 +1 @@
|
||||
140
|
1
2024/day-12/test-result-2
Normal file
1
2024/day-12/test-result-2
Normal file
@ -0,0 +1 @@
|
||||
772
|
1
2024/day-12/test-result-3
Normal file
1
2024/day-12/test-result-3
Normal file
@ -0,0 +1 @@
|
||||
1930
|
1279
2024/day-13/input
Normal file
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
45
2024/day-13/solution-1.sh
Normal 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
63
2024/day-13/solution-2.sh
Normal 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
15
2024/day-13/test-input-1
Normal 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
500
2024/day-14/input
Normal 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
113
2024/day-14/solution-1.sh
Normal 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
87
2024/day-14/solution-2.sh
Normal 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
50
2024/day-15/input-map
Normal 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#
|
||||
##################################################
|
20
2024/day-15/input-movements
Normal file
20
2024/day-15/input-movements
Normal 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
135
2024/day-15/solution-1.sh
Normal 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
250
2024/day-15/solution-2.sh
Normal 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"
|
10
2024/day-15/test-input-map
Normal file
10
2024/day-15/test-input-map
Normal file
@ -0,0 +1,10 @@
|
||||
##########
|
||||
#..O..O.O#
|
||||
#......O.#
|
||||
#.OO..O.O#
|
||||
#..O@..O.#
|
||||
#O#..O...#
|
||||
#O..O..O.#
|
||||
#.OO.O.OO#
|
||||
#....O...#
|
||||
##########
|
10
2024/day-15/test-input-movements
Normal file
10
2024/day-15/test-input-movements
Normal 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
141
2024/day-16/input
Normal file
@ -0,0 +1,141 @@
|
||||
#############################################################################################################################################
|
||||
#.....#.........#.......#.....................#.....#...#.........#.#.....#.......#.........#.........#.......#...#.........#...#.....#...#E#
|
||||
#.#.#.#.#####.###.#.#####.###.#.#.#.#.#######.#.###.#.#.###.#.###.#.#.#.###.###.#.###.#.###.#.#######.###.###.#.#.#.#.#####.#.#.#.#.#.#.#.#.#
|
||||
#.#.#.#.....#...#.#.#.......#.#.#.#.#.#.....#...#.#...#...#.................#...#.....#.#...#.#.....#...#...#.#.#...#.#.....#.#...#.#...#...#
|
||||
#.#.#######.###.#.#.#.#######.#.#.#.#.#.###.#.###.#######.###.#.#.###########.#######.#.#.###.#.#######.###.#.#######.#.#####.#####.#######.#
|
||||
#.#.#.....#...#...#.......#...#...#...#...#.......#.....#.....#.#.....#.......#.......#.#.#...#.......#.....#.#.......#...#.#.#...#.....#...#
|
||||
###.#.#.#####.#############.###############.#.###.#.###.#######.###.#.#.###########.###.#.###.#####.#########.#.#########.#.#.#.#.#.###.#.#.#
|
||||
#...#.#...........................#...#...#...................#.....#.#...........#.....#.#...#.....#.......#...#.....#...#...#.#.#...#...#.#
|
||||
#.#.#.###.#.#.#.#####.#.#####.###.#.#.#.#.#.#.#####.#####.#.#.#.###.#.#########.#.#.#####.#.###.#####.#.#########.#####.#######.#.#########.#
|
||||
#...................#.#.#...#.#...#.#...#...#.....#.....#.#.#...#.#...#.......#.#.#.....#...#...#...#.#.....................................#
|
||||
#.###.#.#.###.###.#.#.###.#.#.#.###.###.#####.###.#.###.###.###.#.#####.#####.###.#.###.#####.###.#.#.###############.#######.#.###########.#
|
||||
#.#...#.#.....#...#...#...#...#...#.......................#.......#.....#...#...............#.....#...#.....#.....#.#.................#.....#
|
||||
#.#.#.#.###.###.#####.#.#########.#.#.###.###.#.#.#######.#####.#.#####.###.#.#.#.###.#####.#.###########.#.###.#.#.#######.#.#.#.#####.###.#
|
||||
#...#.#.......#.....#.#.#.....#...#.#.....#.....#...........#...#.......#...#.#.#.#...#.......#.....#...#.#.....#.......#...#...#.....#.....#
|
||||
#.###.#.#.#.#.#####.###.###.###.#####.#####.#.#############.#.#.#########.###.#.###.###.#####.#.###.#.#.#.#####.#########.#######.###.#####.#
|
||||
#.#.....#.#...#...#...#...#.#...#...#.....#.........#.......#.....#...#.....#.#.....#...#.....#...#...#...#.#...#.........#.........#.#.....#
|
||||
#.#.#.###.#.###.#.###.###.#.#.#.#.#.#####.#########.#.#######.###.#.#.###.#.#.#.#####.###.#######.#########.#.###.#########.#########.#.###.#
|
||||
#.#.......#.....#.#.....#.....#.#.#.#.........#.....#.........#.#...#...#.#.#.#...#...#...#.......#.......#.....#.........#.#...#.....#.....#
|
||||
#.#.#.#####.#######.###.###.#.#.#.#.###.#######.###############.#######.###.#.#####.###.###.###.###.###.#.#.#############.#.###.#.###.#.###.#
|
||||
#.#.#.......#.......#.#.#.#.#.#.#.#...#.#.......#...............#.....#.....#.#.....#...#...#...#.....#.#.#.#...........#.#...........#...#.#
|
||||
#.#.#.#####.#.#######.#.#.#.#.###.###.###.#######.#######.#.#####.###.#.#####.#.#####.###.###.###.###.#.###.#.#########.#.###.#.#.#.###.#.#.#
|
||||
#...#.#.....#.....#.......#.#.......#.#...#.......#.......#.#.......#...#.....#...#...#...#...#.#...#.#...#.#.....#.#...#.#...#.............#
|
||||
###.#.#.###.#####.#.#######.#########.#.#.#.#######.###.#.###.###########.#######.#.#######.###.###.#.###.#.#####.#.#.###.#.###.#.#.#.#.#####
|
||||
#.............#...#.#.......#...#.#...#...#...#...#.#.#.#.....#.#.........#...#...#.#.....#.#.......#...#...#.....#.#.....#.#...#.#...#.#...#
|
||||
###.#.#.###.#.#.#.#.#.#######.#.#.#.#####.#####.#.#.#.#.###.###.#.#########.#.#.#.#.#.###.#.#.#########.#####.#####.#.###.#.#.#.#.#####.#.#.#
|
||||
#...#.....#.#.#.#...#.......#.....#.....#.......#.....#...#.....#.#.........#...#.#...#.#...#...#.............#.....#.#...#.#.#.#.......#.#.#
|
||||
#.#.#.###.#.#.#.###########.#.#.#.#####.#.###########.###.#####.#.###.#.#########.#####.#######.#.#######.#.#######.#.#.#.#.#.###.#####.#.#.#
|
||||
#.#.#...#.#...#.#...#...#...#.#...#.....#.#.....#...#...#...#...#.#...#.#...........#.......#.....#.....#.#...#...#.#.#.#...#.............#.#
|
||||
#.#.#.#.#.#####.#.#.#.#.#.###.#####.#####.#.###.#.#.#######.#####.#.###.#.#######.#.#.###.###.#####.###.#####.#.#.#.#.#.#.#####.###########.#
|
||||
#.#.#.#.#.......#.#...#...#.....#...#.#...#.#.#...#.......#.#.....#...#.#.#.#.....#...#.#.#.....#...#.#...#...#.#...#...#.......#.........#.#
|
||||
#.#.###.#######.#.###.#########.#.###.#.###.#.###########.#.#.#######.#.#.#.#.#####.###.#.#.#####.###.###.#.###.#######.#.#######.#########.#
|
||||
#.#.....#.......#...#...........#.#...#...#.#...#.......#.#.#...#...........#.#.......#...#.#.#...#.#...#...#.#...........#.........#.......#
|
||||
#.#.###############.#.#########.#.###.###.#.#.###.#.#####.#.###.#.#.#######.#.###.#.###.###.#.#.###.#.#.#####.#.###########.#######.#.#######
|
||||
#...#.............#...#.....#...#...#.#...#.#.....#.....#.#.#...#.#.......#.#...#.#...#.#.#.....#.....#.........#.....#...#.#.....#.#...#...#
|
||||
###.#.#########.#.#####.#.###.#####.#.#.###.###.#######.#.#.#.###.###.###.###.#.#####.#.#.###.#.#.#######.#######.###.#.#.#.#####.#.###.#.#.#
|
||||
#...#.#.....#...#...#...#.#...#.#...#...#.#...#.#.....#.....#.....#...#.#...#.#.#.....#...#.#.#.#.#.....#.#.....#...#...#...#...#.#...#...#.#
|
||||
#.#.#.#.#####.#####.#.#####.###.#.###.###.###.###.###.#############.###.###.###.#.#######.#.#.#.###.###.###.###.###.#########.#.#.###.#####.#
|
||||
#.#...#.....#...#.....#.....#...#.#.#.#.....#...#.#.#.......#.......#.......#...#.......#...#.#.......#.#...#.#.....#.........#.#...#.....#.#
|
||||
#.#.###.###.###.#####.#.#.#####.#.#.#.#.#######.#.#.#######.#.#.#####.#######.###.###.#####.#.#########.#.###.#######.###.#####.#.#.###.#.#.#
|
||||
#.#...#...#...#.....#.#.#...#.......#.#.......#.#.#.......#...#.#...#...#.....#.....#.#.....#.....#.....#.#.....#.......#...#...#.#...#.#.#.#
|
||||
#.###.###.#.#.#####.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.#.###.#####.###.###.#.###.#####.#.#.#########.#.#.###.#.#.#.#.#####.###.#.###.###.#.#.#.#
|
||||
#...#...#.#.....#.#.#.#...#...#...#.#...#.#.#.#.#.#.#.#...#...#...#...#...#...#...#.#.#.....#.#...#.#.#...#...#...#.....#...#.#...#.#.#.#...#
|
||||
###.###.#.###.#.#.#.#.#####.###.###.###.#.#.#.#.#.###.#.#####.###.#.#.#####.#.#.#.###.#####.#.#.###.###.###.#.#####.#.###.###.###.#.#.#.###.#
|
||||
#...#.....#.#.#...#.#.#.....#...#...#...#.#.#.#...#...#.#.......#.#.#.........#.#...#.........#...#...#...#.#...#...#.....#.#...#.#.#.#.#...#
|
||||
#.#.#.###.#.#.###.#.###.#####.###.#.#.#####.#.#####.###.#.###.###.#############.###.#.###.###.###.###.###.#####.###.#######.#.#.#.#.#.#.#.###
|
||||
#.#.#.#.#...#...#.#.........#.#...#.#.#.............#.....#.#.#.............#...#.#.#...#...#...#...#...#...#...#.....#.....#.#.#.#.#.#...#.#
|
||||
#.#.#.#.###.###.#.#########.#.#.###.#.#.###.#######.#######.#.#.###.#######.#.###.#.#####.#.#######.#.#####.#.###.#.###.#.#.#.#.#.#.#.#####.#
|
||||
#.#.#.#.......#.#.....#...#.#.#.#...#...#...#...#...#.....#...#.#...#.....#...#...#.....#.#...#.....#.......#...#.#.#...#.#...#.#.#.#.......#
|
||||
#.###.#.#######.#######.#.#.#.#.###.#####.###.#.#.###.#.#.#####.#.#####.#########.#####.#.###.#.###############.#.#.#.###.###.#.#.#.###.#####
|
||||
#.....#...#.....#.......#.#.#.#...#.#.....#...#...#...#.#.#.....#.....#...........#...#...#.#...#.#.....#.......#.....#.#.#...#.#.....#.....#
|
||||
###########.#####.###.#.#.###.###.#.###.#.#.#######.###.#.#.###.#####.#######.###.###.#####.#####.#.#.###.#.#####.#####.#.#.###.###########.#
|
||||
#.#.........#...#.#...#.#.....#...#.#...#.#.#...#...#...#...#.#.....#.......#...#.............#.....#.....#.#...#.......#.#...#.....#...#...#
|
||||
#.#.###.#####.#.#.#.###.###.###.###.#.###.#.#.###.###.#######.#.#.#########.#.#.#####.#######.###.#########.#.###.#####.#.###.#####.#.#.#.#.#
|
||||
#.............#...#.....#...#...#.....#...#...#...#.............#.....#.....#.#.#.....#.....#...#.#.....#...#...#.......#.#.......#.#.#...#.#
|
||||
#.###.#.#.#.#.###########.#.#.#.#############.#.###.#########.###.#.###.#######.#.#####.###.###.#.###.#.#.#####.#######.#.#.###.###.#.#####.#
|
||||
#...#.#...#.#.......#.....#.#.#...........#...#.#...#.#.....#.....#...#.........#...#...#.#.....#...#.#.#.#...#.........#.#.#.........#...#.#
|
||||
#.#.#.#####.#######.#.#####.#.###########.#.###.#.###.#.###.#.#######.#######.#.#.#.#.###.#########.#.#.#.#.#.#.#########.#.#.#.#.#####.#.#.#
|
||||
#.#.#.#...#.............#...#.........#...#...#.#.....#.#.#...#.....#.......#...#.#.#.....#...#...#.#.#.#...#.#.#.....#...#.#...#.....#.#...#
|
||||
#.#.#.#.#####.#.#.#.###.#.###########.#.#.#.#.#.#####.#.#.#########.#####.#.#####.#.#####.#.#.#.###.#.#.#####.#.#.###.#.#.#.###.#####.#.#####
|
||||
#.#.#.#.....#...#.#.#...#.#...........#.#.#...#...#...#.........#.....#...#.#.....#.....#.#.#...#...#.#.#...#.#...#...........#.............#
|
||||
#.###.#####.###.#.#.#.###.#.#.#########.###.#####.#############.#.###.#.#####.#####.#####.#.###.#.###.#.#.#.#.#####.#########.#.#.#######.#.#
|
||||
#.....#...#...#.#.#...#.#.#.#.........#.#...#.....#.....#.....#...#...#.........#.#.#.....#...#.....#.#.#.#...#.#...#.#.....#.#.#...#...#...#
|
||||
#.#.###.#.###.#.###.#.#.#.#.#####.#####.#.###.#####.#.#.#####.#####.#######.###.#.#.#.#####.#.#####.#.#.#.#####.#.###.#.#.#.#.#.###.#.#.###.#
|
||||
#.#...............#...#.#.#.......#...#.....#...#...#.#.....#...#.......#...#.#...#...#...#.#.....#.#.#.#.#.....#...#...#.#.#...#.#.#.#.....#
|
||||
#.#.#.#####.#.###.#####.#.#.#######.#.#########.#.###.#####.#.###.#######.#.#.###.#######.#.###.#.#.###.#.#.###.###.#####.#.###.#.#.#.#######
|
||||
#...#...#.#.....#.......#.#.#.......#.........#...#...#...#...#.....#.......#.....#.....#.......#.#.#...#.#.#.....#...#...#.....#.#.#.......#
|
||||
#.#####.#.#.###########.#.#.#.#########.#####.#####.###.#.#####.#####.#####.#.#######.#.#.###.#####.#.#.#.###.#######.#.#######.#.#.###.#.#.#
|
||||
#.......#...#.......#...#.#.#.#.......#...#...#...#...#.#.......#...#.#.....#.#.......#.#...#.......#...#...#.#.....#.#.#.........#.........#
|
||||
#########.#.#.#####.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#########.#.#.#.#.###.#.#.#.###.#########.###.#####.#.#.#.###.#.#####.#.#####.#.###.#
|
||||
#.....#.#.#...#...#...#...#.#.#.#...#...#...#.#.#.#.#.#.........#.#...#.....#...#...#.#.........#.#.......#.#...#.....#.#...#...............#
|
||||
#.#.#.#.#.#.###.#.###.#.###.#.#.###.#.#####.###.#.###.#.#.#######.#########.#########.#########.#.###.###.#.#######.###.#.#.###.###.#.#####.#
|
||||
#...#...#.#...#.#...#.#...#.#.....#.#.......#...#...#.#.#.#.....#.......#...#.......#...#.....#.#.....#...#.#.......#...#.#.....#...#.....#.#
|
||||
###.#.###.#.#.#.#####.###.#####.###.#########.#####.#.#.#.#.###.#########.###.###.#.#.#.#.#.###.#####.#.###.#.###.#.###.#.#######.#.#.#####.#
|
||||
#...#.#.....#.#.......#.#.......#...#...#.....#...#.#.....#...#...........#...#...#...#.#.#.#.........#...#.#.#.#.#...#.........#.#.#.#.....#
|
||||
#.#.#.#.###.#.#.#######.#########.#.#.#.#.#####.#.#.#########.###############.#.#.#####.#.#.#.###.###.###.#.#.#.#.###.#######.###.#.#.#.#####
|
||||
#.............#.............#.....#.#.#...#...#.#...........#.#.......#.......#.#.#...#...#.#.......#.....#.....#...#.#...#...#...#.#.#...#.#
|
||||
###.#.###.#.#.#############.#.#####.#.#####.#.#.#.#.###.#.#.#.#.#####.#.#.#.#.#.#.#.#.#####.#######.#########.#####.#.#.#.#.###.#.###.###.#.#
|
||||
#.........#...#.......#.....#.#.....#.......#...#.#.....#...#.#.#...#...#.#.#.#.#.#.#.#...#.#.....#.#.......#.#.....#.#.#.#.#...#.#.....#.#.#
|
||||
#.#.#.#####.###.#.#####.#####.###.###############.#.#.#.#.###.#.#.#.#####.#.#.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.#.#.#.###.###.#.###.#.#.#
|
||||
#.#.....#.......#.#.....#...#...#.#.............#...#...#.....#...#...#...#.#.#.....#.#.#.#.....#.#.#.#.....#.#.#...#...#.#...#.#.#.#...#...#
|
||||
#.#.#.#.#######.###.#####.#.###.#.#.#####.###########.#################.###.#.#######.#.#.#.#######.#.#.#####.#.#########.#.###.#.#.#######.#
|
||||
#...#...#...#...#...#.#...#.#...#.#...#.#...........#.#.....#...........#.#.#.#.......#.#.#.#.......#.#...#...#.#...#...#.#...#.#.#.........#
|
||||
#.#.#.###.#.#.###.###.#.#.###.###.###.#.#######.#####.#.#.#.#.###########.#.#.#.#######.#.#.#.#######.###.#####.#.#.#.#.#.###.#.#.#.#.#######
|
||||
#...#.#...#.......#.....#...#.#...#...#.......#.......#.#.#...#.....#.......#.#.#.....#.#...#...#.......#.......#.#.#.#.#...................#
|
||||
###.#.#.###.#.#.###.#######.#.#.###.#########.#.#########.#####.###.#.#########.#.#.###.#######.#######.###########.#.#.#######.#.#.###.#.#.#
|
||||
#.#.#...#...#.#.#...#.....#.#.#.#...#.......#.............#...#...#.............#.#.#...#...#...#.......#...#.......#.#.........#.#.....#.#.#
|
||||
#.#.#.###.###.#.#####.###.#.#.###.###.#####.#####.###.###.#.#.###################.###.###.#.#.###.#.#.###.#.#.###.#.#.#.###.#####.###.#.#.#.#
|
||||
#...#.#...#...#.......#.#...#.....#.....#.........#...#.....#...#.....#.........#.....#...#...#.......#...#.#.#...#.#.....#.......#.#.....#.#
|
||||
#.###.#.###.#########.#.#.#############.###########.###.###.#.#.#.###.#####.#####.#####.#######.###.###.###.#.#.###.#####.#########.#.#.#.#.#
|
||||
#.....#...#...............#.............#...#.....#.#...#...#.#.....#...#...#...#.#.....#.....#.#.....#.#...#.#.#...#.#...#.....#.........#.#
|
||||
#####.###.###.#############.#######.#.###.#.###.###.#.###.#.###########.#.###.#.#.#.###.#.#.#.#.#######.#.#####.#.###.#.###.###.#.###.#.#.#.#
|
||||
#...#...#...#.#.......#...#...#...#.#.#...#...#...#.#...#.#...........#.#.#...#...#.#.....#.#...#.....#.#.....#.#...#.#.#.....#.......#.#...#
|
||||
#.#.#.#.#.#.#.#.#####.#.#.###.###.#.###.#####.#.#.#.###.#.###.#######.#.#.#.#######.#.#####.#####.###.#.#####.#.#.#.#.#.#.###.#.#.###.#.#.#.#
|
||||
#.#...#.#.#.#.#.#.#...#.#...#.#...#.....#...#.#.#.#.#...#...#.#.....#...#.....#...#.#.....#.....#...#...#...#.#...#...#.#.....#.#...#.....#.#
|
||||
#.###.#.#.#.#.#.#.#.#####.#.#.#.#.#######.#.#.###.#.#.#####.###.###.#########.#.###.#####.#.#.#.###.#####.#.#.###.###.#.###.#.#.#.#.#.#.#.#.#
|
||||
#.#.............#.......#...#.#.#.........#.#...#.#.#.#...#.....#.#.#.....#.#.#.#...#...#.#...#.#...#.....#.#.#.......#...#.#.#.#.#.....#...#
|
||||
#.###.#####.#####.#####.#.###.#.#####.#####.###.#.#.#.#.#.###.###.#.#.###.#.#.#.#.###.###.#####.#.###.#######.#.#####.###.#.#.###.###.#.#.###
|
||||
#...#.....#.#.#...#.......#...........#.......#.#...#.#...........#...#...#...#.#.#.....#.....#.......#...#...#.....#...#.#.#.#.....#...#...#
|
||||
#.#.#####.#.#.#.#.#.#######.###.#######.#######.#.###.#########.#.#####.#####.#.#.#####.###.#.#########.#.#.#######.#####.#.#.#.#####.#.#.#.#
|
||||
#.#.#.....#.#...#...#.#.....#.........#.#...#...#...#...#.....#.#...#...........#.....#.....#.....#.....#...#.....#.#.....#.#.....#...#...#.#
|
||||
#.#.###.###.#.#######.#.#############.#.#.#.#.#########.#.###.#.#.#.#.#####.#########.###.###.###.#.#########.#.#.#.#.#########.###.#.#.#.#.#
|
||||
#.#...#.#...#...#.....#.....#.......#.#...#.#.........#...#.#.#.#...#.....#.........#...#.#...#...#.#.......#.#.#...#.#.......#.#...#...#...#
|
||||
#.###.#.#.#####.#.###.#####.#.#####.#.#####.#######.#.#####.#.#.###.#####.#####.###.###.#.#.#.#####.#.###.###.#.###.#.#####.#.###.###.#.#.###
|
||||
#.#...#.#.#...#.#...#.#.....#...#...#...#.......#.#.#.....#.......#.#...#.#...#...#...#.#.#.#.#.....#.........#.#...#...#...#...............#
|
||||
#.#.###.#.#.#.#.###.#.#.#######.#.#####.#.#####.#.#.###.###.#####.#.#.#.#.#.#.###.#####.#.#.#.#.#######.#######.###.###.#.#######.#.#.#.#.#.#
|
||||
#.#...#...#.#.#...#.#.#.#.......#.....#.#.....#...#.#...#.........#...#...#.#.....#.....#...#.#.....#...#.....#...#...#...#.........#...#.#.#
|
||||
#####.#######.###.#.###.#.#.#########.#.###.#.#.###.#####.#####.#######.###.#####.#.###############.#####.###.#.#.###.#####.#########.###.#.#
|
||||
#.....#.......#...#...#.#.#.#.....#...#.#...#...#...#.....#...#.#...........#...#.#...#...........#.......#...#.#...#.#...........#...#...#.#
|
||||
#.#######.#.###.#####.#.#.#.#.###.#.###.#.#####.#.###.#####.#.###.###########.###.###.###.#######.###.#####.###.###.###.#########.###.#.###.#
|
||||
#.#.....#.#...#.......#...#.#.#.#.......#.....#.#.#...#...#.#...#.....#.....#.....#...#...#.....#...#.#...#.#...#.#...#.....#...#.......#...#
|
||||
#.#.###.#.#.#.#.#####.#####.#.#.#####.#######.#.#.#.###.###.#.#.#####.#.#####.#####.###.###.#######.#.#.#.#.#.###.###.#####.#.###########.#.#
|
||||
#.#...#.#...#...#...#.#.....#.#.......#.....#.#.#.#...#...#...#.......#...#.....#...#.....#.........#.#.#.#.#...#...#.....#.#.............#.#
|
||||
#.###.#.###.#####.#.#.#.#.###.#.#####.###.#.#.#.#.###.#.#.###.###########.#.#####.###.###.#.#########.###.#.###.#.#.#####.#.###.#.#########.#
|
||||
#.....#.....#...#.#.#...#.....#.#...#.....#.#.#.#...#.#.#...#...#.......#.#...#...#...#.#.#...#.#...#.....#...#...#.#...#.#...#.#.#.#.......#
|
||||
#.#########.#.#.#.#.#.###.#####.#.#.#########.#.###.#.#####.###.#.#####.#.###.#.###.###.#.###.#.#.#.#####.###.#####.#.#.#.###.#.#.#.#.#####.#
|
||||
#...#.....#.#.#...#.#.#...#.......#.........#...#...#.......#.#...#.....#.....#.#.......#.#...#...#...#.....#.#...#.#.#.#.#...#.#.#...#...#.#
|
||||
###.#.#####.#.#####.###.###.###############.#.###.#.#######.#.#####.#########.#.#########.#.#######.#.#.#####.###.#.#.#.#.#.###.#.#####.#.###
|
||||
#.#.#...#...#...#...#...#...#...#...#...#...#.#.....#.....#.#...#.#.........#.#.....#...#.#.......#.#.....#...#...#...#.#...#...#...#...#...#
|
||||
#.#.###.#.#.###.#.###.###.#.#.#.#.#.#.#.#.###.#.#.###.###.#.#.#.#.###.#####.#.#####.#.#.#.#####.#.###.#.###.###.#######.#######.###.#.#####.#
|
||||
#.#...#.#.....#.#...#.#...#.#.#...#...#.#.#.....#.#...#.#.#...#...#.........#.....#...#...#.....#...#.#.#...#.......#...#.....#...#...#...#.#
|
||||
#.###.#.###.###.###.#.#.#.#.#.###.#######.#.###.###.###.#.#######.###.#.###.#####.#########.###.###.#.#.#.#######.###.###.#.#.#.#####.#.###.#
|
||||
#...#...#...#...#.#.#.#...#.#...#.#...#.......#...#.....#.........#...#.#.....#.....#.......#.#.#.#.#...#.......#.....#...#.#.#.#...#...#...#
|
||||
#.#####.#.#.#.###.#.#.###.#.###.###.#.#.###.#.###.#####.###########.#.#.#.###.#.###.#######.#.#.#.#.###.#######.#.#######.#.#.###.#.###.#.###
|
||||
#.......#...#...#.#.#.#...#...#.....#.....#.#...#...#...#.....#.....#.#...#.#.#.....#...#...#.....#.#...#.....#.........#.#.#.....#...#.#...#
|
||||
#.#########.###.#.#.#.#.#####.#.###.#.###.#.#.###.###.###.###.#.#.#########.#.#.#####.#.#.###.#####.#.###.###.#.#######.#.#.###.#.###.###.#.#
|
||||
#...#.#...#...#.#.#...#.#...#...#.....#...#.#...#...#...#.#.....#.#.........#.#.....#.#.#...#.#...#.#.#.#...#.#.#.....#.#.#.#.#...#.........#
|
||||
###.#.#.#.#.###.#.#####.###.###.#.###.#.#######.###.###.#.#.###.#.#.#.#######.#####.#.#.###.#.#.#.#.#.#.###.#.#.#.#.###.#.#.#.###.#.###.###.#
|
||||
#...#.#.#...#...#.....#...#...#...#...#.........#...............#...#.......#.....#.#.#.....#.#.#...#...#...#...#.#.....#.#.#.........#...#.#
|
||||
#.###.#.#.###.###.#######.#.#.#####.#.#.#######.#.#####.#.###.###.#########.#.###.#.#.###.###.#.#######.#.#######.#########.#.#.#.#######.#.#
|
||||
#.....#.#.....#.........#.#.#...#...#.........#...............#...#.....#...#...#.#...#...#.....#.....#.#.......#.#.........#.#...#.....#...#
|
||||
#####.#.#.#####.#.###.#.#.#####.#.###.#.###.#########.#.###.#.#.#.#####.#.#.#.#.#.#####.###.#########.#.#######.#.#.###.#####.###.#.###.###.#
|
||||
#.#...#...#.#.........#.#.#.....#.....#.#...#.....#.#...#...#...#.......#.#.#.#...#.#...#...#.......#.......#...#.............#...#...#.....#
|
||||
#.#.#####.#.#.#####.#.###.#.###.#####.#.#.#.#.#.#.#.###.#.#######.#.###.#.#.#.#####.#.###.###.###.#.#####.###.###.#.###.#####.#.#.###.#######
|
||||
#.#.#.......#.......#.......#.......#...........#...#...#...#.....#.#...#.#.#.#...#.....#.#...#...#...#...#...#.#.....#.....#.#.#.#...#.....#
|
||||
#.#.###.#.#.###.#####.###############.#.#.#.#.#.#####.#.###.#######.#.###.#.#.#.#.#.#####.#.###.#####.###.#.###.###.#.#####.###.#.#.###.#.###
|
||||
#.....................#.........#.....#...#.#.#.....#...#...........#...#.#.#.#.#...#...............#...#.#.#.......#.....#.#...#...#...#...#
|
||||
#.###.###.#.###.#.#.###.#######.#.###.#.###.#.#####.###.#################.#.#.#.#####.#####.#.###.#####.###.#.#.###.#####.#.#.###.#######.#.#
|
||||
#...#.....#.....#.#...#...#...#.#.#...#...#...#...#...#...........#.......#.#.#...#...#.......................#.#.......#...#.#...#.........#
|
||||
#.#.#####.#######.###.###.#.###.#.#.#.#.#.#######.#.#############.#.#######.#.#####.###.#######.#.#.#########.#.#.#.###.#####.#.#####.#.###.#
|
||||
#S#...............................................#.................#.......#...........#.........#...........#.......#...............#.....#
|
||||
#############################################################################################################################################
|
253
2024/day-16/solution-1.sh
Normal file
253
2024/day-16/solution-1.sh
Normal 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
15
2024/day-16/test-input-1
Normal file
@ -0,0 +1,15 @@
|
||||
###############
|
||||
#.......#....E#
|
||||
#.#.###.#.###.#
|
||||
#.....#.#...#.#
|
||||
#.###.#####.#.#
|
||||
#.#.#.......#.#
|
||||
#.#.#####.###.#
|
||||
#...........#.#
|
||||
###.#.#####.#.#
|
||||
#...#.....#.#.#
|
||||
#.#.#.###.#.#.#
|
||||
#.....#...#.#.#
|
||||
#.###.#.#.#.#.#
|
||||
#S..#.....#...#
|
||||
###############
|
5
2024/day-17/input
Normal file
5
2024/day-17/input
Normal 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
160
2024/day-17/machine.sh
Normal 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
31
2024/day-17/solution-1.sh
Normal 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
52
2024/day-17/solution-2.sh
Normal 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
5
2024/day-17/test-input-1
Normal 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
400
2024/day-19/input-designs
Normal 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
1
2024/day-19/input-towels
Normal 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
90
2024/day-19/solution-1.sh
Normal 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
76
2024/day-19/solution-2.sh
Normal 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
8
2024/day-19/test-designs
Normal file
@ -0,0 +1,8 @@
|
||||
brwrr
|
||||
bggr
|
||||
gbbr
|
||||
rrbgbr
|
||||
ubwu
|
||||
bwurrg
|
||||
brgr
|
||||
bbrgwb
|
1
2024/day-19/test-towels
Normal file
1
2024/day-19/test-towels
Normal file
@ -0,0 +1 @@
|
||||
r, wr, b, g, bwu, rb, gb, br
|
@ -28,9 +28,11 @@ do
|
||||
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
|
||||
@ -38,11 +40,12 @@ do
|
||||
while true
|
||||
do
|
||||
HEAD=$(( A - DIFF * HEADC ))
|
||||
HEADVDIFF=$(( ( (A / LEN) - (HEAD / LEN) ) / 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 ]]
|
||||
[[ $HEADVDIFF -eq $(( VDIFF * HEADC )) ]]
|
||||
then
|
||||
SHADOW_ARRAY[HEAD]=X # Mark on shadow map
|
||||
(( HEADC++ ))
|
||||
@ -55,11 +58,12 @@ do
|
||||
while true
|
||||
do
|
||||
TAIL=$(( B + DIFF * TAILC ))
|
||||
TAILVDIFF=$(( ( (TAIL / LEN) - (B / LEN) ) / 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 ]]
|
||||
[[ $TAILVDIFF -eq $(( VDIFF * TAILC )) ]]
|
||||
then
|
||||
SHADOW_ARRAY[TAIL]=X # Mark on shadow map
|
||||
(( TAILC++ ))
|
||||
@ -73,6 +77,6 @@ do
|
||||
unset IDX_ARRAY
|
||||
|
||||
done
|
||||
printf "%s" "${SHADOW_ARRAY[@]}" | fold -w "$LEN" | sed -E 's/(.)/\1\ /g'
|
||||
printf "\n"
|
||||
#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
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
58
2024/day-9/solution-1.sh
Normal 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
119
2024/day-9/solution-2.sh
Normal 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
1
2024/day-9/test-input
Normal file
@ -0,0 +1 @@
|
||||
2333133121414131402
|
Reference in New Issue
Block a user