Skip to content

Instantly share code, notes, and snippets.

@lala7573
Created July 11, 2014 13:25
Show Gist options
  • Save lala7573/b7801739b9734066dabf to your computer and use it in GitHub Desktop.
Save lala7573/b7801739b9734066dabf to your computer and use it in GitHub Desktop.
package test
import scala.collection.mutable
import scala.io.Source
import java.io.{ File, PrintStream }
object ReadPhoneNumber {
def numberMap = Map((1, "one"), (2, "two"), (3, "three"),
(4, "four"), (5, "five"), (6, "six"), (7, "seven"), (8, "eight"), (9, "nine"))
def freqMap = Map((1, ""), (2, "double "), (3, "triple "), (4, "quadruple "),
(5, "quintuple "),(6, "sextuple "),(7, "septuple "),(8, "octuple "),(9, "nonuple "), (10, "decuple "))
def readPhoneNumber(number: String, lengths: List[Int]): String = {
//val indexs = lengths.foldLeft(0){ (x, y) => x + y }
var prevSum = 0
val indexes = for (length <- lengths) yield {
val prevPrevSum = prevSum
prevSum += length
(prevPrevSum, prevSum)
}
val segments = indexes.map {
case (i, j) =>
number.substring(i, j)
}
segments.foreach { readSegment }
""
}
def readSegment(segment: String): String = {
def readSegmentInner(segment: String, acc: List[(Int, Char)]): List[(Int, Char)] = {
if (segment.isEmpty) acc
else {
val seg = segment.charAt(0)
val segment1 = segment.substring(1)
acc match {
case Nil => readSegmentInner(segment1, List((1, seg)))
case head :: tail =>
if (head._2 == seg) readSegmentInner(segment1, (head._1 + 1, head._2) :: tail)
else readSegmentInner(segment1, List((1, seg)) ::: acc)
}
}
}
val countCharPair: List[(Int, Char)] = readSegmentInner(segment, List()).reverse
val reads: List[String] = for((count, ch) <- countCharPair ) yield {
count match {
case x if x > 10 => for( i<- 1 to count) yield { numberMap(ch.toInt) }.mkString(" ")
case _ => (freqMap(count) + numberMap(ch.toInt)).toString
}
}
reads.mkString(" ")
}
def process(iter: Iterator[String])(pr: String => Unit) {
for (i <- 1 to iter.next().toInt) yield {
val Array(a, b) = iter.next().toString split ' '
val lengths = b.split('-').map(_.toInt)
pr(s"Case #$i: ${readPhoneNumber(a, lengths.toList)}")
}
}
def main(args: Array[String]) {
val in = Source.fromFile(new File("test.in"))
val out = new PrintStream(new File("test.out"))
try {
process(in.getLines) { s: String => println(s) }
} finally {
out.flush; out.close
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment