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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值