From e02ee993c6e49f9e452371cef244741ccc8f35a1 Mon Sep 17 00:00:00 2001 From: Clement Date: Tue, 17 Dec 2024 16:30:14 +0800 Subject: [PATCH] Offload machine to separate file --- 2024/day-17/machine.sh | 87 ++++++++++++++++++++++++++++++++++++++ 2024/day-17/solution-1.sh | 88 ++------------------------------------- 2 files changed, 90 insertions(+), 85 deletions(-) create mode 100644 2024/day-17/machine.sh diff --git a/2024/day-17/machine.sh b/2024/day-17/machine.sh new file mode 100644 index 0000000..82d875e --- /dev/null +++ b/2024/day-17/machine.sh @@ -0,0 +1,87 @@ +#!/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) )) +} +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) )) +} +cdv () { # OPCODE 7 + $DEBUG && printf "OPCODE : 7 OP: cdv OPERAND: %s\n" "$1" >&2 + OPERAND=$( get_combo "$1" ) + REG_C=$(( REG_A / (2 ** OPERAND) )) +} + +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 "%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) )) -} - -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