Compare commits
7
Commits
a70d9fafee
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fab6be8091 | ||
|
|
5a814d807f | ||
|
|
71f8edaa7a | ||
|
|
dbcdfb83fc | ||
|
|
973b2febb0 | ||
|
|
11d0318153 | ||
|
|
b5d98ad935 |
No files matched your search
+10
-1
@@ -1,5 +1,14 @@
|
||||
import day1.Day1
|
||||
import day2.Day2
|
||||
import day2.Hand
|
||||
import day3.Day3
|
||||
|
||||
fun main() {
|
||||
println("Day 1: ${Day1.answerOne()} && ${Day1.answerTwo()}")
|
||||
println("Day 1-1: ${Day1.answerOne()}")
|
||||
println("Day 1-2: ${Day1.answerTwo()}")
|
||||
println("Day 2-1: ${Day2.sumOfCompatibleGames("src/main/resources/day2/input.txt", Hand(12,13,14))}")
|
||||
println("Day 2-2: ${Day2.powerOfMinimumSetOfCubes("src/main/resources/day2/input.txt")}")
|
||||
println("Day 3-1: ${Day3.sumOfSelectedParts("src/main/resources/day3/input.txt")}")
|
||||
|
||||
|
||||
}
|
||||
@@ -4,28 +4,36 @@ import java.io.File
|
||||
|
||||
object Day2 {
|
||||
|
||||
fun sumOfCompatibleGames(hand: Hand) = readGames()
|
||||
fun sumOfCompatibleGames(file: String, hand: Hand) = readGames(file)
|
||||
.filter { it.isCompatibleWith(hand) }
|
||||
.map(Game::id)
|
||||
.sum()
|
||||
|
||||
private fun readGames(): List<Game> =
|
||||
File("src/main/resources/day2/input.txt")
|
||||
fun powerOfMinimumSetOfCubes(file: String) = readGames(file)
|
||||
.map(Game::powerOfHands)
|
||||
.sum()
|
||||
|
||||
private fun readGames(file: String): List<Game> =
|
||||
File(file)
|
||||
.readLines()
|
||||
.map(Game.Companion::parse)
|
||||
|
||||
}
|
||||
|
||||
data class Game(val id: Int, val hands: List<Hand>) {
|
||||
|
||||
fun isCompatibleWith(hand: Hand) =
|
||||
hand.fitsIn(
|
||||
hands.fold(Hand(0, 0, 0)) { currentMax: Hand, next: Hand ->
|
||||
Hand(
|
||||
maxOf(currentMax.red, next.red),
|
||||
maxOf(currentMax.green, next.green),
|
||||
maxOf(currentMax.blue, next.blue)
|
||||
)
|
||||
})
|
||||
hand.fitsIn(maxOfHands())
|
||||
|
||||
fun powerOfHands() = maxOfHands().let { it.red * it.green * it.blue }
|
||||
|
||||
private fun maxOfHands() = hands.fold(Hand(0, 0, 0)) { currentMax: Hand, next: Hand ->
|
||||
Hand(
|
||||
maxOf(currentMax.red, next.red),
|
||||
maxOf(currentMax.green, next.green),
|
||||
maxOf(currentMax.blue, next.blue)
|
||||
)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@@ -41,7 +49,7 @@ data class Game(val id: Int, val hands: List<Hand>) {
|
||||
}
|
||||
|
||||
|
||||
private val NUMBER_REGEX = Regex("\\d")
|
||||
private val NUMBER_REGEX = Regex("\\d+")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
package day3
|
||||
|
||||
import java.io.File
|
||||
|
||||
object Day3 {
|
||||
|
||||
fun sumOfSelectedParts(file: String): Int =
|
||||
readLines(file)
|
||||
.let { lines ->
|
||||
readParts(lines)
|
||||
.filter { parts -> parts.isSelected(lines) }
|
||||
}
|
||||
.sumOf { it.number }
|
||||
|
||||
fun readLines(file: String): List<String> =
|
||||
File(file)
|
||||
.readLines()
|
||||
|
||||
fun readParts(lines: List<String>): List<Part> =
|
||||
lines
|
||||
.flatMapIndexed<String, Part> { y, line ->
|
||||
line.foldIndexed(mutableListOf()) { x, parts, character ->
|
||||
when {
|
||||
character.isDigit() ->
|
||||
if (parts.lastOrNull()?.isIn(x, y) != true) {
|
||||
val number = STARTING_NUMBERS_REGEX.find(line.substring(x))!!.value
|
||||
parts.addLast(
|
||||
Part(
|
||||
number.toInt(),
|
||||
Coordinate(x, y),
|
||||
Coordinate(x + number.length - 1, y)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
parts
|
||||
}
|
||||
}
|
||||
|
||||
private val STARTING_NUMBERS_REGEX = Regex("""^\d+""")
|
||||
}
|
||||
|
||||
data class Part(val number: Int, val from: Coordinate, val to: Coordinate) {
|
||||
fun isIn(x: Int, y: Int): Boolean =
|
||||
x >= from.x
|
||||
&& x <= to.x
|
||||
&& y >= from.y
|
||||
&& y <= to.y
|
||||
|
||||
fun isSelected(engine: List<String>) =
|
||||
engine.hasSymbols(from.x - 1, from.y - 1, to.x - from.x + 1 + 2) // above
|
||||
|| engine.hasSymbols(from.x - 1, from.y + 1, to.x - from.x + 2) // below
|
||||
|| engine.hasSymbols(from.x - 1, from.y, 1) // left
|
||||
|| engine.hasSymbols(to.x + 1, from.y, 1) // right
|
||||
|
||||
}
|
||||
|
||||
private fun List<String>.hasSymbols(x: Int, y: Int, length: Int) =
|
||||
y > 0 && y < size - 1 && this[y].let { it.substring(maxOf(0, x), minOf(it.length, maxOf(0, x) + length)) }
|
||||
.any { !(it.isDigit() || it == '.') }
|
||||
|
||||
|
||||
data class Coordinate(val x: Int, val y: Int)
|
||||
@@ -1,5 +1,100 @@
|
||||
Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
|
||||
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
|
||||
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
|
||||
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
|
||||
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
|
||||
Game 1: 1 green, 2 red, 6 blue; 4 red, 1 green, 3 blue; 7 blue, 5 green; 6 blue, 2 red, 1 green
|
||||
Game 2: 1 green, 17 red; 1 blue, 6 red, 7 green; 2 blue, 4 red, 7 green; 1 green, 6 red, 2 blue
|
||||
Game 3: 6 red, 15 blue, 15 green; 1 green, 4 red, 12 blue; 14 blue, 9 red, 1 green; 2 red, 15 blue, 12 green
|
||||
Game 4: 8 green, 10 blue, 6 red; 20 blue, 4 red; 17 blue, 2 green, 3 red; 4 blue, 2 green, 3 red; 10 red, 3 blue, 3 green; 5 green, 14 blue, 6 red
|
||||
Game 5: 3 green, 8 blue, 2 red; 11 red, 6 green, 11 blue; 8 red, 5 blue, 2 green
|
||||
Game 6: 2 blue, 12 red, 2 green; 3 green, 2 red; 3 green, 3 blue, 10 red; 7 red, 2 blue, 4 green; 1 red, 2 blue, 5 green
|
||||
Game 7: 1 red, 8 blue, 2 green; 1 red, 2 blue, 12 green; 1 blue; 3 blue, 3 green
|
||||
Game 8: 10 green, 4 red, 4 blue; 12 green, 1 blue; 1 red, 13 green, 2 blue; 12 green, 3 blue; 9 green, 7 red
|
||||
Game 9: 1 green, 1 blue, 3 red; 3 blue, 3 red, 8 green; 6 blue, 4 red, 6 green; 2 red, 7 green; 1 red, 10 green, 13 blue; 5 red, 1 blue, 1 green
|
||||
Game 10: 9 green, 3 red, 3 blue; 12 green, 2 blue; 18 green, 1 blue; 14 green; 2 blue, 9 green, 2 red
|
||||
Game 11: 14 green; 2 green, 2 red, 11 blue; 9 blue, 3 green
|
||||
Game 12: 9 green, 3 blue, 8 red; 1 green, 2 blue, 3 red; 4 blue, 8 red, 10 green; 3 blue, 7 red, 8 green; 3 blue, 5 red, 7 green; 2 blue, 5 green
|
||||
Game 13: 6 red, 1 blue, 10 green; 7 red, 1 green; 8 red, 2 green, 1 blue
|
||||
Game 14: 2 red, 4 blue, 2 green; 2 green, 5 red, 1 blue; 1 red, 6 blue
|
||||
Game 15: 7 blue, 3 red; 13 blue, 8 red, 1 green; 1 green, 5 red, 13 blue; 8 red, 5 blue; 4 red, 3 blue, 1 green; 12 blue, 8 red, 1 green
|
||||
Game 16: 5 blue, 1 green, 2 red; 2 blue, 20 green; 4 blue, 1 red, 17 green; 10 green, 5 blue, 2 red
|
||||
Game 17: 6 red, 13 blue, 8 green; 12 blue, 7 green, 9 red; 19 blue, 5 red; 2 green, 8 red, 14 blue
|
||||
Game 18: 5 red, 2 green, 1 blue; 8 blue, 17 red, 9 green; 2 blue, 1 green; 4 blue, 10 red; 5 blue, 4 red, 6 green
|
||||
Game 19: 5 red, 12 green; 8 red, 13 green, 1 blue; 1 red, 1 green, 3 blue; 5 green, 5 red
|
||||
Game 20: 11 red, 8 blue; 9 red, 2 green, 13 blue; 2 red, 1 green, 2 blue; 1 green, 9 blue, 13 red; 3 blue, 5 red, 1 green
|
||||
Game 21: 1 red, 4 green, 11 blue; 3 green, 15 blue; 6 green, 7 red, 14 blue; 15 blue, 6 green, 10 red; 6 red, 16 blue, 2 green
|
||||
Game 22: 2 blue, 15 green, 2 red; 3 blue, 6 green, 1 red; 2 blue, 5 green, 1 red; 6 green, 2 red, 2 blue; 4 green, 2 blue; 4 blue, 1 red, 15 green
|
||||
Game 23: 2 blue, 1 green, 12 red; 5 blue, 11 red, 4 green; 12 red, 4 blue; 12 red, 2 green, 5 blue
|
||||
Game 24: 4 blue, 7 red; 3 red, 3 blue; 1 red, 4 blue; 2 green, 6 red, 6 blue; 7 red, 1 green, 2 blue; 6 red, 1 blue, 1 green
|
||||
Game 25: 5 green, 9 blue; 6 green, 7 red, 2 blue; 1 red, 3 blue, 7 green; 9 blue, 3 red; 5 green, 9 blue, 2 red
|
||||
Game 26: 6 red, 4 blue; 2 blue, 4 green; 3 green, 5 red, 5 blue; 4 green, 6 red, 3 blue; 4 green, 7 red, 4 blue
|
||||
Game 27: 15 green, 1 blue, 12 red; 12 red, 1 green; 1 red, 1 blue, 5 green; 13 green, 6 red, 1 blue; 5 red, 1 blue, 1 green; 11 red, 14 green
|
||||
Game 28: 3 blue, 2 green, 10 red; 5 blue, 2 green; 4 green, 3 blue, 11 red
|
||||
Game 29: 10 blue, 2 red; 17 green, 7 blue, 2 red; 1 blue, 8 green, 1 red; 10 green, 2 red, 3 blue
|
||||
Game 30: 10 green, 8 red, 1 blue; 4 blue, 7 green, 14 red; 2 blue, 14 red, 11 green; 1 blue, 13 green, 12 red; 5 blue, 2 red, 4 green; 4 green, 5 red
|
||||
Game 31: 4 green, 11 red, 11 blue; 3 blue, 11 red; 5 blue, 7 red, 3 green; 10 blue, 5 green, 1 red
|
||||
Game 32: 4 red, 8 blue, 1 green; 14 red, 7 blue, 4 green; 13 red, 3 blue, 9 green; 3 red, 1 green, 8 blue; 8 green, 8 red, 5 blue
|
||||
Game 33: 6 red, 10 blue, 7 green; 19 blue, 1 red; 6 green, 11 red, 11 blue; 2 green, 2 blue, 12 red; 3 red, 13 blue, 7 green; 6 green, 4 red, 2 blue
|
||||
Game 34: 3 red, 3 green, 15 blue; 7 green, 15 blue; 3 red, 2 green, 8 blue; 19 green, 18 blue
|
||||
Game 35: 2 green, 1 blue; 2 green, 2 blue, 1 red; 3 blue, 1 red, 1 green; 4 blue, 1 red
|
||||
Game 36: 1 red, 11 green; 1 green, 1 blue; 8 blue; 2 green, 3 red; 1 red
|
||||
Game 37: 4 blue, 3 red; 12 blue, 13 red; 2 red, 2 green, 8 blue
|
||||
Game 38: 8 red, 2 blue; 1 green, 2 red; 8 red, 2 green, 1 blue; 16 red, 2 green; 7 red, 2 blue, 2 green
|
||||
Game 39: 6 green, 1 blue, 5 red; 14 green, 8 blue, 6 red; 8 red, 10 blue, 1 green; 14 green, 9 red; 17 blue, 5 red; 1 blue, 7 green, 1 red
|
||||
Game 40: 4 red, 8 blue, 3 green; 13 blue, 1 red; 3 blue, 7 red, 3 green; 3 green, 8 blue, 10 red; 3 green, 20 blue, 5 red
|
||||
Game 41: 1 blue, 2 green; 11 green, 2 blue; 5 blue; 15 red, 8 green, 5 blue
|
||||
Game 42: 1 green, 12 blue, 1 red; 6 blue, 1 green, 5 red; 1 red, 11 blue, 4 green; 3 red, 17 blue, 1 green; 1 red, 11 blue; 9 blue, 6 green, 3 red
|
||||
Game 43: 16 blue, 13 green, 1 red; 17 blue, 7 red, 10 green; 13 green, 5 red, 7 blue
|
||||
Game 44: 2 blue, 4 red; 15 green, 7 red; 2 green, 1 blue; 6 red, 13 green
|
||||
Game 45: 5 green, 1 blue, 8 red; 4 red, 1 blue, 5 green; 1 green, 3 red; 1 green, 2 blue, 6 red; 4 red, 3 green, 2 blue; 2 red, 2 blue, 5 green
|
||||
Game 46: 1 green, 1 red, 6 blue; 11 blue; 1 red, 1 green, 7 blue; 8 blue; 1 green, 7 blue, 2 red
|
||||
Game 47: 7 green, 9 blue, 7 red; 11 red, 13 blue, 5 green; 12 green, 12 blue, 5 red; 4 blue, 8 green, 7 red
|
||||
Game 48: 11 green, 7 red, 2 blue; 2 blue, 10 green, 3 red; 1 blue, 2 red, 1 green; 4 green, 2 red, 7 blue; 7 red, 4 green, 2 blue
|
||||
Game 49: 1 red, 2 blue, 5 green; 2 green, 4 blue; 5 blue, 2 green, 1 red; 9 blue, 1 green; 7 blue
|
||||
Game 50: 8 green, 9 blue, 2 red; 2 green, 5 blue; 14 green, 1 red, 8 blue
|
||||
Game 51: 1 green, 2 blue; 12 blue, 1 red; 2 blue
|
||||
Game 52: 3 red, 2 blue, 2 green; 4 red, 4 green, 7 blue; 2 blue, 4 red, 1 green; 3 green; 1 red, 9 green, 7 blue
|
||||
Game 53: 9 blue, 12 red, 7 green; 8 blue, 6 green; 1 green, 8 blue, 9 red; 12 red, 6 green; 9 blue, 14 red, 10 green; 7 red, 3 green, 5 blue
|
||||
Game 54: 8 green, 5 blue, 5 red; 4 green, 13 blue, 2 red; 2 blue, 5 red, 1 green; 3 red, 3 green, 10 blue
|
||||
Game 55: 17 red, 15 green, 17 blue; 6 red, 5 green, 7 blue; 17 green, 6 blue, 5 red
|
||||
Game 56: 7 blue, 6 red, 7 green; 10 green, 3 red; 9 red, 3 blue, 5 green
|
||||
Game 57: 5 blue, 11 red, 1 green; 13 red, 1 green, 2 blue; 2 blue, 4 red; 1 green, 10 red, 1 blue; 1 green, 8 red
|
||||
Game 58: 1 red, 2 green, 9 blue; 1 green, 1 blue, 1 red; 2 red, 6 blue, 2 green; 14 blue, 1 green, 1 red; 5 blue, 1 red, 2 green; 14 blue, 2 green
|
||||
Game 59: 9 green, 2 blue, 5 red; 9 red, 5 green; 10 red, 1 blue, 8 green
|
||||
Game 60: 8 blue, 6 red, 4 green; 3 red, 12 green, 9 blue; 4 blue, 5 red, 5 green; 4 red, 8 blue; 7 green, 12 blue, 6 red
|
||||
Game 61: 5 blue, 13 red, 1 green; 5 red, 5 blue; 1 red, 3 blue; 1 green, 9 red; 10 red, 3 blue, 1 green
|
||||
Game 62: 1 blue, 13 red; 4 blue, 5 red; 11 blue, 8 red, 1 green
|
||||
Game 63: 14 blue, 5 red; 9 blue, 14 green, 5 red; 3 red, 8 green, 15 blue; 4 blue, 15 green, 6 red
|
||||
Game 64: 13 red, 6 blue, 11 green; 12 red, 1 blue, 8 green; 1 red, 17 green; 13 red, 12 green, 7 blue
|
||||
Game 65: 4 red, 17 blue, 3 green; 2 green, 12 blue, 9 red; 2 green, 17 blue, 5 red; 1 red, 1 green, 4 blue; 9 red, 16 blue; 7 blue, 9 red
|
||||
Game 66: 10 blue, 10 green, 5 red; 10 green, 3 blue, 5 red; 1 red, 1 green, 10 blue; 2 green, 5 red, 20 blue; 8 blue, 11 green, 13 red; 2 green, 18 blue, 2 red
|
||||
Game 67: 6 red, 1 green; 5 red, 10 blue; 6 blue, 6 red
|
||||
Game 68: 4 green, 1 red, 5 blue; 5 red, 5 blue; 7 red, 6 green; 8 red, 1 blue
|
||||
Game 69: 2 blue, 11 red; 4 red, 6 green, 1 blue; 4 red, 1 blue, 14 green
|
||||
Game 70: 15 red, 8 blue, 5 green; 5 green, 2 red, 8 blue; 8 red, 3 green, 10 blue
|
||||
Game 71: 4 blue, 2 red; 12 green, 4 blue; 10 green
|
||||
Game 72: 3 blue, 4 green, 6 red; 6 red, 5 green, 8 blue; 10 red, 6 green, 5 blue; 1 green, 2 blue; 10 red, 5 blue, 4 green
|
||||
Game 73: 5 blue, 1 red; 1 green, 11 blue; 10 blue; 12 blue, 1 red; 1 red, 9 blue; 7 blue, 1 green, 1 red
|
||||
Game 74: 7 green, 6 blue, 7 red; 7 blue, 6 green, 15 red; 7 red, 5 blue, 1 green; 1 blue, 6 red, 8 green; 8 green, 14 red, 3 blue
|
||||
Game 75: 8 green, 3 red, 3 blue; 1 blue, 6 red, 7 green; 9 green, 3 blue; 3 blue, 9 green, 6 red; 4 blue, 1 red, 3 green; 4 green, 1 blue, 16 red
|
||||
Game 76: 4 blue, 3 green; 2 blue, 1 red, 6 green; 12 blue; 1 green, 14 blue
|
||||
Game 77: 5 green, 10 red, 11 blue; 3 red; 8 green, 6 red, 9 blue
|
||||
Game 78: 7 red, 7 green; 8 blue; 6 green, 7 red, 5 blue
|
||||
Game 79: 11 blue, 2 red, 4 green; 2 green, 3 red, 15 blue; 1 green, 15 blue, 1 red
|
||||
Game 80: 3 red, 17 green, 8 blue; 8 green, 10 blue; 4 green, 1 red, 14 blue
|
||||
Game 81: 17 green, 10 red, 10 blue; 9 green, 9 blue, 7 red; 11 red, 11 green, 4 blue; 15 blue, 5 red; 11 blue, 8 green, 15 red; 3 green, 16 red
|
||||
Game 82: 8 green, 9 blue, 1 red; 1 red, 8 green, 9 blue; 2 green, 12 blue
|
||||
Game 83: 2 green, 11 red, 20 blue; 20 blue, 1 green, 4 red; 2 green, 6 red, 20 blue; 17 blue, 10 red
|
||||
Game 84: 1 green, 9 red; 4 blue, 4 green; 1 green, 6 red, 14 blue
|
||||
Game 85: 5 red, 10 green, 9 blue; 8 blue, 3 green, 2 red; 4 blue, 14 green, 3 red; 5 red, 4 blue
|
||||
Game 86: 8 blue, 9 green, 5 red; 5 red, 10 green, 1 blue; 15 blue, 1 red, 2 green; 8 red, 8 blue, 10 green
|
||||
Game 87: 13 green, 2 red, 4 blue; 3 red, 11 green, 9 blue; 6 blue, 3 red, 12 green
|
||||
Game 88: 2 red, 7 blue, 3 green; 2 blue, 9 red; 9 red, 6 blue, 7 green; 6 green, 13 blue, 9 red; 6 green, 2 red, 15 blue; 1 red, 8 green, 7 blue
|
||||
Game 89: 11 red, 1 blue, 2 green; 6 blue, 5 green, 4 red; 15 red, 4 green, 5 blue; 11 red, 3 blue, 10 green; 6 blue, 13 green, 12 red
|
||||
Game 90: 2 red, 2 blue, 4 green; 2 red, 2 blue; 9 green, 1 red, 1 blue; 5 green, 1 red; 7 green, 2 red; 2 green, 1 blue
|
||||
Game 91: 5 blue, 3 red, 1 green; 1 red, 4 blue, 6 green; 6 blue, 6 green, 5 red
|
||||
Game 92: 16 green, 1 blue, 12 red; 18 green, 14 red, 1 blue; 16 red, 1 green; 4 blue, 16 red, 18 green
|
||||
Game 93: 9 red, 8 blue, 14 green; 1 blue, 1 green, 6 red; 4 blue, 4 red, 14 green
|
||||
Game 94: 11 green, 4 blue, 2 red; 1 red, 1 green, 1 blue; 4 red, 1 blue, 2 green
|
||||
Game 95: 5 blue, 2 red, 9 green; 5 blue, 8 green; 1 green, 15 blue; 5 red, 9 green, 5 blue; 3 green, 17 blue, 5 red
|
||||
Game 96: 2 green, 14 blue, 1 red; 3 green, 3 red, 14 blue; 2 red, 2 green, 13 blue
|
||||
Game 97: 2 green, 2 red; 2 blue, 1 green; 7 blue, 3 red
|
||||
Game 98: 2 red, 1 blue, 12 green; 2 blue, 10 green, 5 red; 11 green, 9 blue; 6 blue, 17 green; 7 blue, 9 green, 9 red; 1 red, 11 green, 9 blue
|
||||
Game 99: 2 green, 9 red, 1 blue; 3 green, 1 blue, 14 red; 5 green, 6 blue; 1 blue, 2 green, 3 red; 4 blue, 10 red, 1 green
|
||||
Game 100: 4 green, 4 blue, 15 red; 3 green, 1 red, 13 blue; 5 green, 5 blue, 10 red
|
||||
@@ -0,0 +1,30 @@
|
||||
--- Day 3: Gear Ratios ---
|
||||
|
||||
You and the Elf eventually reach a gondola lift station; he says the gondola lift will take you up to the water source, but this is as far as he can bring you. You go inside.
|
||||
|
||||
It doesn't take long to find the gondolas, but there seems to be a problem: they're not moving.
|
||||
|
||||
"Aaah!"
|
||||
|
||||
You turn around to see a slightly-greasy Elf with a wrench and a look of surprise. "Sorry, I wasn't expecting anyone! The gondola lift isn't working right now; it'll still be a while before I can fix it." You offer to help.
|
||||
|
||||
The engineer explains that an engine part seems to be missing from the engine, but nobody can figure out which one. If you can add up all the part numbers in the engine schematic, it should be easy to work out which part is missing.
|
||||
|
||||
The engine schematic (your puzzle input) consists of a visual representation of the engine. There are lots of numbers and symbols you don't really understand, but apparently any number adjacent to a symbol, even diagonally, is a "part number" and should be included in your sum. (Periods (.) do not count as a symbol.)
|
||||
|
||||
Here is an example engine schematic:
|
||||
|
||||
467..114..
|
||||
...*......
|
||||
..35..633.
|
||||
......#...
|
||||
617*......
|
||||
.....+.58.
|
||||
..592.....
|
||||
......755.
|
||||
...$.*....
|
||||
.664.598..
|
||||
|
||||
In this schematic, two numbers are not part numbers because they are not adjacent to a symbol: 114 (top right) and 58 (middle right). Every other number is adjacent to a symbol and so is a part number; their sum is 4361.
|
||||
|
||||
Of course, the actual engine schematic is much larger. What is the sum of all of the part numbers in the engine schematic?
|
||||
@@ -0,0 +1,140 @@
|
||||
..224.....487...................718.....................378............................................284........310......313..........311.
|
||||
....*..............................*744....486*485......*......741......@...359.#666...439................*925....*......$..+........@......
|
||||
.235................758..440...........................251....*......262.....*..........*......................752......774.......515.......
|
||||
.........705%..@746........+..942*591.347.470...#..257.........637...........793.......299..../.....813....509......464......&.........688..
|
||||
.....82................................*.../..901.....*..................836.....&............814...*........*..............80...17*....*...
|
||||
.../...*...679.661.....299...........222.............875.....213...161............964...894.........998.....310....258.85...........735.586.
|
||||
.650..23..#......*.......................................760*........@./........................202...................*.....339.............
|
||||
..............598......#.....536....702*.........705..........793......957............./........*...935...........965.......................
|
||||
..................*.357...+.....@.......242.......*......283..*...=956.......118.......959...184...*..............*....401*527.....348...161
|
||||
.63=...955.523..77......978.846....849..........699..........790........=911.*.....87...............486.........914..............=..........
|
||||
.........*.........842......*.......*..................*127....................844...*....946.......................235...209@...710.735....
|
||||
...........@.........*.....144....226....298........560.....253.........431......*...586.......723..../...482.......&...................*...
|
||||
...........871../918........................+....................329*......%.....906.............*...350.....@...............365.......361..
|
||||
......................536............................+..793..........664.....739................507......289.....256%...73..*...............
|
||||
.356..834..............*.........96.939..............28.+....=..............*...........................*................$.553..........526.
|
||||
...*...*.............501..746....*..-.......=.................890.....+...701..............807........447......97$..%...........58......$...
|
||||
.891....346...699...........*.421......+....666......198*791......340.433............#...%...*.......................316........*.....%.....
|
||||
..............%........81.984...........462....................../..........116...711....963...$................380.......745...85....224...
|
||||
.........370......923..@.....................563...........188+.........326*...................67.815..............*582.....................
|
||||
.........*........-........#530.........489........59...................................................#.....57.........100.*.......441*161
|
||||
.637*....961...........118...........21*...........@..216+.........................+....432*.*309..64....992.......81......=.781.644........
|
||||
.....324.........126......*166...............&...................385*..............233............*................*..436...........*517....
|
||||
.88*.........390*................355..335...372....+254..............294...$589........&..803/.....38..-...........56..$....................
|
||||
....235.-.........+196...948....*........-................359.........................398.............608..../.................145..346.....
|
||||
........915.................-.485.945.................936*................114.............118...............490.536..............*.%........
|
||||
.663........61.......856..........+....343....859...............*345.......*...=862............711.............................313.....606..
|
||||
........23...$.....@..................*......................316.....529.362.............49......................307*791....................
|
||||
225...............281...#..222.....@..283..............675............*.........911*90..-.....914..%39....509...............................
|
||||
.......797*....$........23..../...895.............67.......164.896.....554.....................*............=..............460........181...
|
||||
...........211.474...............................@...........*....*201..........911.717.#....192.75..679...........$.........*.........=....
|
||||
....355.........................&.....................678.650......................*.....128.....*.....*.........925..230...105.............
|
||||
....*.......409#.......*897.....698....427.........+....*.......*...............................313...670..521.......*....&.............*308
|
||||
...838..335.................367........-..........325....233...224...950......688.....199.774.........................793.108........501....
|
||||
...........*..102..924.349...+..595....................................*................&..............395+.....................753.........
|
||||
.........318...*......*........*....676...759.154...................524...........908.........694.211................173...........*214..424
|
||||
....458........403...........958.98....*........*..............688......957...488..+...........*.../....................................*...
|
||||
.......*.............591...............218.....203.....196$.......+....*........*......................765......971......./....927*741..227.
|
||||
......592..%60.$.....*.....885/....287...............................474.........409......226.174.......@........*.....230..................
|
||||
...............162.169.................510..962..............17......................32@..*...*.................225....................-....
|
||||
.....880...................201.....823*........*...914.724.........89...&.......267=.....717.54.436..........60...............&.........69..
|
||||
710........601....306.287.....+.........65...308....&...=.../......*.....926..................................*........278.415......-.......
|
||||
..............*..*......&..........241.%...................827../.265.............662.678......@...#......@.....$......-............734.144.
|
||||
.............424..434.....701.....*........380*731.............24.................*...&........973..741....728..357.........................
|
||||
........304.................*...881................238.....740.........947........587...22...........................271*........603....@...
|
||||
...................266.....918....................*..........+.519.617..*...826..........*............./268..974.........486.376....*.295...
|
||||
...939.........363.*...............378..........302....586........*....740...=..........380........931...........................12.........
|
||||
...*..........-.....387...............*..588..............*..../...............315...................-...712..491.........956.....#.........
|
||||
.180.454...................104..661...91...*.............811....370......471...-....419....804..........*...................*...............
|
||||
.....*.......@../464........%..*............243.....578...................&..........*...........604..250.....784....750....998.............
|
||||
.....245....165.................771...................&.......#.691...768....654....261.........................*.......*............566....
|
||||
441..................91.....194.......643...932*............379.#....$.......*.................86.............940..263.638...........*......
|
||||
...+.............%.../.......#.........*........344...795..................991..........544....*..................*..........767...266......
|
||||
.......-..708..727.....191$......*.....698....=...................990................+.....*....308.......@......325.........*.........44...
|
||||
...18.397....=.....93.........649.900.........62....-........322.....*.......@......339....619..........404..........540........./....*.....
|
||||
..../...............%............................742............*...........196................874.205........96#..............203.224......
|
||||
.........704...727.................496.......*........135....769........./.................%....&....*.../..=.........757...................
|
||||
........*........*..424..........&........714.5........*...........@....884...............114.......674.144..83..........*302...........%...
|
||||
........29....179..*............104..................531....629.455..................473......300....................254..............640...
|
||||
..................296.......................................................1........*.......%..............548........*.....103............
|
||||
....381...........................365#..713.282.......%744....................../....709...#...=...431...$.*......*.....837.....*9.....*....
|
||||
......*.90.....347.179#...................%.......359..........92............304...*.....923.446.......385.699.....749..............193.206.
|
||||
....922.+.......*.......-197.....................*.......128........273....@.....758..............439...................650*54.736#.........
|
||||
................817..-..........152..594..949..807.......$...224...*.....124............889.......=...................................625...
|
||||
....139....667......239........*...........*.......387........%..806........../...........*..788....632...........=8......584-......*.%.....
|
||||
...........*.................280...........11.........*726............181......761..-....66.....%....-................64...........14.......
|
||||
............742.736.725..........708.667..........332.......828*750......-.........425.......................944.....*...................926
|
||||
.719...110...........*.....348...=..........121......*........................................*.......961.....*.......971...........+.......
|
||||
..../.....*629........830..*............91....&..241..491...930............561................889....*....710.333..............163...311....
|
||||
......%...................252.../..................*...........*270.......................165.....208.......*..................../.......694
|
||||
...914...126...267.183........952..$645......414.822................................69.......-..........=..112.464..267....359..........*...
|
||||
.............7*..........................806.../.....931.....*.....355..............*....928...........854.........-..............*993...101
|
||||
439.897...........%...........8......381...*........*....748..987....*............437.......*....954.......................*................
|
||||
.......*595....783........49.....110.$...675...8...60.....=........981........&..........730....*.............336.......120.790..........386
|
||||
............90..............*212...*..........*.......985.....153........*..12...912*383......665.....754.....-.....................950.....
|
||||
......790#.*........896@.........773....777..581..514*....910.....5.....579.............................=.......#.....................*.....
|
||||
...&.......496...........347..............*...............*...................../............................790..............334......912..
|
||||
692............609....&.......694..........693...213....620......695......871..385.......82..........785.......................*..163.......
|
||||
.........#....*......984.........*.................=............*.......................................*.545...-............978.....*......
|
||||
......971...477.............465......196*313..........447.......766......49.......126*480.............798......792..359*193...........837...
|
||||
................157...........+..................773.=..............752$....................447*565..........................*53............
|
||||
.384%..........@.........449............470..749...@.........@792..............138..527.......................339.....299.505...........287.
|
||||
......691........700........@......96..........*........721*.....................@....*...942......845........*......-.........713..........
|
||||
.....*......260/...*...........................491..452.....336.......................73....+..960..........238...........163$..&...=.@.....
|
||||
....689.............831...282....709.960.............=.............204............................#..............59...97..........199..111..
|
||||
........................$........../........-....498......................557....&...........972............450.............................
|
||||
.............653........476...398.........619...*.....*280..923..............*31..691.........*........=...*.....67......782................
|
||||
..............*....%..........*.........+......268...........&........428....................408....740....576....*.......*.........$.......
|
||||
....-../...734......317.114.332...795...743.........................-..=..908...........381.......................914...420.*647....528.....
|
||||
..284.825...............*......................721/.=929.........324.....*....167.561...*.....815*466.......................................
|
||||
..............389..304.480.......851..@....585..............942%......#.496....*....-.53................170....938*..........518............
|
||||
........368..*.....@..............*....941..+.......*...............930.........364.......522......................59.........+....$....652.
|
||||
...........+.963...................949...........828.784......860............*......420.....*..................*......548...........310.*...
|
||||
.....476...............*...............=...94.+..................&........589.833....*..426.940.....&.....959.993.&88....................398
|
||||
.......*................624....917...838..*...664.......721........................833...$.......672......$............19...................
|
||||
....350.......................&....=..............333.................707....................................240..336....=...746.263..$463..
|
||||
.........................-.........220.....663...../.............*849..#..631.....712....=.../...308.580.............*..........*...........
|
||||
.78@......../..........422....444.............*...............281............*...*....447..37.......*................814....................
|
||||
........./...788...810.........&..............369..985....-................92................................684...............74...........
|
||||
......279.........*......128/....464........#...../......944........978...............163..984*5.@............+.......165......*....285.....
|
||||
..................889.............*.......969........................%.......5......&....$........272....................*......374.........
|
||||
.........&..............@948..*..13.358........796.............632............*....789........91*..............*66........152...............
|
||||
........508...+..............3...........544.....$.517.....703....*774.......434............/....794........932.............................
|
||||
...$...........241.....74...........974..*...954............*.......................375..772...........218.........414...........*366....252
|
||||
.501..566...............*..........*....599.....#........256.....468@..942.101.........*..........156...*.............*.......998...........
|
||||
...../.............263.312....+..767..............#.........................*...&95..838.162=.....+....130.........583..544.......176.......
|
||||
............................936......826.......421.......-139.......982...893.......................*..................*........./..........
|
||||
.284.....=724...................661.$....694........85..........438.............51...............616.698.*36.....262......357+........224...
|
||||
....@..........491........+........................@......193......*596...........%../844...387.................$.....132.........%.........
|
||||
.......84..............362.................................*..98..........&................*....14....394..........$..............56........
|
||||
.........*432.....512................704......424.............*............74........196%..875...*.....*............132.......229...........
|
||||
..............723*.........568........*..108........672......55.172...217.........................289.427........................*..........
|
||||
.........#795.........214....*.336...94....*....988................%..&.............*86......*...............838&.......540.......902.......
|
||||
.922...........288........719.....*........845...&..558......#...................524......195.704.....................................77....
|
||||
...*....842....../...166........883...-................*503..451..305../....600............................900..280.....*169...586..........
|
||||
751....*.........../.*......944......116....416.........................877....*....418...194........644..*....=.....244..........#.....354.
|
||||
.......118......208...................................788...................826........$....$...207.....@..152...........893*608.......&....
|
||||
..948.......................203../....206.............*....341./977.916.........49...#........@....-............+385........................
|
||||
...*......266.................*...607...@.990......964..............-..........*.....340...697........62..............526.....-.............
|
||||
..675.....*..........612....604.............*..............492.884...........212...............*157....*...679.........*....706...716%.518..
|
||||
......103.749..989...*...................739..............$......=..=..................212..684.....35.......*.........785..............+...
|
||||
..343*......../.......680.....................*423.................476....&....420..............241..*......532.....+.......864$.....&......
|
||||
..................826........403..311...60.451.............+...........562....../.......306.......*..............420..................321...
|
||||
...241..............*...........+..=....@......*240.......845....@.........740.................968..389.177*...................640..........
|
||||
......*82...........963...211%...............38...............901.....404.........&..253..............-.....37.........218.501...*....320...
|
||||
....*...........................#215...264......298........................*970..801....*....569...............3.......*......%..859.*......
|
||||
.136.818...212...........91*72........*.........-...750.....775*728.29.270...............984.&...371..........*.........639..........670....
|
||||
...........*.../959................438.....524......*...943.........*................755...................162.................446#.........
|
||||
..........290.............751................*.....557..*...483.............421.........*............189.%................/.................
|
||||
....................9.786..-......835.......978........445.%..........350........860..662.......#...*....354........*.....682...............
|
||||
.117..57+....441...*....+............................................../............*.........88....142..........%.927......................
|
||||
...*...........*..402....................874.....734.926$../...............*633......219.84/............662...205...................334.....
|
||||
...981........367........338...332/.........=......*......119....375#.334.......146..............%.....$................384.............-511
|
||||
........165................=....................666.....................#..614.....-..%744..617.887.......848*..............................
|
||||
...........*.203.593...158....*..........152..............+817.....866.......&...............*......../.......904........701.165.80.........
|
||||
404..977.93..*....*....*...396.281......*....953....*................*.........116..97.70=..179....107..338................$...*....622.....
|
||||
......=.....445........................382.....*...672................859......*...%....................&..........-.571......717....*......
|
||||
..................240............175..........808..............225..........988............/604..............232.448..*..651......769.......
|
||||
.........569*....*........975*.....*....968..............585.....*................26.................................394....@.142...........
|
||||
......*......498..969.........360.666...%.........................919.......360........-.*.........%...................................484..
|
||||
...407................886...................................84......................933...101....58........839..425.........................
|
||||
@@ -5,7 +5,12 @@ import org.junit.jupiter.api.Test
|
||||
class Day2Test {
|
||||
|
||||
@Test
|
||||
fun readGames() {
|
||||
assert(Day2.sumOfCompatibleGames(Hand(12, 13, 14)) == 8)
|
||||
fun sumOfCompatibleGames() {
|
||||
assert(Day2.sumOfCompatibleGames("src/test/resources/day2/input.txt", Hand(12, 13, 14)) == 8)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun powerOfMinimumSetOfCubes() {
|
||||
assert(Day2.powerOfMinimumSetOfCubes("src/test/resources/day2/input.txt") == 2286)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package day3
|
||||
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.Test
|
||||
import kotlin.test.assertContentEquals
|
||||
|
||||
class Day3Test {
|
||||
|
||||
@Test
|
||||
fun readParts() {
|
||||
assertEquals(4361, Day3.sumOfSelectedParts("src/test/resources/day3/input.txt"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testReadParts() {
|
||||
assertContentEquals(
|
||||
listOf(467, 114, 35, 633, 617, 58, 592, 755, 664, 598),
|
||||
Day3.readParts(Day3.readLines("src/test/resources/day3/input.txt")).map(Part::number)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testOnly114And58DropOut() {
|
||||
assertContentEquals(
|
||||
listOf(467, 35, 633, 617, 592, 755, 664, 598),
|
||||
Day3.readLines("src/test/resources/day3/input.txt").let { lines ->
|
||||
Day3.readParts(lines).filter { part -> part.isSelected(lines) }.map(Part::number)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
|
||||
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
|
||||
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
|
||||
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
|
||||
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
|
||||
@@ -0,0 +1,10 @@
|
||||
467..114..
|
||||
...*......
|
||||
..35..633.
|
||||
......#...
|
||||
617*......
|
||||
.....+.58.
|
||||
..592.....
|
||||
......755.
|
||||
...$.*....
|
||||
.664.598..
|
||||
Reference in new issue
Block a user