解密部分代码:
/**
*
*/
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
}
分享到:
相关推荐
### Scala 集合框架详解 #### 集合概述 在Scala中,集合框架提供了丰富的数据结构,以便开发者能够高效地处理各种数据组织需求。集合主要分为三类:序列`Seq`、集`Set`以及映射`Map`。所有这些集合都扩展自`...
Eclipse Scala 插件是开发Scala程序的重要工具,它为Eclipse IDE提供了对Scala语言的全面支持,使得Java开发者能够无缝地过渡到Scala环境。在本篇中,我们将深入探讨这个插件的功能、安装方法以及如何利用它来提升...
首先,我们从"Scala进阶之路-part01-基础.pdf"开始,这部分内容主要涵盖了Scala的基础知识。你会学习到Scala的语法结构,包括变量声明、常量、数据类型(如基本类型、引用类型、集合类型)、运算符、流程控制语句...
Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对现有Scala2代码库的兼容性。 在Scala3中,最重要的变化之一是类型推断的增强。新的Typelevel Scala项目引入...
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
2. **标准库**:Scala的标准库提供了大量的类和模块,包括集合操作、I/O、反射、并发处理等,这些是编写Scala程序的基础。 3. **Scala REPL**:Read-Eval-Print Loop,交互式解释器,允许开发者即时测试代码片段,...
Eclipse Scala 插件是为Scala开发者提供的一种强大的集成开发环境(IDE)工具,它将Scala语言与Eclipse IDE的功能紧密结合起来,提升了编程、调试和重构的效率。本部分主要探讨的是Eclipse Scala插件的第三部分,...
2. 代码自动完成:当编写Scala代码时,插件会提供智能建议,帮助快速输入常见的语法结构和库方法。 3. 代码导航:通过“查找定义”和“查看实现”等功能,开发者可以迅速定位代码中的相关部分,提高工作效率。 4. ...
2 scala很多库在设计的时候,不理解原因,包括Option,Collection的很多看似有冗余的地方 3 很多scala的默认写法,不理解 4 多态的具体化,尤其是协变的意义所在 5 各种重载的符号使用 之前读过 programming in...
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 2017.2版本中支持Scala开发的插件,这使得开发者可以在一个统一的环境中编写、调试和测试Scala代码,极大地提高了开发效率。Scala是一种...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面...通过阅读这本书,读者不仅能掌握Scala语言的基础,还能了解到如何利用Scala解决实际问题,提升编程技能。
2. **Scala 2.12.1更新与改进**: - **性能提升**:相比于之前的版本,2.12.1在编译速度和运行效率上进行了优化。 - **JVM兼容性**:Scala 2.12.x主要针对Java 8及更高版本进行优化,充分利用了JVM的新特性,如...
Scala编程实战(包含源码)完整版Alvin Alexander著.part2.rar
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