Sha256: 0ece53a6c7371e30909c718b6dd52fb2b29bd9120d08799209cc9081fb87a9d6

Contents?: true

Size: 1.88 KB

Versions: 248

Compression:

Stored size: 1.88 KB

Contents

import scala.util.parsing.combinator.RegexParsers
import scala.math.pow

sealed abstract class Expression {
  def evaluate(): Integer
}

case class Const(value: Int) extends Expression {
  def evaluate() = value
}

case class Sum(e1: Expression, e2: Expression) extends Expression {
  def evaluate(): Integer = e1.evaluate() + e2.evaluate()
}

case class Diff(e1: Expression, e2: Expression) extends Expression {
  def evaluate(): Integer = e1.evaluate() - e2.evaluate()
}

case class Mult(e1: Expression, e2: Expression) extends Expression {
  def evaluate(): Integer = e1.evaluate() * e2.evaluate()
}

case class Div(e1: Expression, e2: Expression) extends Expression {
  def evaluate(): Integer = e1.evaluate() / e2.evaluate()
}

case class Pow(e1: Expression, e2: Expression) extends Expression {
  def evaluate(): Integer = pow(e1.evaluate().toDouble, e2.evaluate().toDouble).toInt
}

object WordProblem extends RegexParsers {
  private lazy val prefix = "What is "
  private lazy val questionMark = "?"
  private lazy val operators = "plus" | "minus" | "multiplied by" |
    "divided by" | "raised to the"

  private def operation = expr ~ rep(operators ~ expr) ^^ {
    case op ~ list => list.foldLeft(op) {
      case (x, "plus" ~ y) => Sum(x, y)
      case (x, "minus" ~ y) => Diff(x, y)
      case (x, "multiplied by" ~ y) => Mult(x, y)
      case (x, "divided by" ~ y) => Div(x, y)
      case (x, "raised to the" ~ y) => Pow(x, y)
    }
  }

  private def operand: Parser[Const] = """-?\d+""".r ^^ {s => Const(s.toInt)}
  private def expr: Parser[Expression] = operand | operation

  // Top level parser
  private def questionParser = prefix ~> operation <~ questionMark

  def parse(str: String): ParseResult[Expression] = parseAll(questionParser, str)

  def apply(question: String): Option[Int] = parse(question) match {
    case Success(result: Expression, _) => Some(result.evaluate())
    case _ => None
  }
}

Version data entries

248 entries across 248 versions & 1 rubygems

Version Path
trackler-2.2.1.30 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.29 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.28 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.27 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.26 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.25 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.24 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.23 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.22 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.21 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.20 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.19 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.18 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.17 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.16 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.15 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.14 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.13 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.12 tracks/scala/exercises/wordy/example.scala
trackler-2.2.1.11 tracks/scala/exercises/wordy/example.scala