Day 19 (or at least some of it...)
This commit is contained in:
106
src/main/kotlin/com/basdado/adventofcode/Day19.kt
Normal file
106
src/main/kotlin/com/basdado/adventofcode/Day19.kt
Normal file
@@ -0,0 +1,106 @@
|
||||
package com.basdado.adventofcode
|
||||
|
||||
import java.util.Arrays.stream
|
||||
import java.util.stream.Collectors
|
||||
|
||||
const val DAY19_INPUT = "/day/19/input.txt"
|
||||
|
||||
fun main() {
|
||||
|
||||
val day = Day19()
|
||||
day.puzzle1()
|
||||
day.puzzle2()
|
||||
}
|
||||
|
||||
class Day19 {
|
||||
|
||||
fun puzzle1() {
|
||||
val (ip, instructions) = parseInput()
|
||||
|
||||
val regsBeforeExecution = IntArray(6) { 0 }
|
||||
val regsAfterExecution = executeProgram(regsBeforeExecution, ip, instructions)
|
||||
println(regsAfterExecution.joinToString(" "))
|
||||
}
|
||||
|
||||
fun puzzle2() {
|
||||
val (ip, instructions) = parseInput()
|
||||
|
||||
val regsBeforeExecution = IntArray(6) { if (it == 0) 1 else 0 }
|
||||
val regsAfterExecution = executeProgram(regsBeforeExecution, ip, instructions)
|
||||
println(regsAfterExecution.joinToString(" "))
|
||||
}
|
||||
|
||||
private fun executeProgram(regsBefore: IntArray, ip: Int, instructions: List<Instruction>): IntArray {
|
||||
|
||||
val regs = regsBefore.clone()
|
||||
var i = 0L
|
||||
while (true) {
|
||||
if (regs[ip] !in 0 until instructions.size) {
|
||||
break
|
||||
}
|
||||
instructions[regs[ip]].execute(regs)
|
||||
// Instruction pointer is incremented
|
||||
regs[ip]++
|
||||
if (i % 1000000L == 0L) {
|
||||
println(regs.joinToString(" ") + "...")
|
||||
}
|
||||
i++
|
||||
}
|
||||
return regs
|
||||
}
|
||||
|
||||
private fun parseInput(): Pair<Int, MutableList<Instruction>> {
|
||||
val ipRegex = Regex("""#ip (\d+)""")
|
||||
val ip =
|
||||
lines(DAY19_INPUT).findFirst().map { ipRegex.matchEntire(it) }.map { it!!.groupValues[1].toInt() }.get()
|
||||
|
||||
val instructionRegex = Regex("""([a-z]{4}) (\d+) (\d+) (\d+)""")
|
||||
val instructions = lines(DAY19_INPUT)
|
||||
.map { instructionRegex.matchEntire(it) }
|
||||
.filter { it != null }.map { it!! }
|
||||
.map {
|
||||
Instruction(
|
||||
opcode(it.groupValues[1]),
|
||||
it.groupValues[2].toInt(),
|
||||
it.groupValues[3].toInt(),
|
||||
it.groupValues[4].toInt()
|
||||
)
|
||||
}
|
||||
.collect(Collectors.toList())
|
||||
return Pair(ip, instructions)
|
||||
}
|
||||
|
||||
data class Instruction(val opcode: Opcode, val a: Int, val b: Int, val c: Int) {
|
||||
fun execute(regs: IntArray) {
|
||||
opcode.operation.invoke(regs, a,b,c)
|
||||
}
|
||||
}
|
||||
|
||||
fun opcode(id: String): Opcode = stream(Opcode.values()).filter { it.id == id }.findFirst().get()
|
||||
|
||||
enum class Opcode(val id: String, val operation: (IntArray, Int, Int, Int) -> Unit) {
|
||||
|
||||
ADDR("addr", {regs, a, b, c -> regs[c] = regs[a] + regs[b]}),
|
||||
ADDI("addi", {regs, a, b, c -> regs[c] = regs[a] + b}),
|
||||
|
||||
MULR("mulr", {regs, a, b, c -> regs[c] = regs[a] * regs[b]}),
|
||||
MULI("muli", {regs, a, b, c -> regs[c] = regs[a] * b}),
|
||||
|
||||
BANR("banr", {regs, a, b, c -> regs[c] = regs[a] and regs[b]}),
|
||||
BANI("bani", {regs, a, b, c -> regs[c] = regs[a] and b}),
|
||||
|
||||
BORR("borr", {regs, a, b, c -> regs[c] = regs[a] or regs[b]}),
|
||||
BORI("bori", {regs, a, b, c -> regs[c] = regs[a] or b}),
|
||||
|
||||
SETR("setr", {regs, a, b, c -> regs[c] = regs[a]}),
|
||||
SETI("seti", {regs, a, b, c -> regs[c] = a}),
|
||||
|
||||
GTIR("gtir", {regs, a, b, c -> regs[c] = if (a > regs[b]) 1 else 0}),
|
||||
GTRI("gtri", {regs, a, b, c -> regs[c] = if (regs[a] > b) 1 else 0}),
|
||||
GTRR("gtrr", {regs, a, b, c -> regs[c] = if (regs[a] > regs[b]) 1 else 0}),
|
||||
|
||||
EQIR("eqir", {regs, a, b, c -> regs[c] = if (a == regs[b]) 1 else 0}),
|
||||
EQRI("eqri", {regs, a, b, c -> regs[c] = if (regs[a] == b) 1 else 0}),
|
||||
EQRR("eqrr", {regs, a, b, c -> regs[c] = if (regs[a] == regs[b]) 1 else 0}),
|
||||
}
|
||||
}
|
||||
32
src/main/resources/day/15/input_maarten.txt
Normal file
32
src/main/resources/day/15/input_maarten.txt
Normal file
@@ -0,0 +1,32 @@
|
||||
################################
|
||||
####################.......#####
|
||||
##################.G.......###.#
|
||||
##################...G.........#
|
||||
#############................###
|
||||
############..............######
|
||||
############...##......#########
|
||||
############...G.....#.#########
|
||||
##..##........G##.........######
|
||||
##..##.....#.G...........E#..###
|
||||
##..##.....#.....G......G..E..##
|
||||
##G............................#
|
||||
#....G........#####..G.........#
|
||||
#......#.G...#######..E.......##
|
||||
#...##..G...#########E.....#####
|
||||
##...G.#....#########.....######
|
||||
######G.G...#########..#.#######
|
||||
######.#...G#########.##########
|
||||
#####.......#########.##########
|
||||
#####.GE.....#######..##########
|
||||
#####.....E...#####...##########
|
||||
#######....G..........##########
|
||||
#######..........G..############
|
||||
######.G............############
|
||||
#########...........#..#########
|
||||
############..........##########
|
||||
############E...E.##...#########
|
||||
#############.....E..E.#########
|
||||
##############.........#########
|
||||
##############...#....##########
|
||||
###############..#.#############
|
||||
################################
|
||||
8
src/main/resources/day/19/example.txt
Normal file
8
src/main/resources/day/19/example.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
#ip 0
|
||||
seti 5 0 1
|
||||
seti 6 0 2
|
||||
addi 0 1 0
|
||||
addr 1 2 3
|
||||
setr 1 0 0
|
||||
seti 8 0 4
|
||||
seti 9 0 5
|
||||
37
src/main/resources/day/19/input.txt
Normal file
37
src/main/resources/day/19/input.txt
Normal file
@@ -0,0 +1,37 @@
|
||||
#ip 4
|
||||
addi 4 16 4
|
||||
seti 1 9 5
|
||||
seti 1 5 2
|
||||
mulr 5 2 1
|
||||
eqrr 1 3 1
|
||||
addr 1 4 4
|
||||
addi 4 1 4
|
||||
addr 5 0 0
|
||||
addi 2 1 2
|
||||
gtrr 2 3 1
|
||||
addr 4 1 4
|
||||
seti 2 6 4
|
||||
addi 5 1 5
|
||||
gtrr 5 3 1
|
||||
addr 1 4 4
|
||||
seti 1 2 4
|
||||
mulr 4 4 4
|
||||
addi 3 2 3
|
||||
mulr 3 3 3
|
||||
mulr 4 3 3
|
||||
muli 3 11 3
|
||||
addi 1 5 1
|
||||
mulr 1 4 1
|
||||
addi 1 2 1
|
||||
addr 3 1 3
|
||||
addr 4 0 4
|
||||
seti 0 2 4
|
||||
setr 4 8 1
|
||||
mulr 1 4 1
|
||||
addr 4 1 1
|
||||
mulr 4 1 1
|
||||
muli 1 14 1
|
||||
mulr 1 4 1
|
||||
addr 3 1 3
|
||||
seti 0 0 0
|
||||
seti 0 2 4
|
||||
Reference in New Issue
Block a user