`
forestking
  • 浏览: 43825 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Scala 解决 Enigma problem Part 2

阅读更多

解密部分代码:

 

/**
 *
 */
package com.me.acm.problem1009

/**
 * @author Blues
 *
 */

object App {
  val CharSeq = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray
  val CharSeqLowerCae = CharSeq.map(c => c.toLower)
  def main(args: Array[String]): Unit = {
    readAndProcess(readLine, 1)
  }

  def readAndProcess(line: String, counter: Int) {
    val num = line.toInt
    if (num > 0) {

      val input = new Input(CharSeqLowerCae.take(num))
      var preDevice: Device = input;
      for (i <- 0 until 3) {
        val rotorLine = readLine
        val rotor = new Rotor(rotorLine.toCharArray, new Some(preDevice))
        preDevice = rotor
      }

      val output = new Output(CharSeq.take(num), new Some(preDevice))

//      encrpt(readLine, input, counter)
      decrpt(readLine, output, counter)
      readAndProcess(readLine, counter + 1)
    }
  }

  def encrpt(line: String, input: Input, counter: Int) {
    val num = line.toInt
    if (num > 0) {
      val text = readLine.toCharArray()
      val encrptedArray = for (c <- text) yield {
        input.encrpt(c)
      }

      println("Enigma " + counter + ":")
      println(encrptedArray.mkString(""))
    }
  }
  
  def decrpt(line: String, output: Output, counter: Int) {
    val num = line.toInt
    if (num > 0) {
      val text = readLine.toCharArray()
      val decrptedArray = for (c <- text) yield {
        output.decrpt(c)
      }

      println("Enigma " + counter + ":")
      println(decrptedArray.mkString(""))
    }
  }
}

abstract class Device(val codes: Array[Char]) {
  var nextDevice: Option[Device] = None
  val preDevice: Option[Device] = None
  def encrpt(inputIndex: Int): Char
  def decrpt(inputIndex: Int): Char
  def readyForNextToMove: Boolean
}

class Input(codes: Array[Char]) extends Device(codes) {
  def encrpt(inputIndex: Int): Char = {
    nextDevice match {
      case Some(next) => next.encrpt(inputIndex)
      case None => if (inputIndex < codes.length) codes(inputIndex) else '0'
    }
  }

  def encrpt(c: Char): Char = {
    encrpt(App.CharSeqLowerCae.indexOf(c))
  }

  def readyForNextToMove: Boolean = true

  def decrpt(inputIndex: Int): Char = {
    if (inputIndex < codes.length) codes(inputIndex) else '0'
  }
}

class Rotor(codes: Array[Char], override val preDevice: Some[Device]) extends Device(codes) {
  preDevice match {
    case Some(pre) => pre.nextDevice = new Some(this)
  }
  var stepCounter = 0

  var tunnels = for {
    i <- 0 until codes.length
  } yield {
    val code = codes(i)
    (i, App.CharSeq.indexOf(code))
  }

  def encrpt(inputIndex: Int): Char = {
    val tunnel = tunnels.find(_._1 == inputIndex)
    val outputIndex = tunnel match {
      case Some(x) => x._2
      case None => -1
    }

    //    println("found: " + inputIndex + ", " + outputIndex)  

    val encrpted = if (outputIndex >= 0) {
      this.nextDevice match {
        case Some(next) => next.encrpt(outputIndex)
        case None => '0'
      }
    } else {
      '0'
    }

    preDevice match {
      case Some(pre) => {
        if (pre.readyForNextToMove) {
          move
        }
      }
    }

    encrpted
  }

  private def move() {
    tunnels = for {
      tunnel <- tunnels
    } yield {
      ((tunnel._1 + 1) % codes.length, (tunnel._2 + 1) % codes.length)
    }
    stepCounter += 1
  }

  def readyForNextToMove: Boolean = if (stepCounter > 0) stepCounter % codes.length == 0 else false

  def decrpt(inputIndex: Int): Char = {
    val tunnel = tunnels.find(_._2 == inputIndex)
    val outputIndex = tunnel match {
      case Some(x) => x._1
      case None => -1
    }

    val decrpted = if (outputIndex >= 0) {
      this.preDevice match {
        case Some(pre) => pre.decrpt(outputIndex)
      }
    } else {
      '0'
    }

    preDevice match {
      case Some(pre) => {
        if (pre.readyForNextToMove) {
          move
        }
      }
    }
    
    decrpted
  }
}

class Output(codes: Array[Char], override val preDevice: Some[Device]) extends Device(codes) {
  preDevice match {
    case Some(pre) => pre.nextDevice = new Some(this)
  }
  override def encrpt(inputIndex: Int): Char = {
    if (inputIndex < codes.length) codes(inputIndex) else '0'
  }

  def decrpt(inputIndex: Int): Char = {
    preDevice match {
      case Some(pre) => pre.decrpt(inputIndex)
    }
  }
  
  def decrpt(code: Char): Char = {
    decrpt(codes.indexOf(code))
  }
  
  def readyForNextToMove = false
}   
 
0
2
分享到:
评论
2 楼 freezingsky 2013-01-08  
而且连个前后都没说明,天知道这是写什么。
1 楼 闪闪4521 2013-01-08  
一行注释都没有....

相关推荐

    Scala-part2集合框架

    ### Scala 集合框架详解 #### 集合概述 在Scala中,集合框架提供了丰富的数据结构,以便开发者能够高效地处理各种数据组织需求。集合主要分为三类:序列`Seq`、集`Set`以及映射`Map`。所有这些集合都扩展自`...

    eclipse scala 插件part2

    Eclipse Scala 插件是开发Scala程序的重要工具,它为Eclipse IDE提供了对Scala语言的全面支持,使得Java开发者能够无缝地过渡到Scala环境。在本篇中,我们将深入探讨这个插件的功能、安装方法以及如何利用它来提升...

    最好的scala学习 课件

    首先,我们从"Scala进阶之路-part01-基础.pdf"开始,这部分内容主要涵盖了Scala的基础知识。你会学习到Scala的语法结构,包括变量声明、常量、数据类型(如基本类型、引用类型、集合类型)、运算符、流程控制语句...

    scala3 scala3 scala3 scala3 scala3

    Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对现有Scala2代码库的兼容性。 在Scala3中,最重要的变化之一是类型推断的增强。新的Typelevel Scala项目引入...

    scala-2.9.0.1.part2.rar

    scala-2.9.0.1.part2.rarscala-2.9.0.1.part2.rarscala-2.9.0.1.part2.rarscala-2.9.0.1.part2.rarscala-2.9.0.1.part2.rar

    scala sdk scala-2.12.3

    2. **标准库**:Scala的标准库提供了大量的类和模块,包括集合操作、I/O、反射、并发处理等,这些是编写Scala程序的基础。 3. **Scala REPL**:Read-Eval-Print Loop,交互式解释器,允许开发者即时测试代码片段,...

    eclipse scala 插件part3

    Eclipse Scala 插件是为Scala开发者提供的一种强大的集成开发环境(IDE)工具,它将Scala语言与Eclipse IDE的功能紧密结合起来,提升了编程、调试和重构的效率。本部分主要探讨的是Eclipse Scala插件的第三部分,...

    eclipse scala 插件part1

    2. 代码自动完成:当编写Scala代码时,插件会提供智能建议,帮助快速输入常见的语法结构和库方法。 3. 代码导航:通过“查找定义”和“查看实现”等功能,开发者可以迅速定位代码中的相关部分,提高工作效率。 4. ...

    Scala函数式编程

    2 scala很多库在设计的时候,不理解原因,包括Option,Collection的很多看似有冗余的地方 3 很多scala的默认写法,不理解 4 多态的具体化,尤其是协变的意义所在 5 各种重载的符号使用 之前读过 programming in...

    scala-2.9.0.1.part3.rar

    scala-2.9.0.1.part3.rarscala-2.9.0.1.part3.rarscala-2.9.0.1.part3.rarscala-2.9.0.1.part3.rarscala-2.9.0.1.part3.rarscala-2.9.0.1.part3.rar

    IntelliJ IDEA 集成Scala插件-2017.2.13.rar

    "IntelliJ IDEA 集成Scala插件-2017.2.13.rar"这个资源提供了在IntelliJ IDEA 2017.2版本中支持Scala开发的插件,这使得开发者可以在一个统一的环境中编写、调试和测试Scala代码,极大地提高了开发效率。Scala是一种...

    scala实战高清讲解

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面...通过阅读这本书,读者不仅能掌握Scala语言的基础,还能了解到如何利用Scala解决实际问题,提升编程技能。

    scala2.12.1Windows镜像包

    2. **Scala 2.12.1更新与改进**: - **性能提升**:相比于之前的版本,2.12.1在编译速度和运行效率上进行了优化。 - **JVM兼容性**:Scala 2.12.x主要针对Java 8及更高版本进行优化,充分利用了JVM的新特性,如...

    Scala编程实战(包含源码)完整版Alvin Alexander著.part2.rar

    Scala编程实战(包含源码)完整版Alvin Alexander著.part2.rar

    m2e-scala.zip

    Eclipse Scala环境的配置 https://yanxml.blog.csdn.net/article/details/89250222 配套的下载资源. http://alchim31.free.fr/m2e-scala/update-site/ 这个地址被墙了.上传,方便大家离线安装`m2e-scala`.

    Scala编程实战(包含源码)完整版Alvin Alexander著.part1.rar

    Scala编程实战(包含源码)完整版Alvin Alexander著.part1.rar

Global site tag (gtag.js) - Google Analytics