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

  • GiantTree
    link
    fedilink
    arrow-up
    3
    ·
    1 day ago

    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