#!/usr/bin/env bash FILE=$1 ITER=99 DEBUG=false REG_A=$(grep 'Register A:' "$FILE" | cut -f2 -d: ) REG_B=$(grep 'Register B:' "$FILE" | cut -f2 -d: ) REG_C=$(grep 'Register C:' "$FILE" | cut -f2 -d: ) read -r -a INPUT <<< "$(grep 'Program:' "$FILE" | cut -f2 -d: | tr ',' ' ' )" INPUT_LEN=${#INPUT[@]} printf "Registers A: %s B: %s C: %s\n" "$REG_A" "$REG_B" "$REG_C" >&2 printf "Input : " >&2 printf "%s " "${INPUT[@]}" >&2 printf "\n" >&2 # Load machine operations . machine.sh POINTER=0 while [[ $POINTER -lt $INPUT_LEN ]] do OPCODE=${INPUT[$POINTER]} OPERAND=${INPUT[$POINTER+1]} if [[ $OPCODE -eq 0 ]] then adv "$OPERAND" (( POINTER+=2 )) elif [[ $OPCODE -eq 1 ]] then bxl "$OPERAND" (( POINTER+=2 )) elif [[ $OPCODE -eq 2 ]] then bst "$OPERAND" (( POINTER+=2 )) elif [[ $OPCODE -eq 3 ]] then # jnz itself moves the pointer jnz "$OPERAND" elif [[ $OPCODE -eq 4 ]] then bxc "$OPERAND" (( POINTER+=2 )) elif [[ $OPCODE -eq 5 ]] then out "$OPERAND" (( POINTER+=2 )) elif [[ $OPCODE -eq 6 ]] then bdv "$OPERAND" (( POINTER+=2 )) elif [[ $OPCODE -eq 7 ]] then cdv "$OPERAND" (( POINTER+=2 )) fi 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 ","