Sha256: fc7b12e42139c3d939dc0d28ce0f21983e41634cf583709b45df8b0d369264f2

Contents?: true

Size: 1.18 KB

Versions: 295

Compression:

Stored size: 1.18 KB

Contents

case class RailFenceCipher(rails: Int) {
  private val size = rails * 2 - 2

  def encode(clearText: String): String =
    clearText
      .zipWithIndex
      .map { case (c, i) => (track(i), c) }
      .groupBy {_._1}
      .toSeq
      .sortBy { case (t, _) => t }
      .flatMap { case (t, v) => v.map { case (_, c) => c }}
      .mkString

  def decode (encodedText: String): String =
    Range.apply(0, encodedText.length)
      .groupBy(i => track(i))
      .toSeq
      .sortBy{ case (i, _) => i}
      .flatMap { case (_, v) => v }
      .zip(encodedText)
      .sortBy { case (i, _) => i }
      .map { case (_, c) => c }
      .mkString

  private def track(i: Int): Int = {
    if (isCorrectRail(i))
      0
    else if (isCorrectRail(i - rails + 1)) {
      rails - 1
    } else
      Range.inclusive(1, rails - 1)
        .filter{j => isCorrectRail(i - j) || isCorrectRail(i - size + j)}
        .head
  }

  private def isCorrectRail(i: Int) = i % size == 0
}

object RailFenceCipher {

  def encode(clearText: String, rails: Int): String =
    RailFenceCipher(rails).encode(clearText)

  def decode(encodedText: String, rails: Int): String =
    RailFenceCipher(rails).decode(encodedText)
}

Version data entries

295 entries across 295 versions & 1 rubygems

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