Compare commits

...

3 commits

Author SHA1 Message Date
8c28519674
complete day 5 2024-12-05 15:27:31 +08:00
cbbd95f7ab
complete day 4 in straightforward way 2024-12-04 13:48:31 +08:00
c9ca250a9a
complete day 3 2024-12-03 14:09:56 +08:00
6 changed files with 210 additions and 0 deletions

13
03-a.kts Normal file
View file

@ -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)

21
03-b.kts Normal file
View file

@ -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)

59
04-a.kts Normal file
View file

@ -0,0 +1,59 @@
import java.util.Scanner
val scanner = Scanner(System.`in`)
val matrix = ArrayList<CharArray>()
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<CharArray>, 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<CharArray>, row: Int, col: Int, target: Char): Boolean {
return row in matrix.indices && col in matrix[row].indices && matrix[row][col] == target
}

47
04-b.kts Normal file
View file

@ -0,0 +1,47 @@
import java.util.*
val scanner = Scanner(System.`in`)
val matrix = ArrayList<CharArray>()
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<CharArray>, 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<CharArray>, row: Int, col: Int, target: Char): Boolean {
return row in matrix.indices && col in matrix[row].indices && matrix[row][col] == target
}

39
05-a.kts Normal file
View file

@ -0,0 +1,39 @@
import java.util.Scanner
val scanner = Scanner(System.`in`)
val rules = HashMap<Int, MutableSet<Int>>()
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<Int>()
}
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<Int>(), 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)

31
05-b.kts Normal file
View file

@ -0,0 +1,31 @@
import java.util.Scanner
val scanner = Scanner(System.`in`)
val rules = HashMap<Int, MutableSet<Int>>()
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<Int>()
}
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)