Světýlkův blog

Hlášky, myšlenky, umění slova a čistého kódu.
  • Jsem supr nadšený! Úplně to překonalo moje nulové očekávání. –Jiří B.

  • Advent of Code v Kotlinu (Den 3.)

    Dnes už to bylo více tricky a musel jsem sáhnout po své Rojo knihovně, ale zvládlo se to 🙂 .

    Část A i B:

    @Regex("#(\\d+) @ (\\d+),(\\d+): (\\d+)x(\\d+)")
    class Claim {
        @Group(1)
        var id: Int = 0
    
        @Group(2)
        var x: Int = 0
    
        @Group(3)
        var y: Int = 0
    
        @Group(4)
        var width: Int = 0
    
        @Group(5)
        var height: Int = 0
    }
    
    fun main() {
        val input = File("input3.txt").readText()
        val claims = Rojo.of(Claim::class.java).matchList(input)
    
        val maxWidth = claims.map { it.x + it.width }.max() ?: 0
        val maxHeight = claims.map { it.y + it.height }.max() ?: 0
    
        val area = Array(maxWidth) { IntArray(maxHeight) { 0 } }
    
        claims.forEach { area.cutOut(it) }
    
        val total = area.sumBy { it.count { it == 2 } }
        println(total)
    
        val nonOverlapping = claims.find { claim ->
            claim.run {
                (x until x + width).all { posX ->
                    (y until y + height).all { posY ->
                        area.get(posX)[posY] == 1
                    }
                }
            }
        }
    
        println(nonOverlapping?.id)
    }
    
    private fun Array<IntArray>.cutOut(claim: Claim) {
        claim.run {
            for (posX in x until x + width) {
                for (posY in y until y + height) {
                    val row = get(posX)
                    when (row[posY]) {
                        0 -> row[posY] = 1
                        1 -> row[posY] = 2
                    }
                }
            }
        }
    }
    
  • Advent of Code v Kotlinu (Den 2.)

    Doháním deficit a zde je řešení pro den 2.

    A:

    fun hasSameLettersCount(id: String, occurrences: Int): Boolean {
        val sameLetterCounts = id.groupBy { it }
            .values
            .map { it.count() }
    
        return occurrences in sameLetterCounts
    }
    
    fun main() {
        val ids = File("input2.txt").readLines()
    
        val twoCounts = ids.filter { hasSameLettersCount(it, 2) }.count()
        val threeCounts = ids.filter { hasSameLettersCount(it, 3) }.count()
    
        println(twoCounts * threeCounts)
    }
    

    B:

    fun main() {
        val ids = File("input2.txt").readLines().toSet()
    
        for (idA in ids) {
            for (idB in ids) {
                val diff = getDiff(idA, idB)
                if (diff.length == idA.length - 1) {
                    println(diff)
                    return
                }
            }
        }
    }
    
    fun getDiff(first: String, second: String) = first.zip(second) { a, b ->
        if (a == b) a.toString() else ""
    }.joinToString("")
    
  • Advent of Code v Kotlinu (Den 1.)

    Rozhodl jsem se, že si letošní Vánoční čas zpříjemním řešením programátorských hádanek, které pro nás letos připravili na stránkách Advent of Code 2018 … jak jinak, než v Kotlinu 🙂 . Pokud se chcete pochlubit vaším kódem – ať už v jakémkoliv jazyce – nebojte se napsat do komentářů 🙂 .

    Mé řešení pro část první:

    fun main() {
        val result = File("input1.txt").readLines().sumBy { it.toInt() }
        println(result)
    }
    

    a část druhou:

    fun main() {
    
        val frequencies = sequence {
            val deltas = File("input1.txt").readLines().map { it.toInt() }
            var lastFreq = 0
    
            while (true) {
                deltas.forEach {
                    lastFreq += it
                    yield(lastFreq)
                }
            }
        }
    
        val seen = mutableSetOf<Int>()
    
        for (freq in frequencies) {
            if (freq in seen) {
                println(freq)
                break
            }
            seen += freq
        }
    }
    
  • Nejvíce potěší volovina. –Ludmila B.

  • U 9 lidí už je velká pravděpodobnost, že alespoň 1 z nich bude blbec. –Jan B.

  • Asi mu musíme říct, že ta jeho learning curva bude pěkně velká. –Tomáš N.

  • Toužíš-li po svobodě mysli blázna, musíš se jím stát.

  • Správný úhel pohledu je ten, který ti nevadí.

  • Chůze je žonglování nohama pod vlastním tělem, aby neupadlo.