This commit is contained in:
2022-12-10 13:32:55 +01:00
parent 2a84a2e73f
commit 5b8b07a37e
4 changed files with 154 additions and 2 deletions

View File

@@ -1,8 +1,8 @@
package common package common
import ( import (
"bufio" "bufio"
"strconv" "strconv"
) )

95
day10/common/cpu.go Normal file
View File

@@ -0,0 +1,95 @@
package common
import (
"bufio"
"strconv"
)
type CPU struct {
registers map[string]int
}
func NewCPU() *CPU {
return &CPU{map[string]int{"X": 1}}
}
func (cpu CPU) GetRegisterValue(r string) int {
return cpu.registers[r]
}
type Instruction interface {
ExecuteCycle(*CPU) bool
}
type NoOp struct {
currentCycle int
}
func NewNoOp() *NoOp {
return &NoOp{}
}
func (instruction *NoOp) ExecuteCycle(cpu *CPU) bool {
instruction.currentCycle++
return instruction.currentCycle == 1
}
type AddX struct {
parameter int
currentCycle int
}
func NewAddX(parameter int) *AddX {
return &AddX{parameter: parameter, currentCycle: 0}
}
func (instruction *AddX) ExecuteCycle(cpu *CPU) bool {
instruction.currentCycle++
if instruction.currentCycle == 2 {
cpu.registers["X"] += instruction.parameter
return true
} else {
return false
}
}
type Program struct {
instructions []Instruction
currentInstruction int
}
func (program *Program) ExecuteCycles(cpu *CPU, nCycles int) bool {
for i := 0; i < nCycles && program.currentInstruction < len(program.instructions); i++ {
done := program.instructions[program.currentInstruction].ExecuteCycle(cpu)
if done {
program.currentInstruction++
}
}
return program.currentInstruction == len(program.instructions)
}
func Parse(scanner bufio.Scanner) Program {
program := Program{}
for scanner.Scan() {
line := scanner.Text()
var instruction Instruction
switch line[0:4] {
case "noop":
instruction = NewNoOp()
case "addx":
value, _ := strconv.Atoi(line[5:])
instruction = NewAddX(value)
}
program.instructions = append(program.instructions, instruction)
}
return program
}

23
day10/ex1/main.go Normal file
View File

@@ -0,0 +1,23 @@
package main
import (
"bufio"
"fmt"
"os"
"aoc2022/day10/common"
)
func main() {
program := common.Parse(*bufio.NewScanner(os.Stdin))
cpu := common.NewCPU()
strength := 0
program.ExecuteCycles(cpu, 19)
strength += cpu.GetRegisterValue("X") * 20
for i := 1; i <= 5; i ++ {
program.ExecuteCycles(cpu, 40)
strength += cpu.GetRegisterValue("X") * (20 + i*40)
}
fmt.Println(strength)
}

34
day10/ex2/main.go Normal file
View File

@@ -0,0 +1,34 @@
package main
import (
"aoc2022/day10/common"
"bufio"
"fmt"
"os"
)
func main() {
program := common.Parse(*bufio.NewScanner(os.Stdin))
cpu := common.NewCPU()
screen := [240]rune{}
i := 0
done := false
for !done {
xValue := cpu.GetRegisterValue("X")
if xValue >= (i % 40) - 1 && xValue <= (i % 40) + 1 {
screen[i] = '#'
} else {
screen[i] = '.'
}
done = program.ExecuteCycles(cpu, 1)
i = (i + 1) % 240
}
for i := 0; i < 6; i++ {
for j := 0; j < 40; j++ {
fmt.Print(string(screen[i*40+j]))
}
fmt.Println()
}
}