Working part 2 solution
This commit is contained in:
@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
FUNCNEST=99999
|
FUNCNEST=99999
|
||||||
FILE=test-input-1
|
FILE=input
|
||||||
read -r -a MAP_ARRAY <<< "$( < "$FILE" paste -s -d "" | sed -E 's/(.)/\1\ /g' )"
|
read -r -a MAP_ARRAY <<< "$( < "$FILE" paste -s -d "" | sed -E 's/(.)/\1\ /g' )"
|
||||||
MAP_LEN=${#MAP_ARRAY[@]}
|
MAP_LEN=${#MAP_ARRAY[@]}
|
||||||
MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 ))
|
MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 ))
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
FUNCNEST=99999
|
FUNCNEST=99999
|
||||||
FILE=input
|
FILE=test-input-1
|
||||||
read -r -a MAP_ARRAY <<< "$( < "$FILE" paste -s -d "" | sed -E 's/(.)/\1\ /g' )"
|
read -r -a MAP_ARRAY <<< "$( < "$FILE" paste -s -d "" | sed -E 's/(.)/\1\ /g' )"
|
||||||
MAP_LEN=${#MAP_ARRAY[@]}
|
MAP_LEN=${#MAP_ARRAY[@]}
|
||||||
MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 ))
|
MAP_WIDTH=$(( $( head -1 "$FILE" | wc -c ) -1 ))
|
||||||
MAP_WIDTH_N1=$(( MAP_WIDTH -1 ))
|
|
||||||
MAP_WIDTH_INV=$(( 0 - MAP_WIDTH ))
|
MAP_WIDTH_INV=$(( 0 - MAP_WIDTH ))
|
||||||
MAP_HEIGHT=$( < "$FILE" wc -l )
|
MAP_HEIGHT=$( < "$FILE" wc -l )
|
||||||
printf "Len: %s Width: %s Height: %s\n" "$MAP_LEN" "$MAP_WIDTH" "$MAP_HEIGHT"
|
printf "Len: %s Width: %s Height: %s\n" "$MAP_LEN" "$MAP_WIDTH" "$MAP_HEIGHT"
|
||||||
@ -17,25 +16,30 @@ check_adjacent () {
|
|||||||
|
|
||||||
DIFF=$(( $2 - $1 ))
|
DIFF=$(( $2 - $1 ))
|
||||||
# Valid adjacent distances
|
# Valid adjacent distances
|
||||||
if [[ $DIFF -eq 1 ]] || [[ $DIFF -eq -1 ]] || [[ $DIFF -eq $MAP_WIDTH ]] || [[ $DIFF -eq $MAP_WIDTH_INV ]] ; then : else return 1 ; fi
|
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
|
# Check for left/right bounds
|
||||||
if [[ $DIFF -eq 1 ]] && [[ $(( $2 % MAP_WIDTH )) -eq 0 ]] ; then return 1 ; fi
|
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
|
if [[ $DIFF -eq -1 ]] && [[ $(( $1 % MAP_WIDTH )) -eq 0 ]] ; then return 1 ; fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Basically recurse over mapping and "consume" all adjacent tiles
|
# Basically recurse over kv and "consume" all adjacent tiles
|
||||||
|
# All tiles that are consumed are adjacent
|
||||||
check_and_unset () {
|
check_and_unset () {
|
||||||
|
|
||||||
local KV_I=${1%% *} # Remove trailing whitespace
|
local KV_I=${1%% *} # Remove trailing whitespace
|
||||||
(( AREA++ ))
|
(( AREA++ ))
|
||||||
VALUE=${KV_CACHE[$KV_I]}
|
VALUE=${KV_CACHE[$KV_I]}
|
||||||
unset "KV_CACHE[$KV_I]" # "Take" it
|
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
|
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"
|
unset IFS; read -r -a VAL_ARRAY <<< "$VALUE"
|
||||||
# Loop through adjacent tiles and recurse
|
# Loop through adjacent tiles and recurse
|
||||||
for VAL in "${VAL_ARRAY[@]}"
|
for VAL in "${VAL_ARRAY[@]}" # VAL_ARRAY is always sorted
|
||||||
do
|
do
|
||||||
VAL_IDX=${VAL%% *}
|
VAL_IDX=${VAL%% *}
|
||||||
if [[ -v KV_CACHE[$VAL_IDX] ]] # Check if tile has been "taken"
|
if [[ -v KV_CACHE[$VAL_IDX] ]] # Check if tile has been "taken"
|
||||||
@ -67,7 +71,7 @@ do
|
|||||||
declare -A KV_CACHE
|
declare -A KV_CACHE
|
||||||
IFS=':'; while read -r VAR1 VAR2
|
IFS=':'; while read -r VAR1 VAR2
|
||||||
do
|
do
|
||||||
printf "VAR1: %s VAR2: %s\n" "$VAR1" "$VAR2" >&2
|
#printf "VAR1: %s VAR2: %s\n" "$VAR1" "$VAR2" >&2
|
||||||
KV_CACHE[$VAR1]=$VAR2
|
KV_CACHE[$VAR1]=$VAR2
|
||||||
done <<< "$(
|
done <<< "$(
|
||||||
# Find all adjacent tiles
|
# Find all adjacent tiles
|
||||||
@ -95,9 +99,9 @@ do
|
|||||||
do
|
do
|
||||||
CHAR=${CH%% *} # Remove trailing whitespace
|
CHAR=${CH%% *} # Remove trailing whitespace
|
||||||
if ! [[ -v KV_CACHE[$CHAR] ]]; then continue; fi
|
if ! [[ -v KV_CACHE[$CHAR] ]]; then continue; fi
|
||||||
MAX_PERI=4
|
PERI_NUM=4 # Number of perimeters of a square
|
||||||
PERI_NUM=0
|
|
||||||
AREA=0
|
AREA=0
|
||||||
|
ROW=0
|
||||||
check_and_unset "$CHAR"
|
check_and_unset "$CHAR"
|
||||||
printf "char: %s max: %s peri: %s area: %s\n" "$CHAR" "$MAX_PERI" "$PERI_NUM" "$AREA" >&2
|
printf "char: %s max: %s peri: %s area: %s\n" "$CHAR" "$MAX_PERI" "$PERI_NUM" "$AREA" >&2
|
||||||
printf "%s\n" "$(( PERI_NUM * AREA ))"
|
printf "%s\n" "$(( PERI_NUM * AREA ))"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
FILE=input
|
FILE=input
|
||||||
read -r -a INPUT_ARRAY <<< "$( sed -E 's/.*X[\+\=]([0-9]+), Y[\+\=]([0-9]+)/\1 \2 /g' < "$FILE" | paste -s -d " " )"
|
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
|
#printf "%s\n" "${INPUT_ARRAY[@]}" >&2
|
||||||
INPUT_LEN=${#INPUT_ARRAY[@]}
|
INPUT_LEN=${#INPUT_ARRAY[@]}
|
||||||
|
|
||||||
TOTAL_TOKEN=0
|
TOTAL_TOKEN=0
|
||||||
@ -12,32 +12,52 @@ do
|
|||||||
C=${INPUT_ARRAY[i+1]}
|
C=${INPUT_ARRAY[i+1]}
|
||||||
B=${INPUT_ARRAY[i+2]}
|
B=${INPUT_ARRAY[i+2]}
|
||||||
D=${INPUT_ARRAY[i+3]}
|
D=${INPUT_ARRAY[i+3]}
|
||||||
X="10000000000000${INPUT_ARRAY[i+4]}"
|
X=$(( 10000000000000 + ${INPUT_ARRAY[i+4]} ))
|
||||||
Y="10000000000000${INPUT_ARRAY[i+5]}"
|
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
|
I=$(( ( B*Y - D*X ) / ( B*C - D*A ) )) # Button A
|
||||||
J=$(( ( X - A*I ) / B )) # Button B
|
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
|
||||||
|
|
||||||
TOKEN=$(( I*3 + J*1 ))
|
# Numbers have to position integers
|
||||||
|
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 "Answer: I= %s, J= %s\n" "$I" "$J"
|
||||||
|
#echo "Modulus I: $(( ( B*Y - D*X ) % ( B*C - D*A ) ))" # Button A
|
||||||
|
#echo "Modulus J: $(( ( X - A*I ) % B ))" # Button B
|
||||||
printf "Verify answer : %s to %s, %s to %s\n" "$(( A*I + B*J ))" "$X" "$(( C*I + D*J ))" "$Y"
|
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 ))"
|
printf "Total cost: %s\n" "$(( I*3 + J*1 ))"
|
||||||
} >&2
|
} >&2
|
||||||
|
|
||||||
if ! [[ $(( A*I + B*J )) -eq $X ]]
|
TOKEN=$(( I*3 + J*1 )) # Calculate token cost
|
||||||
|
|
||||||
|
# Verify numbers with results for positions
|
||||||
|
if ! [[ $(( A*I + B*J )) -eq $X ]] # X position
|
||||||
then
|
then
|
||||||
continue
|
continue
|
||||||
elif ! [[ $(( C*I + D*J )) -eq $Y ]]
|
elif ! [[ $(( C*I + D*J )) -eq $Y ]] # Y position
|
||||||
then
|
then
|
||||||
continue
|
continue
|
||||||
elif [[ $I -lt 1 ]] || [[ $J -lt 1 ]]
|
|
||||||
then
|
|
||||||
continue
|
|
||||||
#elif [[ $I -gt 100 ]] || [[ $J -gt 100 ]]
|
|
||||||
#then
|
|
||||||
# continue
|
|
||||||
else
|
else
|
||||||
(( TOTAL_TOKEN+=TOKEN ))
|
(( TOTAL_TOKEN+=TOKEN ))
|
||||||
fi
|
fi
|
||||||
|
Reference in New Issue
Block a user