Sha256: 42e1cda0d2afa7b086600dcd425c8f80182ff165919696d70148c8db254ed1c0

Contents?: true

Size: 1.12 KB

Versions: 396

Compression:

Stored size: 1.12 KB

Contents

import java.util.Random

data class Cipher(val key: String) {
    constructor() : this(generateRandomKey())
    init {
        require(key.matches(Regex("^[a-z]+$")), { "Invalid key: $key" })
    }

    companion object {
        val random = Random()
        val alphabet = ('a'..'z').toList()

        private fun generateRandomKey() = generateSequence { alphabet[random.nextInt(alphabet.size)] }.take(100).joinToString("")
    }

    fun encode(s: String): String = s.mapIndexed { index, char ->  encodeChar(char, index)}.joinToString("")
    fun decode(s: String): String = s.mapIndexed { index, char ->  decodeChar(char, index)}.joinToString("")

    private fun encodeChar(character: Char, index: Int): Char {
        var alphaIdx = alphabet.indexOf(character) + alphabet.indexOf(key[index])
        if(alphaIdx >= alphabet.size) alphaIdx -= alphabet.size

        return alphabet[alphaIdx]
    }

    private fun decodeChar(character: Char, index: Int): Char {
        var alphaIdx = alphabet.indexOf(character) - alphabet.indexOf(key[index])
        if(alphaIdx < 0) alphaIdx += alphabet.size

        return alphabet[alphaIdx]
    }

}

Version data entries

396 entries across 396 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.179 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.178 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.177 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.176 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.175 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.174 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.173 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.172 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.171 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.170 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.169 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.167 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.166 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.165 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.164 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.163 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.162 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.161 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt
trackler-2.2.1.160 tracks/kotlin/exercises/simple-cipher/.meta/src/reference/kotlin/Cipher.kt