Sha256: deaa8a710e2d1a9b95915c17f5f883f19eec76160a17edf809b2c23e787ab702

Contents?: true

Size: 1000 Bytes

Versions: 163

Compression:

Stored size: 1000 Bytes

Contents

object Luhn {

  def validate(numberStr: String): Boolean = {
    def isCandidate(numberStr: String): Boolean =
      numberStr.length > 1 &&
      numberStr.forall(c => c.isDigit || c.isSpaceChar)

    def toLong(numberStr: String): Long =
      numberStr.filter(_.isDigit).toLong

    val number =
      Option(numberStr) filter isCandidate map toLong

    number map (checksum(_) == 0) getOrElse false
  }

  private def checkDigit(number: Long): Int = (number % 10).toInt

  private def addends(number: Long): List[Int] = {
    val zippedDigits = digits(number).zipWithIndex.reverse

    zippedDigits.map{case (m, i) => if (isOdd(i)) dbl(m) else m}
  }

  private def checksum(number: Long): Int = addends(number).sum % 10

  private def digits(n: Long): List[Int] = n match {
    case 0 => Nil
    case _ => List((n % 10).toInt) ++ digits(n / 10)
  }

  private def dbl(n: Int) = {
    val dbled = n * 2

    if (dbled > 10) dbled - 9 else dbled
  }

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

Version data entries

163 entries across 163 versions & 1 rubygems

Version Path
trackler-2.2.1.10 tracks/scala/exercises/luhn/example.scala
trackler-2.2.1.9 tracks/scala/exercises/luhn/example.scala
trackler-2.2.1.8 tracks/scala/exercises/luhn/example.scala
trackler-2.2.1.7 tracks/scala/exercises/luhn/example.scala
trackler-2.2.1.6 tracks/scala/exercises/luhn/example.scala
trackler-2.2.1.5 tracks/scala/exercises/luhn/example.scala
trackler-2.2.1.4 tracks/scala/exercises/luhn/example.scala
trackler-2.2.1.3 tracks/scala/exercises/luhn/example.scala
trackler-2.2.1.2 tracks/scala/exercises/luhn/example.scala
trackler-2.2.1.1 tracks/scala/exercises/luhn/example.scala
trackler-2.2.1.0 tracks/scala/exercises/luhn/example.scala
trackler-2.2.0.6 tracks/scala/exercises/luhn/example.scala
trackler-2.2.0.5 tracks/scala/exercises/luhn/example.scala
trackler-2.2.0.4 tracks/scala/exercises/luhn/example.scala
trackler-2.2.0.3 tracks/scala/exercises/luhn/example.scala
trackler-2.2.0.2 tracks/scala/exercises/luhn/example.scala
trackler-2.2.0.1 tracks/scala/exercises/luhn/example.scala
trackler-2.2.0.0 tracks/scala/exercises/luhn/example.scala
trackler-2.1.0.55 tracks/scala/exercises/luhn/example.scala
trackler-2.1.0.54 tracks/scala/exercises/luhn/example.scala