From b33653672c42deee78044b6b8f4ec7b49f4f31b6 Mon Sep 17 00:00:00 2001 From: Clement Date: Thu, 12 Dec 2024 22:49:45 +0800 Subject: [PATCH] Part 2 draft --- 2024/day-12/solution-2.sh | 108 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 2024/day-12/solution-2.sh diff --git a/2024/day-12/solution-2.sh b/2024/day-12/solution-2.sh new file mode 100644 index 0000000..56fbe70 --- /dev/null +++ b/2024/day-12/solution-2.sh @@ -0,0 +1,108 @@ +#!/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_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" + +# 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 mapping and "consume" all adjacent tiles +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 + + unset IFS; read -r -a VAL_ARRAY <<< "$VALUE" + # Loop through adjacent tiles and recurse + for VAL in "${VAL_ARRAY[@]}" + 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&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&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]*' )" +done <<< "$( < "$FILE" grep -o '[A-Z]' | sort -u | grep -o '[A-Z]*' )" | + paste -s -d "+" | bc