-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathy24day4.kt
More file actions
40 lines (38 loc) · 1.79 KB
/
Copy pathy24day4.kt
File metadata and controls
40 lines (38 loc) · 1.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
fun main() {
val rows = generateSequence { readlnOrNull()?.toList() }.toList()
// part 1
val pattern = "XMAS".toList()
rows.apply {
val subindices = this[0].indices
val diags = (pattern.size - indices.count())..(subindices.count() - pattern.size)
sequenceOf(
indices.asSequence().map { i -> subindices.asSequence().map { j -> i to j } },
indices.asSequence().map { i -> subindices.reversed().asSequence().map { j -> i to j } },
subindices.asSequence().map { j -> indices.asSequence().map { i -> i to j } },
subindices.asSequence().map { j -> indices.reversed().asSequence().map { i -> i to j } },
diags.asSequence().map { j -> indices.asSequence().map { i -> i to j + i } },
diags.asSequence().map { j -> indices.reversed().asSequence().map { i -> i to j + i } },
diags.asSequence().map { j -> indices.asSequence().map { i -> i to indices.last + j - i } },
diags.asSequence().map { j -> indices.reversed().asSequence().map { i -> i to indices.last + j - i } },
).sumOf { directions ->
directions.sumOf { path ->
path.filter { (i, j) ->
i in indices && j in subindices
}.map { (i, j) ->
this[i][j]
}.windowed(pattern.size) { s ->
s == pattern
}.count { it }
}
}.also(::println)
}
// part 2
(1 until rows.indices.last).sumOf { i ->
(1 until rows[i].indices.last).count { j ->
rows[i][j] == 'A' && sequenceOf(
setOf(rows[i-1][j-1], rows[i+1][j+1]),
setOf(rows[i-1][j+1], rows[i+1][j-1]),
).all { it == setOf('M', 'S') }
}
}.also(::println)
}