25 lines
830 B
Scala
25 lines
830 B
Scala
class TestFractran extends FunSuite {
|
|
val program = Fractran("17/91 78/85 19/51 23/38 29/33 77/29 95/23 77/19 1/17 11/13 13/11 15/14 15/2 55/1")
|
|
val expect = List(2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, 910, 170, 156, 132)
|
|
|
|
test("find first fifteen fractran figures") {
|
|
assert((program .execute(2) take 15 toList) === expect)
|
|
}
|
|
}
|
|
|
|
object Fractran {
|
|
val pattern = """\s*(\d+)\s*/\s*(\d+)\s*""".r
|
|
def parse(m: Match) = ((m group 1).toInt, (m group 2).toInt)
|
|
def apply(program: String) = new Fractran(
|
|
pattern.findAllMatchIn(program).map(parse).toList)
|
|
}
|
|
|
|
class Fractran(val numDem: List[(Int,Int)]) {
|
|
def execute(value: Int) = unfold(value) { v =>
|
|
numDem indexWhere(v % _._2 == 0) match {
|
|
case i if i > -1 => Some(v, numDem(i)._1 * v / numDem(i)._2)
|
|
case _ => None
|
|
}
|
|
}
|
|
}
|