diff --git a/03-a.kts b/03-a.kts new file mode 100644 index 0000000..8451fe7 --- /dev/null +++ b/03-a.kts @@ -0,0 +1,13 @@ +import java.util.Scanner +import java.util.regex.Pattern + +val pattern: Pattern = Pattern.compile("mul\\([0-9]+,[0-9]+\\)") +val scanner = Scanner(System.`in`) + +var sum = 0 +while (true) { + val next: String = scanner.findWithinHorizon(pattern, 0) ?: break + + sum += next.replace("mul(", "").replace(")", "").split(",").map { it.toInt() }.let { (a, b) -> a*b } +} +println(sum) \ No newline at end of file diff --git a/03-b.kts b/03-b.kts new file mode 100644 index 0000000..ff03734 --- /dev/null +++ b/03-b.kts @@ -0,0 +1,21 @@ +import java.util.Scanner +import java.util.regex.Pattern + +val pattern: Pattern = Pattern.compile("mul\\([0-9]+,[0-9]+\\)|do\\(\\)|don't\\(\\)") + +val scanner = Scanner(System.`in`) + +var sum = 0 +var enabled = true +while (true) { + val next: String = scanner.findWithinHorizon(pattern, 0) ?: break + + when (next) { + "do()" -> enabled = true + "don't()" -> enabled = false + else -> if (enabled) { + sum += next.replace("mul(", "").replace(")", "").split(",").map { it.toInt() }.let { (a, b) -> a*b } + } + } +} +println(sum) \ No newline at end of file diff --git a/04-a.kts b/04-a.kts new file mode 100644 index 0000000..672ec67 --- /dev/null +++ b/04-a.kts @@ -0,0 +1,59 @@ +import java.util.Scanner + +val scanner = Scanner(System.`in`) + +val matrix = ArrayList() + +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + matrix.add(line.toCharArray()) +} + +var count = 0 + +matrix.forEachIndexed { row, line -> + line.forEachIndexed { col, char -> + count += searchFrom(matrix, row, col) + } +} +println(count) + +fun searchFrom(matrix: ArrayList, row: Int, col: Int): Int { + return (if (safeCheckMatrix(matrix, row, col, 'X') + && safeCheckMatrix(matrix, row, col + 1, 'M') + && safeCheckMatrix(matrix, row, col + 2, 'A') + && safeCheckMatrix(matrix, row, col + 3, 'S') + ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X') + && safeCheckMatrix(matrix, row, col - 1, 'M') + && safeCheckMatrix(matrix, row, col - 2, 'A') + && safeCheckMatrix(matrix, row, col - 3, 'S') + ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X') + && safeCheckMatrix(matrix, row + 1, col + 1, 'M') + && safeCheckMatrix(matrix, row + 2, col + 2, 'A') + && safeCheckMatrix(matrix, row + 3, col + 3, 'S') + ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X') + && safeCheckMatrix(matrix, row + 1, col, 'M') + && safeCheckMatrix(matrix, row + 2, col, 'A') + && safeCheckMatrix(matrix, row + 3, col, 'S') + ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X') + && safeCheckMatrix(matrix, row + 1, col - 1, 'M') + && safeCheckMatrix(matrix, row + 2, col - 2, 'A') + && safeCheckMatrix(matrix, row + 3, col - 3, 'S') + ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X') + && safeCheckMatrix(matrix, row - 1, col + 1, 'M') + && safeCheckMatrix(matrix, row - 2, col + 2, 'A') + && safeCheckMatrix(matrix, row - 3, col + 3, 'S') + ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X') + && safeCheckMatrix(matrix, row - 1, col, 'M') + && safeCheckMatrix(matrix, row - 2, col, 'A') + && safeCheckMatrix(matrix, row - 3, col, 'S') + ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X') + && safeCheckMatrix(matrix, row - 1, col - 1, 'M') + && safeCheckMatrix(matrix, row - 2, col - 2, 'A') + && safeCheckMatrix(matrix, row - 3, col - 3, 'S') + ) 1 else 0) +} + +fun safeCheckMatrix(matrix: ArrayList, row: Int, col: Int, target: Char): Boolean { + return row in matrix.indices && col in matrix[row].indices && matrix[row][col] == target +} \ No newline at end of file diff --git a/04-b.kts b/04-b.kts new file mode 100644 index 0000000..a8cfe20 --- /dev/null +++ b/04-b.kts @@ -0,0 +1,47 @@ +import java.util.* + +val scanner = Scanner(System.`in`) + +val matrix = ArrayList() + +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + matrix.add(line.toCharArray()) +} + +var count = 0 + +matrix.forEachIndexed { row, line -> + line.forEachIndexed { col, char -> + count += searchFrom(matrix, row, col) + } +} +println(count) + +fun searchFrom(matrix: ArrayList, row: Int, col: Int): Int { + return (if (safeCheckMatrix(matrix, row, col, 'A') && + safeCheckMatrix(matrix, row - 1, col - 1, 'M') && + safeCheckMatrix(matrix, row - 1, col + 1, 'M') && + safeCheckMatrix(matrix, row + 1, col - 1, 'S') && + safeCheckMatrix(matrix, row + 1, col + 1, 'S') + ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'A') && + safeCheckMatrix(matrix, row + 1, col - 1, 'M') && + safeCheckMatrix(matrix, row + 1, col + 1, 'M') && + safeCheckMatrix(matrix, row - 1, col - 1, 'S') && + safeCheckMatrix(matrix, row - 1, col + 1, 'S') + ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'A') && + safeCheckMatrix(matrix, row - 1, col - 1, 'M') && + safeCheckMatrix(matrix, row + 1, col - 1, 'M') && + safeCheckMatrix(matrix, row - 1, col + 1, 'S') && + safeCheckMatrix(matrix, row + 1, col + 1, 'S') + ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'A') && + safeCheckMatrix(matrix, row - 1, col + 1, 'M') && + safeCheckMatrix(matrix, row + 1, col + 1, 'M') && + safeCheckMatrix(matrix, row - 1, col - 1, 'S') && + safeCheckMatrix(matrix, row + 1, col - 1, 'S') + ) 1 else 0) +} + +fun safeCheckMatrix(matrix: ArrayList, row: Int, col: Int, target: Char): Boolean { + return row in matrix.indices && col in matrix[row].indices && matrix[row][col] == target +} \ No newline at end of file diff --git a/05-a.kts b/05-a.kts new file mode 100644 index 0000000..8c88f89 --- /dev/null +++ b/05-a.kts @@ -0,0 +1,39 @@ +import java.util.Scanner + +val scanner = Scanner(System.`in`) + +val rules = HashMap>() + +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + if (line == "") { + break; + } + + val (before, after) = line.split("|").map(String::toInt) + if (!rules.contains(before)) { + rules[before] = HashSet() + } + rules[before]!!.add(after) +} + +var sum = 0 +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + val pages = line.split(",").map(String::toInt) + + val result = pages.fold(Pair(HashSet(), true)) { (appeared, isSafe), page -> + val shouldBeAfter = rules[page]?.toSet() ?: emptySet() + val violateRule = appeared.intersect(shouldBeAfter) + val stillSafe = isSafe && violateRule.isEmpty() + + appeared.add(page) + Pair(appeared, stillSafe) + } + + if (result.second) { + val pagesArray = pages.toIntArray() + sum += pagesArray[pagesArray.size / 2] + } +} +println(sum) \ No newline at end of file diff --git a/05-b.kts b/05-b.kts new file mode 100644 index 0000000..34e2db2 --- /dev/null +++ b/05-b.kts @@ -0,0 +1,31 @@ +import java.util.Scanner + +val scanner = Scanner(System.`in`) + +val rules = HashMap>() + +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + if (line == "") { + break; + } + + val (before, after) = line.split("|").map(String::toInt) + if (!rules.contains(before)) { + rules[before] = HashSet() + } + rules[before]!!.add(after) +} + +var sum = 0 +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + val pages = line.split(",").map(String::toInt) + val fixed = pages.sortedWith { l, r -> if (l == r) 0 else if (rules[l]?.contains(r) == true) -1 else 1 } + + if ("$pages" != "$fixed") { + val fixedArray = fixed.toIntArray() + sum += fixedArray[fixedArray.size / 2] + } +} +println(sum) \ No newline at end of file