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