enigma problem 详见 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1009
我想要尝试使用scala去实现,但还没有完成;目前只是实现了加密的步骤;(原题是需要解密的, 但我想理解了加密的过程,应该对解密会用帮助, 有时间会试着实现解密的部分)。 当然重点仍然是学习scala
以下是代码部分
/**
*
*/
package com.me.acm.problems.acm1009
/**
* @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))
process(readLine, input, counter)
readAndProcess(readLine, counter + 1)
}
}
def process(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(""))
}
}
}
abstract class Device(val codes: Array[Char]) {
var nextDevice: Option[Device] = None
val preDevice: Option[Device] = None
def encrpt(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
}
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
}
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 readyForNextToMove = false
}
我觉得有几个需要注意的地方:
1. scala 的option + pattern match 非常强大,这里主要是为了避免NPE;
2. 代码里的tunnel是个Tuple2, 相应的还有Tuple3, Tuple4, 一直到Tuple22, 这个也非常好用; Tuple2的定义就是类似(x, y)形式;如果用Java实现,必须定义一个class;
3. class 里面声明的变量必须要初始化,比如nextDevice,这里必须要给它一个初始值;理由是如果不提供, scala编译器无法将之和abstract 方法定义区分开。这个和Java还是很不一样的。
分享到:
相关推荐
1. 语法高亮:插件会为Scala代码提供颜色编码,帮助开发者更好地识别不同类型的元素,如变量、函数、类等。 2. 代码自动完成:当编写Scala代码时,插件会提供智能建议,帮助快速输入常见的语法结构和库方法。 3. ...
### Scala 集合框架详解 #### 集合概述 在Scala中,集合框架提供了丰富的数据结构,以便开发者能够高效地处理各种数据组织需求。集合主要分为三类:序列`Seq`、集`Set`以及映射`Map`。所有这些集合都扩展自`...
首先,我们从"Scala进阶之路-part01-基础.pdf"开始,这部分内容主要涵盖了Scala的基础知识。你会学习到Scala的语法结构,包括变量声明、常量、数据类型(如基本类型、引用类型、集合类型)、运算符、流程控制语句...
Scala编程实战(包含源码)完整版Alvin Alexander著.part1.rar
Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对现有Scala2代码库的兼容性。 在Scala3中,最重要的变化之一是类型推断的增强。新的Typelevel Scala项目引入...
scala-2.9.0.1.part1.rarscala-2.9.0.1.part1.rarscala-2.9.0.1.part1.rarscala-2.9.0.1.part1.rarscala-2.9.0.1.part1.rarscala-2.9.0.1.part1.rar
1. **var、val 和 def 的区别**: - `var` 定义可变变量,可以多次赋值。 - `val` 定义不可变变量,一旦赋值后不能更改。 - `def` 用于定义函数,它不创建任何实例,只定义行为。 2. **trait(特质)和 abstract...
1. **编译器**:Scala编译器将Scala源代码转换为Java字节码,使得程序可以在JVM上运行。2.12.3版本的编译器支持最新的语言特性,并对错误报告和编译速度进行了改进。 2. **标准库**:Scala的标准库提供了大量的类和...
Eclipse Scala 插件是开发Scala程序的重要工具,它为Eclipse IDE提供了对Scala语言的全面支持,使得Java开发者能够无缝地过渡到Scala环境。在本篇中,我们将深入探讨这个插件的功能、安装方法以及如何利用它来提升...
`0.6.1.201303191402-80dd4a7.jar`是该库的一个版本,帮助用户在Scala项目中进行代码改进。 2. **测试支持**: - `org.scala-ide.sdt.scalatest`: 这个组件提供了对ScalaTest的支持,一个流行的Scala测试框架。...
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
1. **Scala基础** - 类与对象:Scala中的所有数据都是对象,类是创建对象的模板。它支持单例对象和伴生对象,这为设计模式提供了简洁的实现。 - 函数:Scala将函数视为一等公民,可以作为变量赋值、作为参数传递和...
第一部分:"Scala入门及进阶-part01-基础知识.pdf" 涵盖了Scala的基础概念。在这里,你会学习到Scala的安装与环境配置,理解Scala的基本语法,包括变量声明、数据类型(如基本类型、引用类型和集合类型)、控制结构...
"scala-intellij-bin-2021.1.22.zip" 是一个包含IntelliJ IDEA的Scala插件的压缩包,版本号为2021.1.22,适用于IntelliJ IDEA的2021.1版本。 Scala插件是IntelliJ IDEA为了提升Scala开发体验而设计的,它提供了丰富...
1. **Scala语言特性**: - **类型系统**:Scala具有强大的静态类型系统,允许类型推断,使得代码更简洁。 - **面向对象**:支持类、接口、继承和多态,同时引入了特质(trait),提供了一种灵活的实现多重继承的...
1. 下载并解压"scala-2.12.10.zip"文件。 2. 将解压后的Scala目录添加到系统的PATH环境变量中,以便在命令行中直接调用 Scala 命令。 3. 确保已安装Java Development Kit (JDK) 8 或更高版本,因为Scala需要JVM才能...
1. **Scala与MyBatis的集成** - Scala的静态类型系统和强大的表达能力使其成为构建复杂应用程序的良好选择,而MyBatis以其灵活性和易用性在Java世界中占有一席之地。通过使用Scala的Java互操作性,我们可以无缝地在...
1. 确保你的系统安装了Java Development Kit (JDK) 7或更高版本,因为Scala需要JDK来运行。 2. 添加Scala和Java的bin目录到PATH环境变量时,需按照正确的顺序,通常是先添加Java的路径,再添加Scala的路径。 3. 使用...