Kategorie: Programování

  • Advent of Code v Kotlinu (Den 12.)

    V tento den mi chvíli (no, trochu déle) trvalo, než jsem vůbec pochopil zadaní první části, kterou jsem pak zvládl docela v pohodě. Ale pro část B jsem si již zašel pro radu na Kotlin Slack, kde trik spočíval v tom, že již po cca 100 iteracích se pattern usadí a přírůstky rostlin začnou být konstantní, což nám umožní všechny zbývající iterace vynechat úplně a výsledek jednoduše dopočítat.

  • Advent of Code v Kotlinu (Den 11.)

    Den 11. byl opět performance peklo 🙂 . Jelikož jsem neznal „Summed-area table“ algoritmus, pokusil jsem se přijít s něčím vlastním, což nebylo zdaleka tak efektivní, ale doběhlo to! (naštěstí se správným výsledkem):

  • Advent of Code v Kotlinu (Den 10.)

    Další z ne-úplně lehkých dnů. Nyní již bylo zapotřebí trochy odhadu a víry, že se člověk vydal správnou cestou 🙂 .

  • Advent of Code v Kotlinu (Den 9.)

    Den 9., ačkoliv se jevil jednoduše, zákeřnost jeho zadání přišla záhy 🙂 . První část jsem ještě zvládl sám, ale v části druhé jsem měl již perfomance problém. Ačkoliv se mi mé první řešení podařilo zrychlit až 25x, stále to bylo velmi málo. A tak jsem musel zvolit zcela jiný přístup, kde jsem se musel inspirovat řešením ostatních na Kotlin Slacku, což nakonec rychle vedlo ke kýženému cíli:

  • Advent of Code v Kotlinu (Den 8.)

    Den 8. byl oproti včerejšku docela v pohodě 🙂 . Zde je mé řešení:

  • Advent of Code v Kotlinu (Den 7.)

    Den 7. byl opět jeden z drsnějších, ale nakonec se podařilo 🙂 .

  • Advent of Code v Kotlinu (Den 6.)

    V den 6. jsem se pokusil zaměřit se na rychlost řešení, namísto čistého kódu, abych odhadl, jestli bych měl vůbec šanci dostat se do Top 100 v leaderboardu. No, trvalo mi to něco přes 40 min, kde se mi u toho málem roztopil mozek 🙂 . Takže na to prdím, neb to mi za to nestojí … zde je moje řešení pro den 6. a příště se navrátím zpět k důmyslnosti a čistotě řešení samotného:

  • Advent of Code v Kotlinu (Den 4. a 5.)

    Zatímco 4. den byl docela masakr, kde mě totálně vypekla knihovna JodaTime – z nějakého důvodu převedla javovský Date špatně, 5. už byl o něco lepší, nicméně výkonnostně nic moc 🙂 (chtělo by to optimalizovat na úkor čitelnosti).

  • 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 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
        }
    }