Skip to content

Commit 5a4d754

Browse files
author
kjh
committed
2019 Day 16 Both parts solved.
1 parent 9dc4f90 commit 5a4d754

File tree

1 file changed

+30
-25
lines changed

1 file changed

+30
-25
lines changed

src/main/kotlin/advent2019/Day16.kt

+30-25
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import xyz.usbpc.aoc.Day
44
import xyz.usbpc.aoc.inputgetter.AdventOfCode
55
import xyz.usbpc.utils.repeat
66
import java.lang.StringBuilder
7-
import kotlin.math.max
7+
import kotlin.math.min
88

99
class Day16(override val adventOfCode: AdventOfCode) : Day {
1010
override val day = 16
1111

1212
val input = adventOfCode.getInput(2019, day).map { Character.getNumericValue(it) }
1313
//val input = "12345678".map { Character.getNumericValue(it) }
14+
//val input = "02935109699940807407585447034323".map { Character.getNumericValue(it) }
1415

1516
class PatternGenerator(val num: Int): Iterator<Int>, Iterable<Int> {
1617
override fun iterator(): Iterator<Int> = this
@@ -123,45 +124,49 @@ class Day16(override val adventOfCode: AdventOfCode) : Day {
123124
val ret = mutableListOf<List<E>>()
124125
var cur = 0
125126
while (cur < this.size) {
126-
ret.add(this.subList(cur, kotlin.math.min(cur+size, this.size)))
127+
ret.add(this.subList(cur, min(cur+size, this.size)))
127128
cur += step
128129
}
129130
return ret
130131
}
131132

132133
override fun part2() : Any {
133-
//var cur = input.toMutableList()
134-
//var other = input.toMutableList()
135-
var cur = input.repeat(10_000).flatten().toMutableList()
136-
var other = cur.toMutableList()
134+
//val cur = input.toMutableList()
135+
val cur = input.repeat(10_000).flatten().toMutableList()
136+
val list = IntArray(cur.size+1)
137+
137138

138139
//println(ranges.first().first)
139140

140141
repeat(100) {
141-
var counter = 0
142-
for (i in 0..cur.lastIndex) {
143-
if (i % 100 == 0) {
144-
println("${counter} done, of $it iterations.")
145-
counter += 100
146-
}
147-
val pos = cur.subList(i, cur.size).subListWindowed(i+1, 4*(i+1)).map { it.sum() }.sum()
148-
val neg = if (3*i + 2 >= cur.size) {
149-
0
150-
} else {
151-
cur.subList(3*i + 2, cur.size).subListWindowed(i+1, 4*(i+1)).map { it.sum() }.sum()
152-
}
153-
//println("pos: $pos, neg $neg")
154-
other[i] = (pos - neg) absmod 10
142+
println("Am in iteration $it")
143+
list[list.lastIndex-1] = cur.last()
144+
for (i in cur.size-2 downTo 0) {
145+
list[i] = list[i+1] + cur[i]
155146
}
156-
val tmp = cur
157-
cur = other
158-
other = tmp
159-
//println(cur)
147+
for (pos in 0 until cur.size) {
148+
var chunk = pos
149+
var tmp = 0
150+
while (chunk < cur.size) {
151+
152+
tmp += list[chunk] - list[min(chunk + pos, cur.lastIndex)+1]
153+
154+
chunk += (pos+1) * 2
155+
156+
if (chunk >= cur.size)
157+
continue
158+
159+
tmp -= list[chunk] - list[min(chunk + pos, cur.lastIndex)+1]
160+
161+
chunk += (pos+1) * 2
162+
}
163+
cur[pos] = abs(tmp % 10)
164+
}
160165
}
161166

162167
val toSkip = input.take(7).fold( StringBuilder() ) { builder, i -> builder.append(i) }.toString().toInt()
163168

164169
//return cur.take(8).fold(StringBuilder()) { a, b -> a.append(b) }
165-
return cur.subList(toSkip-1, toSkip+8).fold(StringBuilder()) { a, b -> a.append(b) }
170+
return cur.subList(toSkip, toSkip+8).fold(StringBuilder()) { a, b -> a.append(b) }
166171
}
167172
}

0 commit comments

Comments
 (0)