Skip to content

Instantly share code, notes, and snippets.

@outsideris
Created May 18, 2013 13:22
Show Gist options
  • Save outsideris/5604378 to your computer and use it in GitHub Desktop.
Save outsideris/5604378 to your computer and use it in GitHub Desktop.
euler problem 5
def factorize(n: Int, divider:Int = 2, accum:List[Int] = Nil):List[Int] = {
n match {
case a if a == 1 => accum
case a if a == 2 => n :: accum
case b if b % divider == 0 => factorize(b / divider, divider, divider :: accum)
case _ => factorize(n, divider + 1, accum)
}
}
def getMap(l:List[Int]) = l.groupBy(_.toString).mapValues(_.length)
def mergeMap(left:Map[String, Int], right:Map[String, Int]) = {
left ++ right.map {
case (k, v) => k -> (if (left.getOrElse(k, 0) > v) left.getOrElse(k, 0) else v)
}
}
val factors = for (i <- 1 to 20 ) yield getMap(factorize(i))
// Vector(Map(), Map(2 -> 1), Map(3 -> 1), Map(2 -> 2), Map(5 -> 1), Map(2 -> 1, 3 -> 1), Map(7 -> 1), Map(2 -> 3), Map(3 -> 2), Map(2 -> 1, 5 -> 1), Map(11 -> 1), Map(2 -> 2, 3 -> 1), Map(13 -> 1), Map(2 -> 1, 7 -> 1), Map(5 -> 1, 3 -> 1), Map(2 -> 4), Map(17 -> 1), Map(2 -> 1, 3 -> 2), Map(19 -> 1), Map(2 -> 2, 5 -> 1))
val factorization = (Map("1" -> 1) /: factors.toList){mergeMap}
// Map(19 -> 1, 11 -> 1, 13 -> 1, 5 -> 1, 1 -> 1, 17 -> 1, 2 -> 4, 7 -> 1, 3 -> 2)
val result = (1 /: factorization){ case (x, (k, v)) => x * math.pow(k.toInt, v).toInt}
println(result) // 232792560
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment