diff --git a/2024/day-17/machine.sh b/2024/day-17/machine.sh index 82d875e..7691709 100644 --- a/2024/day-17/machine.sh +++ b/2024/day-17/machine.sh @@ -46,8 +46,8 @@ cdv () { # OPCODE 7 REG_C=$(( REG_A / (2 ** OPERAND) )) } +# Get combo operand get_combo () { - # Interpret operand value if [[ $OPERAND -eq 0 ]] then printf "$1" @@ -76,6 +76,7 @@ get_combo () { fi } +# Check if the program is a quine check_quine () { for (( i=0; i&2 printf "Pointer : %s\n" "$POINTER" >&2 (( ITER-- )) diff --git a/2024/day-17/solution-2.sh b/2024/day-17/solution-2.sh index fe2dcbf..b0622c1 100644 --- a/2024/day-17/solution-2.sh +++ b/2024/day-17/solution-2.sh @@ -2,6 +2,7 @@ FILE=$1 ITER=99 +DEBUG=false REG_A=$(grep 'Register A:' "$FILE" | cut -f2 -d: ) REG_B=$(grep 'Register B:' "$FILE" | cut -f2 -d: ) @@ -14,137 +15,17 @@ printf "Input : " >&2 printf "%s " "${INPUT[@]}" >&2 printf "\n" >&2 -adv () { # OPCODE 0 - printf "OPCODE : 0 OP: adv OPERAND: %s\n" "$1" >&2 - OPERAND=$( get_combo "$1" ) - REG_A=$(( REG_A / (2 ** OPERAND) )) -} -bxl () { # OPCODE 1 - printf "OPCODE : 1 OP: bxl OPERAND: %s\n" "$1" >&2 - OPERAND=$1 - REG_B=$(( REG_B ^ OPERAND )) -} -bst () { # OPCODE 2 - printf "OPCODE : 2 OP: bst OPERAND: %s\n" "$1" >&2 - OPERAND=$( get_combo "$1" ) - REG_B=$(( OPERAND % 8 )) -} -jnz () { # OPCODE 3 - 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 - 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 - printf "OPCODE : 5 OP: out OPERAND: %s\n" "$1" >&2 - OPERAND=$( get_combo "$1" ) - printf "%s\n" "$(( OPERAND % 8 ))" -} -bdv () { # OPCODE 6 - printf "OPCODE : 6 OP: bdv OPERAND: %s\n" "$1" >&2 - OPERAND=$( get_combo "$1" ) - REG_B=$(( REG_A / (2 ** OPERAND) )) -} -cdv () { # OPCODE 7 - printf "OPCODE : 7 OP: cdv OPERAND: %s\n" "$1" >&2 - OPERAND=$( get_combo "$1" ) - REG_C=$(( REG_A / (2 ** OPERAND) )) -} +# Load machine operations +. machine.sh -get_combo () { - # Interpret operand value - 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_quine () { - for (( i=0; i&2 - printf "Pointer : %s\n" "$POINTER" >&2 - (( ITER-- )) - if [[ $ITER -eq 0 ]] ; then break ;fi - done | paste -s -d "," - )" -done + 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 ","