Offload machine to separate file

This commit is contained in:
2024-12-17 16:30:14 +08:00
parent ac940aad0e
commit e02ee993c6
2 changed files with 90 additions and 85 deletions

87
2024/day-17/machine.sh Normal file
View File

@ -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<INPUT_LEN; i++ ))
do
if [[ ${INPUT[$i]} != "${OUTPUT[$i]}" ]]
then
return 1
fi
done
}

View File

@ -2,6 +2,7 @@
FILE=$1 FILE=$1
ITER=99 ITER=99
DEBUG=false
REG_A=$(grep 'Register A:' "$FILE" | cut -f2 -d: ) REG_A=$(grep 'Register A:' "$FILE" | cut -f2 -d: )
REG_B=$(grep 'Register B:' "$FILE" | cut -f2 -d: ) REG_B=$(grep 'Register B:' "$FILE" | cut -f2 -d: )
@ -14,91 +15,8 @@ printf "Input : " >&2
printf "%s " "${INPUT[@]}" >&2 printf "%s " "${INPUT[@]}" >&2
printf "\n" >&2 printf "\n" >&2
adv () { # OPCODE 0 # Load machine operations
printf "OPCODE : 0 OP: adv OPERAND: %s\n" "$1" >&2 . machine.sh
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<INPUT_LEN; i++ ))
do
if [[ ${INPUT[$i]} != "${OUTPUT[$i]}" ]]
then
return 1
fi
done
}
POINTER=0 POINTER=0
while [[ $POINTER -lt $INPUT_LEN ]] while [[ $POINTER -lt $INPUT_LEN ]]