Day 25: Code Chronicle
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Kotlin
A fun and small challenge. First read all locks, transpose their profile and count the
#
s (-1 for the full row). Then do the same for the keys.Lastly find all keys for all locks that do not sum to more than 5 with their teeth:
Code
val lockRegex = Regex("""#{5}(\r?\n[.#]{5}){6}""") val keyRegex = Regex("""([.#]{5}\r?\n){6}#{5}""") fun parseLocksAndKeys(inputFile: String): Pair<List<IntArray>, List<IntArray>> { val input = readResource(inputFile) val locks = lockRegex .findAll(input) .map { it .value .lines() .map { line -> line.toList() } .transpose() .map { line -> line.count { c -> c == '#' } - 1 } .toIntArray() } .toList() val keys = keyRegex .findAll(input) .map { it .value .lines() .map { line -> line.toList() } .transpose() .map { line -> line.count { c -> c == '#' } - 1 } .toIntArray() } .toList() return locks to keys } fun part1(inputFile: String): String { val (locks, keys) = parseLocksAndKeys(inputFile) val matches = locks.map { lock -> keys.filter { key -> for (i in lock.indices) { // Make sure the length of the key and lock do not exceed 5 if (lock[i] + key[i] > 5) { return@filter false } } true } } .flatten() .count() return matches.toString() }
Also on GitHub