Sha256: 7a1404d2506edf49a70dfab9b8736c08cffd5711750ba1f5f271b72a304f0d77

Contents?: true

Size: 1.71 KB

Versions: 396

Compression:

Stored size: 1.71 KB

Contents

object Say {
  private val smallNums =
    Map(1L -> "one", 2 -> "two", 3 -> "three", 4 -> "four",
      5 -> "five", 6 -> "six", 7 -> "seven", 8 -> "eight", 9 -> "nine",
      10 -> "ten", 11 -> "eleven", 12 -> "twelve", 13 -> "thirteen",
      14 -> "fourteen", 15 -> "fifteen", 16 -> "sixteen", 17 -> "seventeen",
      18 -> "eighteen", 19 -> "nineteen")
  private val tens = IndexedSeq("", "", "twenty", "thirty", "forty", "fifty", "sixty",
    "seventy", "eighty", "ninety")
  private val scales = IndexedSeq("hundred", "thousand", "million",  "billion")

  def inEnglish(n: Long): Option[String] = {
    if (!valid(n)) return None
    if (n == 0) return Some("zero")

    val translatedChunks = longToChunks(n).map(n => translateChunk(n))

    val indicies = Range(0, translatedChunks.size).reverse
    val zipped = indicies.zip(translatedChunks).filter{case (_, s: String) => s.nonEmpty}
    val translated = zipped.map {case (i: Int, s: String) => if (i > 0) s + " " + scales(i) else s}
    Some(translated.mkString(" "))
  }

  private def translateChunk(n: Int): String = {
    val hundredsDigit = n / 100
    val remainder = n % 100

    val w1 = if (hundredsDigit > 0) smallNums(hundredsDigit) + " " + scales.head
    else ""

    val w2 = if (remainder > 19) tens(remainder / 10) + smallNums.get(remainder % 10).map("-" + _).getOrElse("")
    else smallNums.getOrElse(remainder, "")

    List(w1, w2).filter(_.nonEmpty).mkString(" ")
  }

  private def valid(n: Long): Boolean = {
    val lowerBound = 0
    val upperBound = 999999999999L
    n >= lowerBound && n <= upperBound
  }

  private def longToChunks(n: Long): List[Int] =
    (Stream.iterate(n)(_ / 1000)takeWhile(_ != 0)map(l => (l % 1000).asInstanceOf[Int])).toList.reverse
}

Version data entries

396 entries across 396 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/scala/exercises/say/example.scala
trackler-2.2.1.179 tracks/scala/exercises/say/example.scala
trackler-2.2.1.178 tracks/scala/exercises/say/example.scala
trackler-2.2.1.177 tracks/scala/exercises/say/example.scala
trackler-2.2.1.176 tracks/scala/exercises/say/example.scala
trackler-2.2.1.175 tracks/scala/exercises/say/example.scala
trackler-2.2.1.174 tracks/scala/exercises/say/example.scala
trackler-2.2.1.173 tracks/scala/exercises/say/example.scala
trackler-2.2.1.172 tracks/scala/exercises/say/example.scala
trackler-2.2.1.171 tracks/scala/exercises/say/example.scala
trackler-2.2.1.170 tracks/scala/exercises/say/example.scala
trackler-2.2.1.169 tracks/scala/exercises/say/example.scala
trackler-2.2.1.167 tracks/scala/exercises/say/example.scala
trackler-2.2.1.166 tracks/scala/exercises/say/example.scala
trackler-2.2.1.165 tracks/scala/exercises/say/example.scala
trackler-2.2.1.164 tracks/scala/exercises/say/example.scala
trackler-2.2.1.163 tracks/scala/exercises/say/example.scala
trackler-2.2.1.162 tracks/scala/exercises/say/example.scala
trackler-2.2.1.161 tracks/scala/exercises/say/example.scala
trackler-2.2.1.160 tracks/scala/exercises/say/example.scala