Scala sample学習
2631 ワード
ACM problemhttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1042
主にscalaを学ぶために、scalaを使って上述のACM問題を解決します。最も効率的な方法ではないです。しかもコードを提出して検証することもできません。
主に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
}
}