73 lines
2.0 KiB
Kotlin
73 lines
2.0 KiB
Kotlin
import java.awt.Point
|
|
import java.io.File
|
|
|
|
fun main() {
|
|
val input = File("Input.txt").readLines()
|
|
var sum = 0
|
|
val numbers = ArrayList<PartNumber>()
|
|
input.forEachIndexed { indexY, line ->
|
|
var isDigitFlag = 0
|
|
var startIndex = 0
|
|
var number = ""
|
|
line.forEachIndexed { indexX, c: Char ->
|
|
if (c.isDigit()) {
|
|
if (isDigitFlag == 0) {
|
|
startIndex = indexX
|
|
}
|
|
number += c
|
|
isDigitFlag = 1
|
|
} else if (isDigitFlag == 1) {
|
|
isDigitFlag = -1
|
|
}
|
|
if (isDigitFlag == -1) {
|
|
numbers.add(PartNumber(number.toInt(), indexY, startIndex, indexX - 1))
|
|
number = ""
|
|
isDigitFlag = 0
|
|
}
|
|
}
|
|
}
|
|
val symbols = ArrayList<Point>()
|
|
input.forEachIndexed { y, line ->
|
|
line.forEachIndexed { x, c ->
|
|
if (!c.isDigit() && c != '.') {
|
|
symbols.add(Point(x, y))
|
|
}
|
|
}
|
|
}
|
|
|
|
symbols.forEach { cord ->
|
|
val around = getSurroundingCords(cord)
|
|
numbers.forEach { partNumber ->
|
|
val seen = ArrayList<PartNumber>()
|
|
around.forEach { p ->
|
|
if (p.x in partNumber.startIndex..partNumber.endIndex && p.y == partNumber.y && !seen.contains(partNumber)){
|
|
//println(partNumber.number)
|
|
seen.add(partNumber)
|
|
sum += partNumber.number
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
println(sum)
|
|
}
|
|
|
|
fun getSurroundingCords(p: Point): List<Point> {
|
|
return listOf(
|
|
Point(p.x - 1, p.y - 1),
|
|
Point(p.x, p.y - 1),
|
|
Point(p.x + 1, p.y - 1),
|
|
Point(p.x - 1, p.y),
|
|
Point(p.x + 1, p.y),
|
|
Point(p.x - 1, p.y + 1),
|
|
Point(p.x, p.y + 1),
|
|
Point(p.x + 1, p.y + 1)
|
|
)
|
|
}
|
|
|
|
data class PartNumber(
|
|
val number: Int,
|
|
val y: Int,
|
|
val startIndex: Int,
|
|
val endIndex: Int
|
|
) |