Working part 2 solution
This commit is contained in:
@ -1,11 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
FUNCNEST=99999
|
||||
FILE=input
|
||||
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_N1=$(( MAP_WIDTH -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"
|
||||
@ -17,25 +16,30 @@ check_adjacent () {
|
||||
|
||||
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
|
||||
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 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 () {
|
||||
|
||||
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[@]}"
|
||||
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"
|
||||
@ -67,7 +71,7 @@ do
|
||||
declare -A KV_CACHE
|
||||
IFS=':'; while read -r VAR1 VAR2
|
||||
do
|
||||
printf "VAR1: %s VAR2: %s\n" "$VAR1" "$VAR2" >&2
|
||||
#printf "VAR1: %s VAR2: %s\n" "$VAR1" "$VAR2" >&2
|
||||
KV_CACHE[$VAR1]=$VAR2
|
||||
done <<< "$(
|
||||
# Find all adjacent tiles
|
||||
@ -95,9 +99,9 @@ do
|
||||
do
|
||||
CHAR=${CH%% *} # Remove trailing whitespace
|
||||
if ! [[ -v KV_CACHE[$CHAR] ]]; then continue; fi
|
||||
MAX_PERI=4
|
||||
PERI_NUM=0
|
||||
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 ))"
|
||||
|
Reference in New Issue
Block a user