#!/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