diff --git a/2024/day-17/machine.sh b/2024/day-17/machine.sh index 7691709..93e5605 100644 --- a/2024/day-17/machine.sh +++ b/2024/day-17/machine.sh @@ -3,7 +3,8 @@ adv () { # OPCODE 0 $DEBUG && printf "OPCODE : 0 OP: adv OPERAND: %s\n" "$1" >&2 OPERAND=$( get_combo "$1" ) - REG_A=$(( REG_A / (2 ** OPERAND) )) + #REG_A=$(( REG_A / (2 ** OPERAND) )) + REG_A=$( printf "%s / (2 ^ %s) \n" "$REG_A" "$OPERAND" | bc ) } bxl () { # OPCODE 1 $DEBUG && printf "OPCODE : 1 OP: bxl OPERAND: %s\n" "$1" >&2 @@ -38,12 +39,14 @@ out () { # OPCODE 5 bdv () { # OPCODE 6 $DEBUG && printf "OPCODE : 6 OP: bdv OPERAND: %s\n" "$1" >&2 OPERAND=$( get_combo "$1" ) - REG_B=$(( REG_A / (2 ** OPERAND) )) + #REG_B=$(( REG_A / (2 ** OPERAND) )) + REG_B=$( printf "%s / (2 ^ %s) \n" "$REG_A" "$OPERAND" | bc ) } cdv () { # OPCODE 7 $DEBUG && printf "OPCODE : 7 OP: cdv OPERAND: %s\n" "$1" >&2 OPERAND=$( get_combo "$1" ) - REG_C=$(( REG_A / (2 ** OPERAND) )) + #REG_C=$(( REG_A / (2 ** OPERAND) )) + REG_C=$( printf "%s / (2 ^ %s) \n" "$REG_A" "$OPERAND" | bc ) } # Get combo operand @@ -78,7 +81,22 @@ get_combo () { # Check if the program is a quine check_quine () { - for (( i=0; i=${#INPUT[@]}-$1; i-- )) do if [[ ${INPUT[$i]} != "${OUTPUT[$i]}" ]] then @@ -125,3 +143,18 @@ read_opcode () { (( POINTER+=2 )) fi } + +execute_machine () { + POINTER=0 + while [[ $POINTER -lt $INPUT_LEN ]] + do + OPCODE=${INPUT[$POINTER]} + OPERAND=${INPUT[$POINTER+1]} + read_opcode "$OPCODE" "$OPERAND" + $DEBUG && printf "Registers A : %s B: %s C : %s\n" "$REG_A" "$REG_B" "$REG_C" >&2 + $DEBUG && printf "Pointer : %s\n" "$POINTER" >&2 + (( MACHINE_ITER-- )) + if [[ $MACHINE_ITER -eq 0 ]] ; then break ; fi + done | paste -s -d " " +} + diff --git a/2024/day-17/solution-2.sh b/2024/day-17/solution-2.sh index b0622c1..31524e7 100644 --- a/2024/day-17/solution-2.sh +++ b/2024/day-17/solution-2.sh @@ -1,31 +1,44 @@ #!/usr/bin/env bash FILE=$1 -ITER=99 +ITER=1 +MACHINE_ITER=999 DEBUG=false +INCREMENT=1 +TAIL_NUM=16 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: ) +#REG_A=100000000000000 +REG_A=164541160582800 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 +#printf "Input: " >&2 +#printf "%s " "${INPUT[@]}" >&2 +#printf "\n" >&2 # Load machine operations . machine.sh -POINTER=0 -while [[ $POINTER -lt $INPUT_LEN ]] +#while ! check_quine +while ! check_tail "$TAIL_NUM" do - OPCODE=${INPUT[$POINTER]} - OPERAND=${INPUT[$POINTER+1]} - read_opcode "$OPCODE" "$OPERAND" - 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 "," + read -r -a OUTPUT <<< "$( execute_machine )" + printf "Register A: %s\n" "$REG_A" + printf "Output:\t" + #printf "%s " "${OUTPUT[@]}" + for i in "${OUTPUT[@]}" + do + printf "%s " "$i" # Print octal representation + done + printf "\n" + printf "Input:\t" + printf "%s " "${INPUT[@]}" + printf "\n" + (( REG_A+=INCREMENT)) + #(( ITER-- )) + if [[ $ITER -eq 0 ]] ; then break ; fi +done