Scala sample 学习

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
  }
}

 

你可能感兴趣的:(sample)