Problem 35
This commit is contained in:
@@ -0,0 +1,56 @@
|
|||||||
|
package ninetyNineScalaProblems.arithmetic
|
||||||
|
|
||||||
|
import scala.annotation.tailrec
|
||||||
|
import scala.math.sqrt
|
||||||
|
|
||||||
|
object Problem35:
|
||||||
|
def primeNumbersUntil(start: Int, stop: Int): List[Int] =
|
||||||
|
@tailrec
|
||||||
|
def loop(cursor: Int, acc: List[Int]): List[Int] =
|
||||||
|
cursor match
|
||||||
|
case c if c > stop =>
|
||||||
|
acc
|
||||||
|
case c if Problem31.isPrime(c) =>
|
||||||
|
loop(cursor + 1, c :: acc)
|
||||||
|
case _ =>
|
||||||
|
loop(cursor + 1, acc)
|
||||||
|
|
||||||
|
loop(start, List()).reverse
|
||||||
|
|
||||||
|
def smallestPrimeDivisor(n: Int): Int =
|
||||||
|
@tailrec
|
||||||
|
def loop(cursor: List[Int]): Int =
|
||||||
|
cursor match
|
||||||
|
case head :: tail if n % head == 0 =>
|
||||||
|
head
|
||||||
|
case head :: tail =>
|
||||||
|
loop(tail)
|
||||||
|
case Nil =>
|
||||||
|
1
|
||||||
|
|
||||||
|
loop(primeNumbersUntil(2, n))
|
||||||
|
|
||||||
|
|
||||||
|
def primeFactors(int: Int): Option[List[Int]] =
|
||||||
|
@tailrec
|
||||||
|
def loop(cursor: Int, acc: List[Int]): List[Int] =
|
||||||
|
// Thread.sleep(500)
|
||||||
|
println(s"\n[DEBUG] cursor = $cursor")
|
||||||
|
println(s"[DEBUG] acc = $acc")
|
||||||
|
println(s"[DEBUG] smallestPrimeDivisor(cursor) = ${smallestPrimeDivisor(cursor)}")
|
||||||
|
cursor match
|
||||||
|
case c if Problem31.isPrime(c) =>
|
||||||
|
println(s"[DEBUG] case1")
|
||||||
|
c :: acc
|
||||||
|
case c =>
|
||||||
|
println(s"[DEBUG] case2")
|
||||||
|
val divisor = smallestPrimeDivisor(c)
|
||||||
|
loop(cursor / divisor, divisor :: acc)
|
||||||
|
|
||||||
|
int match
|
||||||
|
case 0 =>
|
||||||
|
None
|
||||||
|
case 1 =>
|
||||||
|
None
|
||||||
|
case _ =>
|
||||||
|
Some(loop(int, List()).sorted)
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package ninetyNineScalaProblems.arithmetic
|
||||||
|
|
||||||
|
class Problem35Suite extends munit.FunSuite:
|
||||||
|
List(
|
||||||
|
((0, 0), List()),
|
||||||
|
((1, 0), List()),
|
||||||
|
((1, 1), List()),
|
||||||
|
((1, 1), List()),
|
||||||
|
((1, 2), List(2)),
|
||||||
|
((5, 4), List()),
|
||||||
|
((5, 1), List()),
|
||||||
|
((1, 5), List(2, 3, 5)),
|
||||||
|
((1, 6), List(2, 3, 5)),
|
||||||
|
((6, 6), List()),
|
||||||
|
((6, 7), List(7)),
|
||||||
|
((7, 7), List(7)),
|
||||||
|
).foreach:
|
||||||
|
case ((start, stop), expected) =>
|
||||||
|
test(s"primeNumbersUntil returns [$expected]"):
|
||||||
|
assertEquals(Problem35.primeNumbersUntil(start, stop), expected)
|
||||||
|
|
||||||
|
List(
|
||||||
|
(2, 2),
|
||||||
|
(3, 3),
|
||||||
|
(4, 2),
|
||||||
|
(5, 5),
|
||||||
|
(6, 2),
|
||||||
|
(7, 7),
|
||||||
|
(8, 2),
|
||||||
|
(9, 3),
|
||||||
|
(10, 2),
|
||||||
|
(11, 11),
|
||||||
|
(12, 2),
|
||||||
|
(13, 13),
|
||||||
|
(14, 2),
|
||||||
|
(315, 3),
|
||||||
|
(437, 19),
|
||||||
|
).foreach:
|
||||||
|
case (n, expected) =>
|
||||||
|
test(s"smallestPrimeDivisor returns [$expected]"):
|
||||||
|
assertEquals(Problem35.smallestPrimeDivisor(n), expected)
|
||||||
|
|
||||||
|
List(
|
||||||
|
(0, None),
|
||||||
|
(1, None),
|
||||||
|
(2, Some(List(2))),
|
||||||
|
(3, Some(List(3))),
|
||||||
|
(4, Some(List(2, 2))),
|
||||||
|
(5, Some(List(5))),
|
||||||
|
(42, Some(List(2, 3, 7))),
|
||||||
|
(60, Some(List(2, 2, 3, 5))),
|
||||||
|
(315, Some(List(3, 3, 5, 7))),
|
||||||
|
).foreach:
|
||||||
|
case (int, expected) =>
|
||||||
|
test(s"primeFactors returns [$expected]"):
|
||||||
|
assertEquals(Problem35.primeFactors(int), expected)
|
||||||
Reference in New Issue
Block a user