Sha256: d003e969f5170659f284cef1d7720cdc0a99d64c82ccd55080a35268ceecfd32

Contents?: true

Size: 978 Bytes

Versions: 396

Compression:

Stored size: 978 Bytes

Contents

import scala.util.Random

case class Cipher(keyOpt: Option[String]) {
  require(keyOpt.isEmpty || keyOpt.get.matches("^[a-z]+$"))

  private val alphabet = ('a' to 'z').toVector
  private lazy val randomKey = Seq.fill(26)((Random.nextInt(25) + 'a').toChar).mkString

  val key = keyOpt.getOrElse(randomKey)

  def encode(s: String): String =
    (for (i <- 0 until s.length) yield encodeChar(s, i)).mkString

  private def encodeChar(plainText: String, index: Int) = {
    var alphaIdx = alphabet.indexOf(plainText(index)) + alphabet.indexOf(key(index))

    if (alphaIdx >= alphabet.length) alphaIdx -= alphabet.length

    alphabet(alphaIdx)
  }

  def decode(s: String): String =
    (for (i <- 0 until s.length) yield decodeChar(s, i)).mkString

  private def decodeChar(cipherText: String, index: Int) = {
    var alphaIdx = alphabet.indexOf(cipherText(index)) - alphabet.indexOf(key(index))

    if (alphaIdx < 0) alphaIdx += alphabet.length

    alphabet(alphaIdx)
  }
}

Version data entries

396 entries across 396 versions & 1 rubygems

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