Skip to content

Instantly share code, notes, and snippets.

@mizuhara
Last active August 29, 2015 14:05
Show Gist options
  • Save mizuhara/b08dc5668bdd34dcd714 to your computer and use it in GitHub Desktop.
Save mizuhara/b08dc5668bdd34dcd714 to your computer and use it in GitHub Desktop.
package yhpg
import scala.math.BigInt
object Main extends App {
def makeStream(from: BigInt): Stream[BigInt] = from #:: makeStream(from + 1)
def isSquare(n: BigInt): Boolean = Math.pow(Math.round(Math.sqrt(n.toDouble)), 2) == n
def isCubic(n: BigInt): Boolean = Math.pow(Math.round(Math.cbrt(n.toDouble)), 3) == n
def removeBefore(stream: Stream[BigInt], cond: (BigInt) => Boolean): Stream[BigInt] = stream.zip(stream.drop(1)).filter(x => !cond(x._2)).map(x => x._1)
def removeAfter(stream: Stream[BigInt], cond: (BigInt) => Boolean): Stream[BigInt] = stream.head #:: stream.zip(stream.drop(1)).filter(x => !cond(x._1)).map(x => x._2)
def processCmd(str: String, stream: Stream[BigInt]): Stream[BigInt] = {
val reg = """[2-9]""".r
val cmd = str.take(1)
cmd match {
case "s" => processCmd(str.substring(1), removeBefore(stream, isSquare))
case "S" => processCmd(str.substring(1), removeAfter(stream, isSquare))
case "c" => processCmd(str.substring(1), removeBefore(stream, isCubic))
case "C" => processCmd(str.substring(1), removeAfter(stream, isCubic))
case "h" => processCmd(str.substring(1), stream.drop(100))
case reg() => processCmd(str.substring(1), stream.grouped(cmd.toInt).flatMap(x => x.take(cmd.toInt - 1)).toStream)
case _ => stream
}
}
def solve(src: String): String = processCmd(src, makeStream(1)).take(10).mkString(",")
def test(src: String, expected: String) = {
val actual = solve(src)
val result = if (actual == expected) "ok" else "***NG***"
println(result)
}
override def main(args: Array[String]): Unit = {
/*0*/ test("ss6cc24S", "1,9,21,30,33,37,42,44,49,56")
/*1*/ test("h", "101,102,103,104,105,106,107,108,109,110")
/*2*/ test("hh", "201,202,203,204,205,206,207,208,209,210")
/*3*/ test("hhh", "301,302,303,304,305,306,307,308,309,310")
/*4*/ test("2", "1,3,5,7,9,11,13,15,17,19")
/*5*/ test("22", "1,5,9,13,17,21,25,29,33,37")
/*6*/ test("222", "1,9,17,25,33,41,49,57,65,73")
/*7*/ test("3", "1,2,4,5,7,8,10,11,13,14")
/*8*/ test("33", "1,2,5,7,10,11,14,16,19,20")
/*9*/ test("333", "1,2,7,10,14,16,20,23,28,29")
/*10*/ test("s", "1,2,4,5,6,7,9,10,11,12")
/*11*/ test("ss", "1,4,5,6,9,10,11,12,13,16")
/*12*/ test("sss", "4,5,9,10,11,12,16,17,18,19")
/*13*/ test("S", "1,3,4,6,7,8,9,11,12,13")
/*14*/ test("SS", "1,4,7,8,9,12,13,14,15,16")
/*15*/ test("SSS", "1,8,9,13,14,15,16,20,21,22")
/*16*/ test("c", "1,2,3,4,5,6,8,9,10,11")
/*17*/ test("cc", "1,2,3,4,5,8,9,10,11,12")
/*18*/ test("ccc", "1,2,3,4,8,9,10,11,12,13")
/*19*/ test("C", "1,3,4,5,6,7,8,10,11,12")
/*20*/ test("CC", "1,4,5,6,7,8,11,12,13,14")
/*21*/ test("CCC", "1,5,6,7,8,12,13,14,15,16")
/*22*/ test("23", "1,3,7,9,13,15,19,21,25,27")
/*23*/ test("32", "1,4,7,10,13,16,19,22,25,28")
/*24*/ test("2h", "201,203,205,207,209,211,213,215,217,219")
/*25*/ test("h2", "101,103,105,107,109,111,113,115,117,119")
/*26*/ test("sC", "1,4,5,6,7,9,10,11,12,13")
/*27*/ test("Cs", "1,4,5,6,7,8,10,11,12,13")
/*28*/ test("s468", "1,2,4,6,7,11,12,16,17,20")
/*29*/ test("S468", "1,3,4,7,8,12,13,16,18,21")
/*30*/ test("cc579", "1,2,3,4,8,9,11,13,15,16")
/*31*/ test("CC579", "1,4,5,6,8,11,13,15,17,18")
/*32*/ test("85", "1,2,3,4,6,7,9,10,12,13")
/*33*/ test("sh", "110,111,112,113,114,115,116,117,118,119")
/*34*/ test("94h", "150,151,154,155,156,158,159,160,163,164")
/*35*/ test("h9c8", "101,102,103,104,105,106,107,110,111,112")
/*36*/ test("Cc3s", "1,3,5,6,10,11,13,16,17,19")
/*37*/ test("cs4h6", "149,150,152,153,154,157,158,160,161,162")
/*38*/ test("84523c", "1,3,11,15,23,26,34,38,46,49")
/*39*/ test("54C78hS", "228,231,232,233,236,241,242,243,246,247")
/*40*/ test("65h7ccs", "151,152,153,154,157,158,160,163,164,165")
/*41*/ test("c95hSc2C", "145,147,151,153,156,159,162,164,168,171")
/*42*/ test("c5h3Ss794", "130,131,133,137,138,142,148,150,152,157")
/*43*/ test("7ShscC846", "129,130,131,134,135,139,141,142,146,148")
/*44*/ test("cshSCCS7ch", "253,254,256,259,260,261,263,264,265,266")
/*45*/ test("hhC7849Ss6C", "201,202,203,205,206,211,212,216,220,225")
/*46*/ test("hhsc3C987Ccs", "201,202,204,205,207,208,214,217,218,220")
/*47*/ test("SC7S8hc59ss2", "162,169,174,178,182,185,188,194,199,203")
/*48*/ test("s7S6c35C9CShc", "367,371,377,379,380,385,387,388,392,395")
/*49*/ test("4scC3hh982Cc5s", "422,426,430,434,447,451,459,463,471,479")
/*50*/ test("23h465Ssc9CchC", "1027,1033,1045,1047,1057,1069,1071,1075,1081,1093")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment