#!/bin/bash

filename=${1:-input.txt}

exec 3<"$filename"

OLDIFS=$IFS
IFS="," read -u 3 -a orig_data
IFS=$OLDIFS

run_program() {
    noun=$1
    verb=$2
    data=("${orig_data[@]}")
    data[1]=$noun
    data[2]=$verb
    pos=0
    while [ $pos -le ${#data[@]} ]; do
        loc1=${data[$((pos+1))]}
        loc2=${data[$((pos+2))]}
        res_loc=${data[$((pos+3))]}
        case ${data[$pos]} in
            1)
                data[$res_loc]=$((${data[$loc1]}+${data[$loc2]}))
                ;;
            2)
                data[$res_loc]=$((${data[$loc1]}*${data[$loc2]}))
                ;;
            99)
                break
                ;;
            *)
                echo "Invalid opcode: ${data[$pos]} at position $pos"
                exit 1
        esac
        pos=$((pos+4))
    done

    echo "${data[0]}"
}

echo "Part 1: $(run_program 12 2)"

desired_output=19690720

for (( noun=0; noun < 100; noun++)); do
    for (( verb=0; verb < 100; verb++)); do
        if [ $(run_program $noun $verb) -eq $desired_output ]; then
            echo "Part 2: $((noun * 100 + $verb)) $noun, $verb"
            exit 0
        fi
    done
done
