Skip to content

Instantly share code, notes, and snippets.

@mikkelbd
Created October 24, 2011 11:23
Show Gist options
  • Save mikkelbd/1308808 to your computer and use it in GitHub Desktop.
Save mikkelbd/1308808 to your computer and use it in GitHub Desktop.

Revisions

  1. mikkelbd revised this gist Oct 24, 2011. 1 changed file with 4 additions and 4 deletions.
    8 changes: 4 additions & 4 deletions ExtremeStartupServletTest.scala
    Original file line number Diff line number Diff line change
    @@ -40,13 +40,13 @@ class ExtremeStartupServletTest extends ScalatraFunSuite {

    addServlet(classOf[ExtremeStartupServlet], "/*")

    def question(q: String) : (String, String) = ("q", q)

    def answerTo(q: String) : String = {
    get("/", ("q", "which of the following numbers is both a square and a cube: 729, 303")) {
    get("/", question(q)) {
    status should be(200)
    should be ("729")
    body
    }
    }

    def question(q: String) : (String, String) = ("q", q)

    }
  2. mikkelbd revised this gist Oct 24, 2011. 1 changed file with 21 additions and 0 deletions.
    21 changes: 21 additions & 0 deletions build.sbt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,21 @@
    organization := "bekk"

    name := "kodekveld"

    version := "0.1.0-SNAPSHOT"

    scalaVersion := "2.9.1"

    seq(webSettings:_*)

    libraryDependencies ++= Seq(
    "org.scalatra" %% "scalatra" % "2.0.1",
    "org.scalatra" %% "scalatra-scalate" % "2.0.1",
    "org.scalatra" %% "scalatra-scalatest" % "2.0.1" % "test",
    "org.eclipse.jetty" % "jetty-webapp" % "7.4.5.v20110725" % "jetty",
    "org.eclipse.jetty" % "jetty-webapp" % "7.4.5.v20110725",
    "javax.servlet" % "servlet-api" % "2.5" % "provided",
    "org.scalatest" % "scalatest_2.9.0" % "1.6.1" % "test"
    )

    resolvers += "Sonatype OSS Snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/"
  3. mikkelbd created this gist Oct 24, 2011.
    82 changes: 82 additions & 0 deletions ExtremeStartup.scala
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,82 @@
    import util.matching.Regex

    object ExtremeStartup {

    def answer(q: String): Any = {

    if (q.contains("what is your name"))
    return "Mikkel"
    if (q.contains("which city is the Eiffel tower in"))
    return "Paris"
    if (q.contains("what is the twitter id of the organizer of this dojo"))
    return "olemartin"
    if (q.contains("who is the Prime Minister of Great Britain"))
    return "David Cameron"
    if (q.contains("what colour is a banana"))
    return "yellow"
    if (q.contains("who played James Bond in the film Dr No"))
    return "Sean Connery"
    if (q.contains("what currency did Spain use before the Euro"))
    return "Peseta"

    """my name is (\w+). what is my name""".r.findFirstMatchIn(q) match {
    case Some(m) => return m.group(1)
    case _ =>
    }

    // math
    """what is (\d+) ([a-z ]+) (\d+)""".r.findAllIn(q).matchData.foreach {
    m => {
    val num1 = m.group(1).toInt
    val op = m.group(2)
    val num2 = m.group(3).toInt
    op match {
    case "plus" => return num1 + num2
    case "minus" => return num1 - num2
    case "divided by" => return num1 / num2
    case "multiplied by" => return num1 * num2
    case "to the power of" => return math.pow(num1, num2)
    }
    }
    }

    """.*which of the following numbers is the largest: (.*)""".r.findFirstMatchIn(q) match {
    case Some(m) => return getNumberList(m.group(1)).max
    case None =>
    }

    """which of the following numbers is both a square and a cube: (.*)""".r.findFirstMatchIn(q) match {
    case Some(m) => return getFilteredNumbersString(m, isSquareAndCube)
    case None =>
    }

    """which of the following numbers are primes: (.*)""".r.findFirstMatchIn(q) match {
    case Some(m) => return getFilteredNumbersString(m, isPrime)
    case None =>
    }

    """what is the (\d+)th number in the Fibonacci sequence""".r.findFirstMatchIn(q) match {
    case Some(m) => return fibonacci(m.group(1).toInt)
    case None =>
    }

    ""
    }

    def getFilteredNumbersString(m: Regex.Match, p: Int => Boolean) = getNumberList(m.group(1)).filter(p(_)).mkString(", ")

    def getNumberList(numberString: String) = numberString.split(',').map(_.trim.toInt).toList

    def isPrime(n: Int) = (2 until n) forall (n % _ != 0)

    def fibonacci(num: Int) = fibonacciTR(num, 1, 0)

    def fibonacciTR(num: Int, nxt: Int, res: Int): Int = {
    num match {
    case 0 => res
    case _ => fibonacciTR(num - 1, nxt + res, nxt)
    }
    }

    def isSquareAndCube(x : Int) = math.sqrt(x) % 1 == 0 && math.cbrt(x) % 1 == 0
    }
    21 changes: 21 additions & 0 deletions ExtremeStartupServlet.scala
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,21 @@
    import org.scalatra._

    class ExtremeStartupServlet extends ScalatraServlet {

    get("/") {
    val q = params("q")
    println("QUESTION = " + q)
    try {
    val answer = ExtremeStartup.answer(q).toString
    println("ANSWER = " + answer)
    answer
    } catch {
    case _ => ""
    }
    }

    notFound {
    println(request.getRequestURI)
    ""
    }
    }
    52 changes: 52 additions & 0 deletions ExtremeStartupServletTest.scala
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,52 @@
    import org.scalatra.test.scalatest.ScalatraFunSuite

    class ExtremeStartupServletTest extends ScalatraFunSuite {

    test("what is your name") {
    answerTo("fc480360: what is your name") should be("Mikkel")
    }

    test("my name is") {
    answerTo("ff4970f0: my name is bob. what is my name") should be ("bob")
    }

    test("addition") {
    answerTo("05450bb0: what is 9 plus 9") should be("18")
    }

    test("multiplication") {
    answerTo("05450bb0: what is 4 multiplied by 4") should be("16")
    }

    test("subtraction") {
    answerTo("05450bb0: what is 9 minus 17") should be("-8")
    }

    test("largest number") {
    answerTo("05450bb0: which of the following numbers is the largest: 12, 15, 31, 17") should be ("31")
    }

    test("prime numbers") {
    answerTo("05450bb0: which of the following numbers are primes: 5, 7, 149, 720, 553, 257") should be ("5, 7, 149, 257")
    }

    test("fibonacci") {
    answerTo("0b6768b0: what is the 14th number in the Fibonacci sequence") should be ("377")
    }

    test("square and cube") {
    answerTo("05450bb0: which of the following numbers is both a square and a cube: 729, 303") should be ("729")
    }

    addServlet(classOf[ExtremeStartupServlet], "/*")

    def answerTo(q: String) : String = {
    get("/", ("q", "which of the following numbers is both a square and a cube: 729, 303")) {
    status should be(200)
    should be ("729")
    }
    }

    def question(q: String) : (String, String) = ("q", q)

    }