Sha256: 471d1d7d23d945e0bbe7b88150ff3ffc2e742ba2cd7ce7fc434b0273d43db1d8

Contents?: true

Size: 1.01 KB

Versions: 125

Compression:

Stored size: 1.01 KB

Contents

data class Luhn(val number: Long) {

    val checkDigit: Int by lazy { checkDigit(number) }

    val addends: List<Int> by lazy {
        digits(number).withIndex().reversed()
                .map { if (isOdd(it.index)) dbl(it.value) else it.value }
    }

    val checksum: Int by lazy { addends.sum() }

    val isValid: Boolean by lazy { checksum % 10 == 0 }

    val create: Long by lazy {
        val zeroCheckDigitNumber = number * 10
        val luhn = Luhn(zeroCheckDigitNumber)

        if (luhn.isValid) zeroCheckDigitNumber else zeroCheckDigitNumber + (10 - luhn.checksum % 10)
    }

    companion object {
        private fun checkDigit(n: Long) = (n % 10).toInt()

        private fun digits(n: Long): List<Int> = when (n) {
            0L -> emptyList()
            else -> listOf(checkDigit(n)) + digits(n / 10)
        }

        private fun dbl(n: Int): Int {
            val dbled = n * 2
            return if (dbled > 10) dbled - 9 else dbled
        }

        private fun isOdd(i: Int) = i % 2 == 1
    }

}

Version data entries

125 entries across 125 versions & 1 rubygems

Version Path
trackler-2.0.8.24 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.23 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.22 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.21 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.20 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.19 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.18 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.17 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.16 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.15 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.14 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.13 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.12 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.11 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.10 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.9 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.8 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.7 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.6 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt
trackler-2.0.8.5 tracks/kotlin/exercises/luhn/src/example/kotlin/Luhn.kt