@@ -4,13 +4,14 @@ import xyz.usbpc.aoc.Day
4
4
import xyz.usbpc.aoc.inputgetter.AdventOfCode
5
5
import xyz.usbpc.utils.repeat
6
6
import java.lang.StringBuilder
7
- import kotlin.math.max
7
+ import kotlin.math.min
8
8
9
9
class Day16 (override val adventOfCode : AdventOfCode ) : Day {
10
10
override val day = 16
11
11
12
12
val input = adventOfCode.getInput(2019 , day).map { Character .getNumericValue(it) }
13
13
// val input = "12345678".map { Character.getNumericValue(it) }
14
+ // val input = "02935109699940807407585447034323".map { Character.getNumericValue(it) }
14
15
15
16
class PatternGenerator (val num : Int ): Iterator<Int>, Iterable<Int> {
16
17
override fun iterator (): Iterator <Int > = this
@@ -123,45 +124,49 @@ class Day16(override val adventOfCode: AdventOfCode) : Day {
123
124
val ret = mutableListOf<List <E >>()
124
125
var cur = 0
125
126
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)))
127
128
cur + = step
128
129
}
129
130
return ret
130
131
}
131
132
132
133
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
+
137
138
138
139
// println(ranges.first().first)
139
140
140
141
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]
155
146
}
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
+ }
160
165
}
161
166
162
167
val toSkip = input.take(7 ).fold( StringBuilder () ) { builder, i -> builder.append(i) }.toString().toInt()
163
168
164
169
// 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) }
166
171
}
167
172
}
0 commit comments