Advent of Code 2021 day 10
12/10/2022, 5:00 AMDan Fingal-Surma
12/10/2022, 5:15 AMSergei Petunin
12/10/2022, 5:21 AMDuring the 100th cycle, register X has the value 18, so the signal strength is 100 * 18 = 1800.
β for me, x
on the 100th cycle is 17, not 18, as the addx 1
command is still in progressDan Fingal-Surma
12/10/2022, 5:21 AMSergei Petunin
12/10/2022, 5:22 AMDan Fingal-Surma
12/10/2022, 5:22 AMDan Fingal-Surma
12/10/2022, 5:22 AMDan Fingal-Surma
12/10/2022, 5:23 AMvar register = 1
var clock = 0
Dan Fingal-Surma
12/10/2022, 5:24 AMMarcin Wisniowski
12/10/2022, 5:24 AMSergei Petunin
12/10/2022, 5:24 AMAt the start of the *first* cycle, the noop instruction begins execution.
Sergei Petunin
12/10/2022, 5:24 AMMarcin Wisniowski
12/10/2022, 5:25 AMMarcin Wisniowski
12/10/2022, 5:25 AMprintArea()
function ready in my utils (for printing grids), helped.Dan Fingal-Surma
12/10/2022, 5:25 AMMarcin Wisniowski
12/10/2022, 5:27 AMDan Fingal-Surma
12/10/2022, 5:27 AMMarcin Wisniowski
12/10/2022, 5:29 AMDan Fingal-Surma
12/10/2022, 5:30 AMMarcin Wisniowski
12/10/2022, 5:36 AMββββ ββ ββ ββ βββ ββ βββ ββββ
β β β β β β β β β β β β
βββ β β β β β β β β β βββ
β β β ββββ βββ β βββ β
β β β β β β β β β β β β β
β ββ ββ β β β ββ β β ββββ
Yeah πMichael de Kaste
12/10/2022, 5:48 AM##...##..###..#..#.###..####..##..###...
..#.#..#.#..#.#..#.#..#.#....#..#.#..#..
..#.#....#..#.####.###..###..#..#.###...
##..#.##.###..#..#.#..#.#....####.#..#..
....#..#.#....#..#.#..#.#....#..#.#..#..
.....###.#....#..#.###..####.#..#.###...
I still got my answer, now to actually fix thisSergei Petunin
12/10/2022, 5:49 AMJacob Moulton
12/10/2022, 5:49 AMSergei Petunin
12/10/2022, 5:50 AMrocketraman
12/10/2022, 5:52 AMrocketraman
12/10/2022, 5:55 AMCognitive Gear
12/10/2022, 5:57 AMMichael de Kaste
12/10/2022, 5:57 AMobject Day10 : Challenge() {
private val parsed = input.lines()
.flatMap {
when (val split = it.split(" ")) {
listOf("noop") -> listOf(0)
else -> listOf(0, split[1].toInt())
}
}.runningFold(1, Int::plus).dropLast(1)
override fun part1() = (20..220 step 40).sumOf { it * parsed[it - 1] }
override fun part2() = parsed
.chunked(40)
.joinToString("\n") {
it.withIndex().joinToString("") { (index, value) ->
if (value in listOf(index - 1, index, index + 1)) "#" else "."
}
}
}
Michael de Kaste
12/10/2022, 6:00 AMaddx 5
to 0, 5
and noop to 0
had me needing to add a starting value and drop the final one, lolJonathan Kolberg
12/10/2022, 6:06 AMJonathan Kolberg
12/10/2022, 6:07 AMJakub GwΓ³ΕΊdΕΊ
12/10/2022, 6:13 AMJakub GwΓ³ΕΊdΕΊ
12/10/2022, 6:15 AM#
with two-chars []
Jonathan Kolberg
12/10/2022, 6:15 AMNeil Banman
12/10/2022, 6:18 AMJonathan Kolberg
12/10/2022, 6:22 AMJakub GwΓ³ΕΊdΕΊ
12/10/2022, 6:25 AMJakub GwΓ³ΕΊdΕΊ
12/10/2022, 6:28 AMNeil Banman
12/10/2022, 6:28 AMNeil Banman
12/10/2022, 6:31 AMNeil Banman
12/10/2022, 6:31 AMNeil Banman
12/10/2022, 6:36 AMMichael de Kaste
12/10/2022, 6:39 AMAny?
which will just get printedJakub GwΓ³ΕΊdΕΊ
12/10/2022, 6:45 AMfun part1(input:String) = input.let { ... }
and make the compiler worry about the types πJonathan Kolberg
12/10/2022, 6:47 AMJonathan Kolberg
12/10/2022, 6:48 AMDirk Groot
12/10/2022, 6:54 AMnkiesel
12/10/2022, 7:02 AMif (pixelPos % 5 == 0) append(" ")
append(if (x in (pixelPos - 1)..(pixelPos + 1)) "ββ" else " ")
if (++pixelPos == 40) appendLine().also { pixelPos = 0 }
which resulted inxxfast
12/10/2022, 7:20 AMDan Fingal-Surma
12/10/2022, 8:08 AMSimon Birt
12/10/2022, 8:28 AMDan Fingal-Surma
12/10/2022, 8:47 AMphldavies
12/10/2022, 9:09 AMKarloti
12/10/2022, 9:14 AMKarloti
12/10/2022, 9:17 AMphldavies
12/10/2022, 9:22 AMappend(if (crtPixel in sprite) "βͺοΈ" else "β«οΈ")
Hooray for flip-dot screen!ephemient
12/10/2022, 9:27 AMephemient
12/10/2022, 9:29 AMββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββ
since I think it looks better on my terminal. but YMMV of courseNeil Banman
12/10/2022, 9:31 AMNeil Banman
12/10/2022, 9:31 AMphldavies
12/10/2022, 9:31 AMNeil Banman
12/10/2022, 9:33 AMcorneil
12/10/2022, 9:36 AMphldavies
12/10/2022, 9:42 AMJoris PZ
12/10/2022, 9:45 AMaddx
instruction. The chunked
method is nice way of cutting it up into rows of 40 items each
val p10 = suspend {
val input = readInput("10.txt").lineSequence()
val output = sequence {
var cycle = 1
var register = 1
for (instruction in input) {
when (instruction.substring(0, 4)) {
"noop" -> yield(Pair(cycle++, register))
"addx" -> {
yield(Pair(cycle++, register))
yield(Pair(cycle++, register))
register += instruction.substring(5).toInt()
}
else -> error("")
}
}
}
output
.filter { it.first in listOf(20, 60, 100, 140, 180, 220) }
.sumOf { it.first * it.second }
.print { "Part 1: $it" }
output.chunked(40).joinToString("\n") { state ->
state.joinToString("") {
val pixelIndex = (it.first - 1) % 40
if ((pixelIndex - it.second).absoluteValue <= 1) "#" else "."
}
}.print { "Part 2: \n\n$it\n" }
}
Jan Durovec
12/10/2022, 9:55 AMKarloti
12/10/2022, 10:02 AMJan Durovec
12/10/2022, 10:03 AMfilterIndexed
is fine but I need to keep indices after the filter to do calculationphldavies
12/10/2022, 10:04 AMmapIndexedNotNull
Karloti
12/10/2022, 10:07 AMJakub GwΓ³ΕΊdΕΊ
12/10/2022, 10:19 AMpackage day1
fun part1(input:String) = something...something...
fun part2(input:String) = something...something...
I can write (in each file) a main that looks like:
fun main() {
val input = readAllText("local/day3_input.txt")
val test = """
vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw
""".trimIndent()
execute(::part1, test, 157)
execute(::part1, input)
execute(::part2, test, 70)
execute(::part2, input)
}
and get nice output
day3.part1() after 22.306ms => 157
day3.part1() after 5.651ms => 8109
day3.part2() after 3.084ms => 70
day3.part2() after 2.514ms => 2738
No matter if the answer is an Int, Long, String or whatnot.Anirudh
12/10/2022, 10:54 AMβββ ββββ β β βββ βββ β β β βββ
β β β β β β β β β β β β β β
β β βββ ββββ β β β β β β β βββ
βββ β β β βββ βββ β β β β β
β β β β β β β β β β β β β
β β ββββ β β β β β ββββ ββ βββ
Anirudh
12/10/2022, 11:05 AMprocessCycle()
and that was imperative. so not sure if it was worth the effort. doesn't look particularly clean either.
https://github.com/aneroid/advent-of-code-2022-kotlin/blob/main/src/Day10.ktFredrik RΓΈdland
12/10/2022, 11:12 AMfun partOne(list: List<String>): Long
(and a part2). (I just change the return-type if I need something else)
and a test-setup like this:
https://github.com/fmmr/advent/blob/master/src/test/kotlin/no/rodland/advent_2022/Day14Test.kt
@Test
fun `14,2,live,init`() {
report {
Day14.partTwo(data14) to resultTwo
}
}
the "test-runner" i use is here, https://github.com/fmmr/advent/blob/master/src/test/kotlin/no/rodland/advent/TestMisc.kt
and reports the time used as well as supporting any type to be returned from partOne
and partTwo
So for each passing test I get and output similar to:
DAY: 04, PART: 1, DATA: live, TAKE: init
========================================
Result: 515, Excpected: 515
took: 8ms
Jakub GwΓ³ΕΊdΕΊ
12/10/2022, 11:16 AMephemient
12/10/2022, 11:17 AMephemient
12/10/2022, 11:17 AMFredrik RΓΈdland
12/10/2022, 11:19 AMAOCTestSuite
and AOCTest
in the same TestMisc above to run multiple tests if I wantphldavies
12/10/2022, 11:19 AMephemient
12/10/2022, 11:20 AMJakub GwΓ³ΕΊdΕΊ
12/10/2022, 11:20 AMephemient
12/10/2022, 11:22 AMphldavies
12/10/2022, 11:23 AMephemient
12/10/2022, 11:24 AMPoisonedYouth
12/10/2022, 11:42 AMDavio
12/10/2022, 12:11 PMDavio
12/10/2022, 12:14 PMDavio
12/10/2022, 12:15 PMDavio
12/10/2022, 12:18 PMprivate object Noop : Command(1) {
override fun toString() = "Noop"
}
Davio
12/10/2022, 12:37 PMMichael BΓΆiers
12/10/2022, 12:39 PMfun main() {
var x = 1
var cycle = 1
var part1 = 0
val screen = Array(6) { BooleanArray(40) }
fun tick() {
if (cycle in listOf(20, 60, 100, 140, 180, 220)) part1 += cycle * x
val row = (cycle - 1) / 40
val col = (cycle - 1) % 40
if (col - x in -1..1) screen[row][col] = true
cycle++
}
for (cmd in generateSequence(::readlnOrNull).map { it.split(" ") }) when {
cmd[0] == "noop" -> tick()
else -> {
tick()
tick()
x += cmd[1].toInt()
}
}
println(part1)
println(screen.joinToString("\n") { it.joinToString("") { c -> if (c) "O" else " " } })
}
Davio
12/10/2022, 12:52 PMcorneil
12/10/2022, 12:54 PMDavio
12/10/2022, 12:57 PMcorneil
12/10/2022, 12:57 PMPaul Martin
12/10/2022, 1:09 PMAnirudh
12/10/2022, 1:30 PMGrzegorz Aniol
12/10/2022, 1:50 PMDavio
12/10/2022, 4:07 PMtodd.ginsberg
12/10/2022, 4:08 PMephemient
12/10/2022, 4:11 PMKevin Del Castillo
12/10/2022, 4:23 PMKevin Del Castillo
12/10/2022, 4:24 PMPaul Martin
12/10/2022, 4:25 PMDavio
12/10/2022, 4:33 PMkenkyee
12/10/2022, 4:43 PM'βͺ' else 'β«'
it was clearly 8 characters? π€
I got the right answer too. Was definitely a cool puzzle today πcorneil
12/10/2022, 4:51 PMMichael BΓΆiers
12/10/2022, 5:55 PMfun main() {
val screen = Array(6) { BooleanArray(40) }
fun String.toRow() = if (this == "noop") sequenceOf(0) else sequenceOf(0, substringAfterLast(" ").toInt())
val (_, part1) = generateSequence(::readlnOrNull).flatMap(String::toRow).foldIndexed(1 to 0) { cycle, (x, p1), n ->
val row = (cycle) / 40
val col = (cycle) % 40
if (col - x in -1..1) screen[row][col] = true
x + n to (cycle + 1).let { if (it in listOf(20, 60, 100, 140, 180, 220)) p1 + it * (x + n) else p1 }
}
println(part1)
println(screen.joinToString("\n") { it.joinToString("") { c -> if (c) "O" else " " } })
}
Joakim Tall
12/10/2022, 6:08 PMJoakim Tall
12/10/2022, 6:08 PMDavio
12/10/2022, 6:11 PMOlaf Gottschalk
12/10/2022, 6:12 PMtodd.ginsberg
12/10/2022, 6:13 PMbuildList
instead of flatMap
.corneil
12/10/2022, 6:14 PMJonathan Kolberg
12/10/2022, 6:15 PMJoakim Tall
12/10/2022, 6:19 PMJoakim Tall
12/10/2022, 6:22 PMJonathan Kolberg
12/10/2022, 6:28 PMDavio
12/10/2022, 6:38 PMDan Fingal-Surma
12/10/2022, 6:53 PMcorneil
12/10/2022, 7:35 PMNeil Banman
12/10/2022, 7:39 PMcorneil
12/10/2022, 7:45 PMJonathan Kolberg
12/10/2022, 8:00 PMNeil Banman
12/10/2022, 9:25 PMinputString.split(' ', '\n').map { it.toIntOrNull() ?: 0 }
. It's "clever" at the expense of obscurity, and I love it.Paul Woitaschek
12/10/2022, 11:18 PMJacob
12/11/2022, 3:30 AMKarloti
12/11/2022, 4:56 AM.scan(1) { acc, value -> acc + value }
use
.scan(1, Int::plus)
Paul Woitaschek
12/11/2022, 5:58 AM