Sha256: bb75b6c7018d50d88d547309a707180dbf8d6d0fd00b0cfba4d21675e96a69e5

Contents?: true

Size: 1.87 KB

Versions: 163

Compression:

Stored size: 1.87 KB

Contents

import scala.annotation.tailrec

object OcrNumbers {

  def convert(grid: List[String]): String = {
    val validGridSize = grid.length % 4 != 0 || !grid.forall(_.length % 3 == 0)
    if (validGridSize)
      "?"
    else {
      ocrReadoutLines(grid).map(ocrLine => {
        val iterator = ocrLine.iterator
        val line0 = iterator.next()
        val line1 = iterator.next()
        val line2 = iterator.next()
        val line3 = iterator.next()

        toDigits(line0, line1, line2, line3, "")
      }).mkString(",")
    }
  }

  private def ocrReadoutLines(grid: List[String]) = grid.grouped(4)

  @tailrec
  private def toDigits(line0: String, line1: String,
                       line2: String, line3: String,
                       acc: String): String = {
    if (line0.isEmpty || line1.isEmpty || line2.isEmpty || line3.isEmpty) acc
    else {
      val (l0Head, l0Tail) = line0.splitAt(3)
      val (l1Head, l1Tail) = line1.splitAt(3)
      val (l2Head, l2Tail) = line2.splitAt(3)
      val (l3Head, l3Tail) = line3.splitAt(3)

      val ocrDigit = List(l0Head, l1Head, l2Head, l3Head)
      val digit = fontToDigit.getOrElse(ocrDigit, '?')

      toDigits(l0Tail, l1Tail, l2Tail, l3Tail, acc + digit)
    }
  }

  private lazy val fontToDigit = Map(List(" _ "
    , "| |"
    , "|_|"
    , "   ") -> '0',
    List("   "
      , "  |"
      , "  |"
      , "   ") -> '1',
    List(" _ "
      , " _|"
      , "|_ "
      , "   ") -> '2',
    List(" _ "
      , " _|"
      , " _|"
      , "   ") -> '3',
    List("   "
      , "|_|"
      , "  |"
      , "   ") -> '4',
    List(" _ "
      , "|_ "
      , " _|"
      , "   ") -> '5',
    List(" _ "
      , "|_ "
      , "|_|"
      , "   ") -> '6',
    List(" _ "
      , "  |"
      , "  |"
      , "   ") -> '7',
    List(" _ "
      , "|_|"
      , "|_|"
      , "   ") -> '8',
    List(" _ "
      , "|_|"
      , " _|"
      , "   ") -> '9')
}

Version data entries

163 entries across 163 versions & 1 rubygems

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