--- /dev/null
+#!/bin/bash
+
+exec 3<input.txt
+
+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