From 64dadfa0da14151c42f5a99dd945c557eedb60ad Mon Sep 17 00:00:00 2001 From: WanCW Date: Fri, 6 Dec 2024 15:24:24 +0800 Subject: [PATCH 1/2] complete day 6, part-1 --- 06-a.kts | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 06-a.kts diff --git a/06-a.kts b/06-a.kts new file mode 100644 index 0000000..badf94c --- /dev/null +++ b/06-a.kts @@ -0,0 +1,78 @@ +import java.util.Scanner + +enum class Direction { + NORTH { + override fun moveFrom(row: Int, col: Int): Pair { + return Pair(row-1, col) + } + }, SOUTH { + override fun moveFrom(row: Int, col: Int): Pair { + return Pair(row+1, col) + } + }, WEST { + override fun moveFrom(row: Int, col: Int): Pair { + return Pair(row, col-1) + } + }, EAST { + override fun moveFrom(row: Int, col: Int): Pair { + return Pair(row, col+1) + } + }; + + fun turnRight(): Direction { + return when (this) { + NORTH -> EAST + EAST -> SOUTH + SOUTH -> WEST + WEST -> NORTH + } + } + + abstract fun moveFrom(row: Int, col: Int): Pair +} + +val scanner = Scanner(System.`in`) + +val map = ArrayList>() + +var rows = 0 +var guardRow = -1 +var guardCol = -1 +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + val pos = line.indexOf('^') + if (pos != -1) { + guardRow = rows + guardCol = pos + } + val chars = line.toCharArray().toTypedArray() + map.add(chars) + rows++ +} + +var facing = Direction.NORTH + +var visitedCount = 0 +walk@ while (true) { + if (map[guardRow][guardCol] != 'X') { + visitedCount++ + } + map[guardRow][guardCol] = 'X' + + var seeking = true + do { + val (nextRow, nextCol) = facing.moveFrom(guardRow, guardCol) + if (nextRow < 0 || nextRow >= map.size || nextCol < 0 || nextCol >= map[nextCol].size) { + break@walk + } + + if (map[nextRow][nextCol] == '#') { + facing = facing.turnRight() + } else { + guardRow = nextRow + guardCol = nextCol + seeking = false + } + } while (seeking) +} +println(visitedCount) From 7891c409bb59494d946ff693d0cf3c8b96d1cc5c Mon Sep 17 00:00:00 2001 From: WanCW Date: Mon, 9 Dec 2024 11:38:41 +0800 Subject: [PATCH 2/2] complete day 7 --- 07-a.kts | 30 ++++++++++++++++++++++++++++++ 07-b.kts | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 07-a.kts create mode 100644 07-b.kts diff --git a/07-a.kts b/07-a.kts new file mode 100644 index 0000000..56b78da --- /dev/null +++ b/07-a.kts @@ -0,0 +1,30 @@ +import java.math.BigInteger +import java.util.* + +val scanner = Scanner(System.`in`) + +var sum: BigInteger = BigInteger.ZERO +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + val numbersInLine = line.split("[: ]+".toRegex()).map(String::toBigInteger) + val target = numbersInLine.first() + val numbers = numbersInLine.drop(1) + val possibleResults = findAllPossibleResult(setOf(numbers.first()), numbers.drop(1)) + if (possibleResults.contains(target)) { + sum += target + } +} +println(sum) + +fun findAllPossibleResult(partialResults: Set, numbers: List): Set { + if (numbers.isEmpty()) return partialResults + + val head = numbers.first() + val tail = numbers.drop(1) + val newResults = partialResults.fold(HashSet()) { r, p -> + r.add(p.plus(head)) + r.add(p.times(head)) + r + } + return findAllPossibleResult(newResults, tail) +} \ No newline at end of file diff --git a/07-b.kts b/07-b.kts new file mode 100644 index 0000000..df9ea34 --- /dev/null +++ b/07-b.kts @@ -0,0 +1,32 @@ +import java.math.BigInteger +import java.util.* + +val scanner = Scanner(System.`in`) + +var sum: BigInteger = BigInteger.ZERO +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + val numbersInLine = line.split("[: ]+".toRegex()).map(String::toBigInteger) + val target = numbersInLine.first() + val numbers = numbersInLine.drop(1) + val possibleResults = findAllPossibleResult(setOf(numbers.first()), numbers.drop(1)) + if (possibleResults.contains(target)) { + sum += target +// println(line) + } +} +println(sum) + +fun findAllPossibleResult(partialResults: Set, numbers: List): Set { + if (numbers.isEmpty()) return partialResults + + val head = numbers.first() + val tail = numbers.drop(1) + val newResults = partialResults.fold(HashSet()) { r, p -> + r.add("$p$head".toBigInteger()) + r.add(p.plus(head)) + r.add(p.times(head)) + r + } + return findAllPossibleResult(newResults, tail) +} \ No newline at end of file