Kategorie: Zájmy

  • 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
        }
    }
    
  • Průvodce tanečníka swingu

    Když jsem cca 2 roky zpátky procházel videa na YouTube, narazil jsem na tanec, který mě již na první pohled zaujal, nejen celkově, ale byl to především jeden prvek, který v něm tančily výhradně holky a ten prvek se mi strašně líbil. Tehda jsem měl nějaké matné ponětí, že se tomu celému nejspíše říká Swing, ale dnes již vím, že konkrétně ten tanec, který mě zaujal, se jmenuje Lindy Hop a ten prvek, který se mi na holkách tolik líbil, se nazývá „swivel“.

    Pokud zrovna nebydlíte ve velkoměstě, pak pro vás mohou být lekce swingu vzácností, protože ani zde v okolí jsem nemohl najít nikoho, kdo by to vyučoval. Až pak jednoho dne mě oslovila reklama na FB, oznamující otevření kurzu pro začátečníky a to přímo ve Starém Městě u Frýdku-Místku pod záštitou Old Town Swing. Rozhodování netrvalo dlouho a má přihláška již putovala elektronickou cestou přímo do Starého Města. Že nemám partnerku? Nevadí! Holek je na tančení přeci vždycky více … a tak vše mohlo začít, kde od této chvíle můj život již nebude úplně stejný jako dřív.

  • Jak skákat s kitem (pohledem začátečníka)

    Jelikož se mi poslední zimu podařilo „sesbírat všechny své koule“ a konečně opět pokročit ve skocích s kitem na lyžích, rozhodl jsem se sepsat pár dojmů skákajícího začátečníka a trošku více do detailu popsat, jak s kitem správně skákat.

    Úvod

    Skočit s kitem je principiálně docela jednoduché, ale co je na tom celém z počátku nejtěžší, je zachovat v hlavě klid a tento jednoduchý postup skutečně vykonat! Dále bych nedoporučoval skákat s malými kity (tj. cokoliv pod 10sqm). V samotné technice skoku bude taktéž záviset na druhu kita, proto můj popis budu více směřovat dle své vlastní zkušenosti na vynikající uzavřenou komoru Aeros NAVY 2 (11sqm). Dle toho, jaký kite vlastníte již nechám na vás, abyste si svou techniku skoku vyladili sami 🙂 .

    Technika skoku

    Abych to příliš nezesložiťoval, shrnul bych celý postup skoku do těchto jednoduchých kroků:

    1. Mám kite na pravé straně větrného okna a tedy jedu „doprava“
    2. Až naberu rychlost, zatáhnu za levou stranu baru a posílám kita nad svou hlavu (ne pomalu, ale ani moc rychle – je třeba vychytat) a začínám hranit mírně proti větru (tlačím na levou nohu a snažím se udržet si pozici – nesklouzávám lyžemi po větru)
    3. Během hranění a stoupání kita nad hlavu dám bar tak daleko/blízko od sebe, abych cítil neustálý tah kita, který zároveň nesmí být tak silný, abych již na lyžích neudržel hranu (nezačal sklouzávat po větru)
    4. Jakmile je kite téměř nade mnou (ideální pozici je třeba vychytat), přitáhnu bar k sobě a okamžitě tahám za pravou stranu baru, abych kite stočil postupně zpět do směru jízdy

    A to by mělo být de facto vše 🙂 . Jen jak jsem již zmínil dříve, doporučil bych si tento postup dopředu naučit nazpaměť neboť (pokud člověk ještě není zvyklý) v momentě, kdy vás kite zvedne, tak se mozek dostane do jakéhosi „stavu přežití“ a v tomto stavu není absolutně schopen přemýšlet – proto hlavně ono vrácení kitu zpět do směru jízdy musíte udělat zcela automaticky/intuitivně (bez přemýšlení). Pokud byste kite nestočili a nechali ho tak, velmi pravděpodobně dojde k tomu, že se zhoupnete dopředu a přistanete na záda – proto páteřák vždy s sebou! Nebo pokud byste, nedej bože, zatáhli za špatnou stranu (v tomto případě za levou), tak se můžete rozbít opravdu ošklivě …

    Pokud se vrátím k bodu 3 – jak moc mít bar od sebe – tak to se mi zároveň ukázalo jako dobré měřítko, jak bude skok cca vysoký. Pokud bude foukat hodně, kite mě donutí mít bar téměř úplně od sebe a dle toho můžu čekat, že skok bude vysoký. Proto bych ze začátku v takovém případě doporučil přitáhnout bar ne úplně k sobě, ale třeba jen do poloviny. Naopak, pokud si budu moct dovolit bar během stoupání kita mít blíže k sobě, znamená to, že fouká málo, nebo obecně, že kite má málo síly, což se projeví tak, že po úplném přitažení baru neskočím buď vůbec, anebo velmi málo.

    Jako ukázku výše popsané techniky skoku bych zvolil tento krátký úryvek (skočil jsem asi 10-20cm nad zem):

    To by bylo ke skokům vše, přeju vám krásné radovánky s vaším kitem, ale hlavně: skákejte bezpečně! 🙂