Scala sample学習

2631 ワード

ACM problemhttp://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
  }
}