import java.awt.Point import java.io.File fun main() { val input = File("Input.txt").readLines() var sum = 0 val numbers = ArrayList() 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() 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() 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 { 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 )