Files
advent-of-code/2024/day-17/solution-1.sh

64 lines
1.4 KiB
Bash
Raw Normal View History

2024-12-17 15:48:25 +08:00
#!/usr/bin/env bash
FILE=$1
ITER=99
2024-12-17 16:30:14 +08:00
DEBUG=false
2024-12-17 15:48:25 +08:00
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
2024-12-17 16:30:14 +08:00
# Load machine operations
. machine.sh
2024-12-17 15:48:25 +08:00
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 ","