add day 1 and 2 solutions

This commit is contained in:
george
2024-06-18 15:06:38 +01:00
commit a1b380717c
11 changed files with 197 additions and 0 deletions
View File
+36
View File
@@ -0,0 +1,36 @@
package main
import (
"fmt"
"intcode/internal/interpreter"
"intcode/internal/parser"
)
func main() {
sourceProgram, err := parser.ParseFile(nil)
if err != nil {
panic(err)
}
runProgram := make([]int, len(sourceProgram))
for x := 0; x < 100; x++ {
for y := 0; y < 100; y++ {
copy(runProgram, sourceProgram)
runProgram[1], runProgram[2] = x, y
interpreter := interpreter.Init(runProgram)
for !interpreter.Next() {}
if x == 12 && y == 2 {
fmt.Printf("Part 1: %v\n", runProgram[0])
}
if runProgram[0] == 19690720 {
fmt.Printf("Part 2: %02d%02d\n", x, y)
}
}
}
}
+3
View File
@@ -0,0 +1,3 @@
module intcode
go 1.22.4
+1
View File
@@ -0,0 +1 @@
package debugger
+61
View File
@@ -0,0 +1,61 @@
package interpreter
import "fmt"
type Interpreter struct {
program []int
instructionPointer int
}
func Init(program []int) *Interpreter {
return &Interpreter {
program: program,
instructionPointer: 0,
}
}
func (i *Interpreter) Next() bool {
opcode := i.getValueAtIndex(i.instructionPointer)
ipIncrement := 1
switch opcode {
case 1:
i.add()
ipIncrement = 4
case 2:
i.mul()
ipIncrement = 4
case 99:
return true
default:
panic(fmt.Sprintf("unhandled opcode %v at IP %v", opcode, i.instructionPointer))
}
i.instructionPointer += ipIncrement
return false
}
func (i *Interpreter) getValueAtIndex(index int) int {
return i.program[index]
}
func (i *Interpreter) setValueAtIndex(index, value int) {
i.program[index] = value
}
func (i *Interpreter) add() {
resIndex := i.getValueAtIndex(i.instructionPointer + 3)
arg1Index := i.getValueAtIndex(i.instructionPointer + 1)
arg2Index := i.getValueAtIndex(i.instructionPointer + 2)
i.setValueAtIndex(resIndex, i.getValueAtIndex(arg1Index) + i.getValueAtIndex(arg2Index))
}
func (i *Interpreter) mul() {
resIndex := i.getValueAtIndex(i.instructionPointer + 3)
arg1Index := i.getValueAtIndex(i.instructionPointer + 1)
arg2Index := i.getValueAtIndex(i.instructionPointer + 2)
i.setValueAtIndex(resIndex, i.getValueAtIndex(arg1Index) * i.getValueAtIndex(arg2Index))
}
@@ -0,0 +1 @@
package interpreter
+48
View File
@@ -0,0 +1,48 @@
package parser
import (
"fmt"
"io"
"os"
"strconv"
"strings"
)
const DefaultFile = "input"
func ParseFile(input *string) ([]int, error) {
if input == nil {
file := DefaultFile
if len(os.Args) == 2 {
file = os.Args[1]
}
inputFile, err := os.Open(file)
if err != nil {
return nil, fmt.Errorf("could not parse input file: %v", err)
}
fileData, err := io.ReadAll(inputFile)
if err != nil {
return nil, fmt.Errorf("could not read input file: %v", err)
}
fileStr := strings.TrimSpace(string(fileData))
input = &fileStr
}
strNums := strings.Split(*input, ",")
opcodes := make([]int, len(strNums))
for i, v := range strNums {
num, err := strconv.Atoi(v)
if err != nil {
fmt.Fprintf(os.Stderr, "WARNING: error parsing int from input, substring was %v", v)
}
opcodes[i] = num
}
return opcodes, nil
}