From 13487dcb421e34a54e106a12e734c00b045e9368 Mon Sep 17 00:00:00 2001 From: Jakob Scheid Date: Thu, 19 Mar 2026 15:39:26 +0100 Subject: [PATCH] Problem 12 --- .../ninetyNineScalaProblems/Problem12.scala | 19 +++++++++++++++++++ .../Problem12Suite.scala | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/main/scala/ninetyNineScalaProblems/Problem12.scala create mode 100644 src/test/scala/ninetyNineScalaProblems/Problem12Suite.scala diff --git a/src/main/scala/ninetyNineScalaProblems/Problem12.scala b/src/main/scala/ninetyNineScalaProblems/Problem12.scala new file mode 100644 index 0000000..d3da0ae --- /dev/null +++ b/src/main/scala/ninetyNineScalaProblems/Problem12.scala @@ -0,0 +1,19 @@ +package ninetyNineScalaProblems + +import scala.annotation.tailrec +import scala.annotation.constructorOnly + +object Problem12: + def runLengthDecode(list: List[Tuple2[Int, Any]]): List[Tuple2[Int, Any] | Any] = + @tailrec + def loop(cursor: List[Tuple2[Int, Any]], acc: List[Tuple2[Int, Any] | Any]): List[Tuple2[Int, Any] | Any] = + cursor match + case t :: tail => + t match + case (f, v) if f > 1 => + loop((f - 1, v) :: tail, v :: acc) + case (f, v) => + loop(tail, v :: acc) + case Nil => acc + + loop(list, List()).reverse \ No newline at end of file diff --git a/src/test/scala/ninetyNineScalaProblems/Problem12Suite.scala b/src/test/scala/ninetyNineScalaProblems/Problem12Suite.scala new file mode 100644 index 0000000..5569d0b --- /dev/null +++ b/src/test/scala/ninetyNineScalaProblems/Problem12Suite.scala @@ -0,0 +1,16 @@ +package ninetyNineScalaProblems + +import scala.compiletime.ops.boolean + +class Problem12Suite extends munit.FunSuite: + List( + (List((1 ,1), (1, 2), (1, 3), (1, 4)), List(1, 2, 3, 4)), + (List(), List()), + (List((1, 1), (1, 2), (1, 3), (1, 2)), List(1, 2, 3, 2)), + (List((1, 1)), List(1)), + (List((2, 1)), List(1, 1)), + (List((4, 1), (1,2), (2, 3), (2, 1), (1, 4), (4, 5)), List(1, 1, 1, 1, 2, 3, 3, 1, 1, 4, 5, 5, 5, 5)) + ).foreach: + case (list, expected) => + test(s"runLengthDecode returns [$expected]"): + assertEquals(Problem12.runLengthDecode(list), expected) \ No newline at end of file