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 day1.Day1
|
||||||
|
import day2.Day2
|
||||||
|
import day2.Hand
|
||||||
|
import day3.Day3
|
||||||
|
|
||||||
fun main() {
|
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 {
|
object Day2 {
|
||||||
|
|
||||||
fun sumOfCompatibleGames(hand: Hand) = readGames()
|
fun sumOfCompatibleGames(file: String, hand: Hand) = readGames(file)
|
||||||
.filter { it.isCompatibleWith(hand) }
|
.filter { it.isCompatibleWith(hand) }
|
||||||
.map(Game::id)
|
.map(Game::id)
|
||||||
.sum()
|
.sum()
|
||||||
|
|
||||||
private fun readGames(): List<Game> =
|
fun powerOfMinimumSetOfCubes(file: String) = readGames(file)
|
||||||
File("src/main/resources/day2/input.txt")
|
.map(Game::powerOfHands)
|
||||||
|
.sum()
|
||||||
|
|
||||||
|
private fun readGames(file: String): List<Game> =
|
||||||
|
File(file)
|
||||||
.readLines()
|
.readLines()
|
||||||
.map(Game.Companion::parse)
|
.map(Game.Companion::parse)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data class Game(val id: Int, val hands: List<Hand>) {
|
data class Game(val id: Int, val hands: List<Hand>) {
|
||||||
|
|
||||||
fun isCompatibleWith(hand: Hand) =
|
fun isCompatibleWith(hand: Hand) =
|
||||||
hand.fitsIn(
|
hand.fitsIn(maxOfHands())
|
||||||
hands.fold(Hand(0, 0, 0)) { currentMax: Hand, next: Hand ->
|
|
||||||
Hand(
|
fun powerOfHands() = maxOfHands().let { it.red * it.green * it.blue }
|
||||||
maxOf(currentMax.red, next.red),
|
|
||||||
maxOf(currentMax.green, next.green),
|
private fun maxOfHands() = hands.fold(Hand(0, 0, 0)) { currentMax: Hand, next: Hand ->
|
||||||
maxOf(currentMax.blue, next.blue)
|
Hand(
|
||||||
)
|
maxOf(currentMax.red, next.red),
|
||||||
})
|
maxOf(currentMax.green, next.green),
|
||||||
|
maxOf(currentMax.blue, next.blue)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
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 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 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
|
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: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
|
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: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
|
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: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
|
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 {
|
class Day2Test {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun readGames() {
|
fun sumOfCompatibleGames() {
|
||||||
assert(Day2.sumOfCompatibleGames(Hand(12, 13, 14)) == 8)
|
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