-#!/bin/bash
-
-exec 3<input.txt
-
-OLDIFS=$IFS
-IFS="," read -u 3 -a orig_data
-IFS=$OLDIFS
-
-run_program() {
- data=("${orig_data[@]}")
- pos=0
- declare -a immediate
- while [ $pos -le ${#data[@]} ]; do
- loc1=${data[$((pos+1))]}
- loc2=${data[$((pos+2))]}
- res_loc=${data[$((pos+3))]}
- # first, printf the value to 5 digits
- instruction=$(printf "%05d" ${data[$pos]})
- for (( a=0; a<3; a++ )); do
- immediate[$((3-a))]=${instruction:$a:1}
- done
- instruction=${instruction:3}
- param_count=3
- case $instruction in
- 01|02)
- symbol="+"
- if [ $instruction == "02" ]; then
- symbol="*"
- fi
- val1=${data[$((pos+1))]}
- val2=${data[$((pos+2))]}
- if [ ${immediate[1]} -eq 0 ]; then
- val1=${data[$loc1]}
- fi
- if [ ${immediate[2]} -eq 0 ]; then
- val2=${data[$loc2]}
- fi
- data[$res_loc]=$(($val1 $symbol $val2))
- ;;
- 03)
- read -p "input: " input
- res_loc=${data[$((pos+1))]}
- data[$res_loc]=$input
- param_count=1
- ;;
- 04)
- if [ ${immediate[1]} -eq 1 ]; then
- echo ${data[$((pos+1))]}
- else
- res_loc=${data[$((pos+1))]}
- echo ${data[$res_loc]}
- fi
- param_count=1
- ;;
- 05|06)
- val=${data[$((pos+1))]}
- jumpto=${data[$((pos+2))]}
- param_count=2
- if [ ${immediate[1]} -eq 0 ]; then
- val=${data[$val]}
- fi
- if [ ${immediate[2]} -eq 0 ]; then
- jumpto=${data[$jumpto]}
- fi
- if ( [ $val -ne 0 ] && [ "$instruction" == "05" ] ) ||
- ( [ $val -eq 0 ] && [ "$instruction" == "06" ] ); then
- pos=$jumpto
- continue
- fi
- ;;
- 07)
- val1=${data[$((pos+1))]}
- val2=${data[$((pos+2))]}
- res_pos=${data[$((pos+3))]}
- if [ ${immediate[1]} -eq 0 ]; then
- val1=${data[$val1]}
- fi
- if [ ${immediate[2]} -eq 0 ]; then
- val2=${data[$val2]}
- fi
- if [ $val1 -lt $val2 ]; then
- data[$res_pos]=1
- else
- data[$res_pos]=0
- fi
- ;;
- 08)
- val1=${data[$((pos+1))]}
- val2=${data[$((pos+2))]}
- res_pos=${data[$((pos+3))]}
- if [ ${immediate[1]} -eq 0 ]; then
- val1=${data[$val1]}
- fi
- if [ ${immediate[2]} -eq 0 ]; then
- val2=${data[$val2]}
- fi
- if [ $val1 -eq $val2 ]; then
- data[$res_pos]=1
- else
- data[$res_pos]=0
- fi
- ;;
- 99)
- break
- ;;
- *)
- echo "Invalid opcode: $instruction at position $pos"
- exit 1
- esac
- pos=$(($pos+$param_count+1))
- done
-}
-
-echo "Part 1:"
-run_program