Sha256: 96719388696803f5fc9c3da432c95fe799c1919d27a9e7d1bbfeae29dbc17ac1

Contents?: true

Size: 870 Bytes

Versions: 337

Compression:

Stored size: 870 Bytes

Contents

object RunLengthEncoding {
  type Plain = String
  type Encoded = String

  def encode(str: Plain): Encoded = {
    def encodeGroup(xs: Seq[Char]): Seq[Char] =
      if (xs.length > 1) s"${xs.length}${xs.head}"
      else xs mkString

    splitByEquals(str) flatMap encodeGroup mkString
  }

  def decode(str: Encoded): Plain = {
    val nextChar: ((Int, Seq[Char]), Char) => (Int, Seq[Char]) = {
      case ((n, xs), x) =>
        if (x.isDigit) (n * 10 + x.asDigit, xs)
        else if (n == 0) (0, x +: xs)
        else (0, Seq.fill(n)(x) ++ xs)
    }

    val result = str.foldLeft((0, Seq.empty[Char]))(nextChar)
    result._2.reverse mkString
  }

  private def splitByEquals[T](xs: Seq[T]): Seq[Seq[T]] =
    xs match {
      case Seq() => Seq()
      case x +: xss =>
        val fs = xs takeWhile (_ == x)
        fs +: splitByEquals(xs drop fs.length)
    }
}

Version data entries

337 entries across 337 versions & 1 rubygems

Version Path
trackler-2.2.1.119 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.118 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.117 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.116 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.115 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.114 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.113 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.111 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.110 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.109 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.108 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.107 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.106 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.105 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.104 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.103 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.102 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.101 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.100 tracks/scala/exercises/run-length-encoding/example.scala
trackler-2.2.1.99 tracks/scala/exercises/run-length-encoding/example.scala