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