Sha256: a34e77e7ba40da92cafed6c77a038bfa2d36beb092968f997ab0d2c1c47421d5

Contents?: true

Size: 1.25 KB

Versions: 188

Compression:

Stored size: 1.25 KB

Contents

import Direction.RIGHT

enum class Direction(val dx: Int, val dy: Int) {
    UP   ( 0, -1),
    RIGHT( 1,  0),
    DOWN ( 0,  1),
    LEFT (-1,  0);

    fun turnRight() = Direction.values()[(ordinal + 1) % Direction.values().size]
}

data class Coordinate(val x: Int, val y: Int) {

    fun step(direction: Direction) = copy(x + direction.dx, y + direction.dy)

    fun isWithinGridOfSize(size: Int) = x in 0..size-1 && y in 0..size-1

}

object SpiralMatrix {

    fun ofSize(size: Int): Array<IntArray> {
        require(size >= 0) { "size must be a non-negative integer" }

        if (size == 0) return emptyArray()

        val result = Array(size, { IntArray(size, {0}) })
        val entryCount = Math.pow(size.toDouble(), 2.0).toInt()

        var coord = Coordinate(0, 0)
        var direction = RIGHT

        for (i in 0 until entryCount) {
            result[coord.y][coord.x] = i + 1

            val maybeNextCoord = coord.step(direction)
            if (maybeNextCoord.isWithinGridOfSize(size) && result[maybeNextCoord.y][maybeNextCoord.x] == 0) {
                coord = maybeNextCoord
            } else {
                direction = direction.turnRight()
                coord = coord.step(direction)
            }
        }

        return result
    }

}

Version data entries

188 entries across 188 versions & 1 rubygems

Version Path
trackler-2.2.1.159 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.158 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.157 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.156 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.155 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.154 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.153 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.152 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.151 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.150 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.149 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.148 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.147 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.146 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.145 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.144 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.143 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.142 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.141 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt
trackler-2.2.1.140 tracks/kotlin/exercises/spiral-matrix/.meta/src/reference/kotlin/SpiralMatrix.kt