Files
Advent-of-Code/2023/03/Kotlin/src/Main.kt
2025-06-06 00:10:39 +02:00

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
)