ACM problem http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1042
主要是为了学习scala,使用scala去解决上面提到的ACM问题,不会是最有效率的方式,而且也没法提交代码进行验证;
package com.me.acm.p1042 import scala.collection.mutable.ArrayBuffer object WsCipher extends App { //定义一个Regex pattern,可以用于提取类似 2 3 1,并绑定每个值到一个变量;(\d+),括号是必 //须得,三个括号对应三个变量,一个,只定义一个变量;其他和Java Regex是一样的; val NUMBERS = """(\d+) (\d+) (\d+)""".r val Group1 = "([a-i])".r val Group2 = "([j-r])".r val Group3 = "([s-z]|_)".r // _ 在这里表示初始值,这里是NULL var g1: Group = _ var g2: Group = _ var g3: Group = _ //这种方式可以从标准输入按行读取,直到读到0 0 0为止;这种方式和处理普通的Iterator, List, //Set是一样的; Iterator.continually(Console.readLine).takeWhile(_ != "0 0 0").foreach { // _ again!当参数没有歧义的使用时,比如只有一个参数,就可以不用定义参数,而直接用_表示; //scala 会正确的推断出其类型; 整个模式匹配构成了一个函数字面量; _ match { //NUNMBERS可以这样使用; case NUMBERS(k1, k2, k3) => { //k1 toInt 其实是 k1.toInt的变种 g1 = Group(k1 toInt, ArrayBuffer.empty) g2 = Group(k2 toInt, ArrayBuffer.empty) g3 = Group(k3 toInt, ArrayBuffer.empty) } case line => { val processed = process(line) println(processed) } } } def process(line: String): String = { val letters = line.toArray.map { _ toString match { //Group1因为只有一个括号(),所以只能绑定一个变量; c是一个String,Char在这里不能 //匹配Regex;所以先转换成了String; 因为String是一个Char的Sequence,所以要取第 //一个字符(它只有一个字符),可以使用c(0), 同时也因为String 有一个apply方法; case Group1(c) => Some(Letter(g1, c(0))) case Group2(c) => Some(Letter(g2, c(0))) case Group3(c) => Some(Letter(g3, c(0))) case _ => None } } val decrpted = letters map { case Some(l) => l.decrypt case None => '_' } decrpted.mkString("") } } case class Group(k: Int, buf: ArrayBuffer[Char]) { private var index: Int = -1; def addChar(c: Char): Int = { buf += c index += 1 index } } case class Letter(g: Group, var c: Char) { var index = g addChar c def decrypt(): Char = { index = (index + g.buf.size - g.k) % g.buf.size c = g.buf(index) c } }