Advertisement
Guest User

Untitled

a guest
Oct 3rd, 2014
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 4.53 KB | None | 0 0
  1. trait Expression {
  2.   def substitute(numbers: Map[Char, Int]): Expression
  3.  
  4.   def eval: Int
  5. }
  6.  
  7. trait Operation extends Expression {
  8.   def operator: Char
  9.  
  10.   def priority: Int
  11.  
  12.   def rightPriority: Int
  13.  
  14.   def apply(l: Expression, r: Expression): Operation
  15.  
  16.   def left: Expression
  17.  
  18.   def right: Expression
  19.  
  20.   def variables: List[String] = (left, right) match {
  21.     case (Variable(name), Variable(name2)) =>
  22.       List(name, name2).distinct
  23.     case (Variable(name), o: Operation) =>
  24.       (name :: o.variables).distinct
  25.     case (o: Operation, Variable(name)) =>
  26.       (name :: o.variables).distinct
  27.     case (o1: Operation, o2: Operation) =>
  28.       (o1.variables ::: o2.variables).distinct
  29.     case _ =>
  30.       Nil
  31.   }
  32.  
  33.   def substitute(numbers: Map[Char, Int]) = apply(left.substitute(numbers), right.substitute(numbers))
  34. }
  35.  
  36. case class Addition(left: Expression, right: Expression) extends Operation {
  37.   override def operator: Char = '+'
  38.  
  39.   override def priority: Int = 1
  40.  
  41.   override def rightPriority: Int = 1
  42.  
  43.   override def apply(l: Expression, r: Expression): Operation = Addition(l, r)
  44.  
  45.   override def eval: Int = left.eval + right.eval
  46.  
  47.   override def toString: String = s"$left $right +"
  48. }
  49.  
  50. case class Subtraction(left: Expression, right: Expression) extends Operation {
  51.   override def operator: Char = '-'
  52.  
  53.   override def priority: Int = 1
  54.  
  55.   override def rightPriority: Int = 2
  56.  
  57.   override def apply(l: Expression, r: Expression): Operation = Subtraction(l, r)
  58.  
  59.   override def eval: Int = left.eval - right.eval
  60.  
  61.   override def toString: String = s"$left $right -"
  62. }
  63.  
  64. case class Multiplication(left: Expression, right: Expression) extends Operation {
  65.   override def operator: Char = '*'
  66.  
  67.   override def priority: Int = 2
  68.  
  69.   override def rightPriority: Int = 3
  70.  
  71.   override def apply(l: Expression, r: Expression): Operation = Multiplication(l, r)
  72.  
  73.   override def eval: Int = left.eval * right.eval
  74.  
  75.   override def toString: String = s"$left $right *"
  76. }
  77.  
  78. case class Division(left: Expression, right: Expression) extends Operation {
  79.   override def operator: Char = '/'
  80.  
  81.   override def priority: Int = 2
  82.  
  83.   override def rightPriority: Int = 4
  84.  
  85.   override def apply(l: Expression, r: Expression): Operation = Division(l, r)
  86.  
  87.   override def eval: Int = left.eval / right.eval
  88.  
  89.   override def toString: String = s"$left $right /"
  90. }
  91.  
  92. case class Number(value: Int) extends Expression {
  93.   override def substitute(numbers: Map[Char, Int]): Expression = this
  94.  
  95.   override def eval: Int = value
  96.  
  97.   override def toString: String = value.toString
  98. }
  99.  
  100. case class Variable(name: String) extends Expression {
  101.   override def substitute(numbers: Map[Char, Int]): Expression = {
  102.     val subs = Number((name map {
  103.       c =>
  104.         numbers(c).toString.head
  105.     }).toInt)
  106.     subs
  107.   }
  108.  
  109.   override def eval: Int = 0
  110.  
  111.   override def toString: String = name
  112. }
  113.  
  114. case class Equation(left: Expression, right: Expression) {
  115.   def variables: List[String] = (left, right) match {
  116.     case (Variable(name), Variable(name2)) =>
  117.       List(name, name2).distinct
  118.     case (Variable(name), o: Operation) =>
  119.       (name :: o.variables).distinct
  120.     case (o: Operation, Variable(name)) =>
  121.       (name :: o.variables).distinct
  122.     case (o1: Operation, o2: Operation) =>
  123.       (o1.variables ::: o2.variables).distinct
  124.     case _ =>
  125.       Nil
  126.   }
  127.  
  128.   def valid = {
  129.     left.eval == right.eval
  130.   }
  131.  
  132.   def substitute(numbers: Map[Char, Int]): Equation = {
  133.     Equation(left.substitute(numbers), right.substitute(numbers))
  134.   }
  135.  
  136.   private def toInfix(expr: Expression): String = {
  137.     expr match {
  138.       case o: Operation =>
  139.         val l = o.left match {
  140.           case o1: Operation =>
  141.             val str = toInfix(o1)
  142.             if (o1.priority < o.priority) "(" + str + ")" else str
  143.           case Number(v) => v.toString
  144.           case Variable(v) => v
  145.         }
  146.         val r = o.right match {
  147.           case o1: Operation =>
  148.             val str = toInfix(o1)
  149.             if (o1.priority < o.priority) "(" + str + ")" else str
  150.           case Number(v) => v.toString
  151.           case Variable(v) => v
  152.         }
  153.         l + " " + o.operator + " " + r
  154.       case Number(v) => v.toString
  155.       case Variable(v) => v
  156.       case _ => ""
  157.     }
  158.   }
  159.  
  160.   override def equals(obj: scala.Any): Boolean = {
  161.     obj match {
  162.       case e: Equation =>
  163.         e.left match {
  164.           case o: Operation =>
  165.         }
  166.       case _ => false
  167.     }
  168.   }
  169.  
  170.   override def toString: String = s"${toInfix(left)} = ${toInfix(right)}"
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement