adamratzman
12/09/2020, 4:38 AMDavid Whittaker
12/09/2020, 4:43 AMadamratzman
12/09/2020, 4:58 AMadamratzman
12/09/2020, 4:58 AMDavid Whittaker
12/09/2020, 5:14 AMadamratzman
12/09/2020, 5:14 AMadamratzman
12/09/2020, 5:14 AMDavid Whittaker
12/09/2020, 5:16 AMDavid Whittaker
12/09/2020, 5:16 AMadamratzman
12/09/2020, 5:16 AMadamratzman
12/09/2020, 5:16 AMDavid Whittaker
12/09/2020, 5:17 AMadamratzman
12/09/2020, 5:17 AMadamratzman
12/09/2020, 5:18 AMDavid Whittaker
12/09/2020, 5:18 AMadamratzman
12/09/2020, 5:21 AMval numbers = lines.map { it.toLong() }
val preamble = 25
override fun solvePart1(): Any {
return (25..numbers.lastIndex).first { index ->
numbers.subList(index - preamble, index).times(2).none { it.sum() == numbers[index] }
}.let { numbers[it] }
}
pavi2410
12/09/2020, 5:26 AM.times(2)
come from? I couldn't find itadamratzman
12/09/2020, 5:27 AMadamratzman
12/09/2020, 5:28 AMfun <T> List<T>.times(repetitions: Int, current: List<List<T>> = listOf()): List<List<T>> {
return when {
repetitions == 0 -> current
current.isEmpty() -> times(repetitions - 1, map { listOf(it) })
else -> {
times(repetitions - 1, current.map { list ->
map { value -> list + value }
}.flatten())
}
}
}
@pavi2410pavi2410
12/09/2020, 5:28 AMadamratzman
12/09/2020, 5:28 AMadamratzman
12/09/2020, 5:28 AMDavid Whittaker
12/09/2020, 5:28 AMfind(i)
for each line number i:
private fun find(i: Int): Boolean {
for (j in i - 25 until i) {
for (k in i - 25 until i) {
if (j != k && lines[j] + lines[k] == lines[i]) {
return true
}
}
}
return false
}
adamratzman
12/09/2020, 5:29 AMDavid Whittaker
12/09/2020, 5:29 AMpavi2410
12/09/2020, 5:30 AMfor (i in 25..numbers.size) {
val number = numbers[i]
val preamble = numbers.drop(i - 25).take(25)
var found = false
for (a in preamble) {
for (b in preamble) {
if (a != b && a + b == number) {
found = true
continue
}
}
}
if (!found) {
output = number
break
}
}
adamratzman
12/09/2020, 5:30 AMDavid Whittaker
12/09/2020, 5:31 AMadamratzman
12/09/2020, 5:31 AMadamratzman
12/09/2020, 5:34 AMoverride fun solvePart2(): Any {
val toFind = solvePart1() as Long
return (2..25).asSequence().map { size ->
(0..numbers.lastIndex - size)
.map { numbers.subList(it, it + size) }
.find { it.sum() == toFind }
}.first { it != null }!!.let { found -> found.minOrNull()!! + found.maxOrNull()!! }
}
Jakub Gwóźdź
12/09/2020, 6:59 AMJakub Gwóźdź
12/09/2020, 7:00 AMEdgars
12/09/2020, 7:27 AMJoris PZ
12/09/2020, 7:43 AMpairs
extension function I wrote for day 1. Was a bit worried this approach would have performance issues but it runs fast enough.
Also, for the first time I think this year, KotlinJS slightly outperforms the JVM!
| Platform | Average (ms)| Measurements (ms) |
| -----------------| ------------|------------------:|
| GraalVM | 32.6 ± 36.3| `183, 68, 41, 25, 18, 19, 21, 19, 26, 20, 24, 18, 24, 20, 18, 20, 19, 18, 26, 17`|
| Node JS | 32.5 ± 22.5| `118, 57, 59, 33, 32, 22, 24, 29, 21, 20, 20, 21, 21, 20, 24, 24, 21, 25, 21, 26`|
| Native | 105 ± 3.7 | `103, 106, 106, 102, 109, 108, 100, 100, 105, 108, 100, 106, 114, 109, 107, 105, 106, 100, 107, 101`|
ephemient
12/09/2020, 7:50 AM.windowed()
doesn't fit great here, since it always wants to construct a list of resultsephemient
12/09/2020, 7:52 AMJoris PZ
12/09/2020, 7:55 AMJakub Gwóźdź
12/09/2020, 9:31 AMandyb
12/09/2020, 1:31 PMfun part2(numbers:List<Long>, target: Long): List<Long>{
val queue = ArrayDeque(numbers)
val window = ArrayDeque<Long>()
var runningTotal = 0L
while (runningTotal != target || window.size < 2){
while (runningTotal < target || window.size < 2){
val next = queue.removeFirst()
runningTotal += next
window.addLast(next)
}
while (runningTotal > target){
runningTotal -= window.removeFirst()
}
}
return window.toList()
}
todd.ginsberg
12/09/2020, 2:26 PMtodd.ginsberg
12/09/2020, 2:26 PMtodd.ginsberg
12/09/2020, 2:27 PMprivate fun List<Long>.preambleIsValid(): Boolean {
val target = this.last()
val subjects = this.dropLast(1).toSet()
return subjects.any { target - it in subjects }
}
todd.ginsberg
12/09/2020, 2:27 PMandyb
12/09/2020, 2:33 PMtodd.ginsberg
12/09/2020, 2:34 PMandyb
12/09/2020, 2:43 PMmickeelm
12/09/2020, 2:46 PMilya.gorbunov
12/09/2020, 3:20 PMval prefixSum = numbers.scan(0L) { acc, e -> acc + e }
for (start in numbers.indices) {
for (end in start + 2..numbers.size) {
val sum = prefixSum[end] - prefixSum[start]
if (sum == outlier) {
val range = numbers.subList(start, end)
println(range.minOrNull()!! + range.maxOrNull()!!)
}
}
}
bjonnh
12/09/2020, 3:39 PMbjonnh
12/09/2020, 3:40 PMbjonnh
12/09/2020, 3:41 PMephemient
12/09/2020, 3:45 PMephemient
12/09/2020, 3:46 PMbjonnh
12/09/2020, 3:46 PMbjonnh
12/09/2020, 3:46 PMbjonnh
12/09/2020, 3:46 PMbjonnh
12/09/2020, 3:48 PMJoris PZ
12/09/2020, 3:48 PMfun <T> Boolean.ifTrueOrNull(f: () -> T): T = if (this) f() else null
? I don't think it's in the standard library, but if this is what you're talking about then there you have it 🙂bjonnh
12/09/2020, 4:21 PMbjonnh
12/09/2020, 4:21 PMNir
12/09/2020, 4:32 PMNir
12/09/2020, 4:32 PMNir
12/09/2020, 4:34 PMNir
12/09/2020, 4:34 PMNir
12/09/2020, 4:35 PMilya.gorbunov
12/09/2020, 5:32 PMJakub Gwóźdź
12/09/2020, 5:35 PMJakub Gwóźdź
12/09/2020, 5:43 PMNir
12/09/2020, 5:46 PMNir
12/09/2020, 5:47 PMephemient
12/10/2020, 1:43 PM