-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmatrix-spiral-order.kts
38 lines (32 loc) · 1.11 KB
/
matrix-spiral-order.kts
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
var rows = 5
var columns = 6
var rStart = 1
var cStart = 4
data class Coordinates(val row: Int, val column: Int)
fun spiral(): Sequence<Coordinates> = sequence {
var row = 0
var col = 0
yield(Coordinates(row, col))
val ordinals = generateSequence(1) { it + 1}
val sideSizes = ordinals.iterator()
while (true) {
var sideSize = sideSizes.next()
// →
for (n in 0 until sideSize)
yield(Coordinates(row, ++col))
// ↓
for (n in 0 until sideSize)
yield(Coordinates(++row, col))
var nextSideSize = sideSizes.next()
// ←
for (n in 0 until nextSideSize)
yield(Coordinates(row, --col))
// ↑
for (n in 0 until nextSideSize)
yield(Coordinates(--row, col))
}
}
var spiralCoordinates = spiral().map{ Coordinates(it.row+rStart, it.column+cStart)}
var onGridSpiral = spiralCoordinates.filter { it.row in 0..(rows-1) && it.column in 0..(columns-1) }
var gridInSpiralOrder = onGridSpiral.take(rows*columns)
"\n"+gridInSpiralOrder.map{ "[${it.row}, ${it.column}]"}.joinToString("\n")