Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package pl.scalania.euler
- import scala.math._
- object Euler04 {
- def largestPalindrome(digits:Int):Long = {
- def toDigits(n: Long): List[Char] = {
- def loopFunc(n: Long): List[Char] = {
- if (n <= 0) Nil
- else ('0'.toInt + n.toInt % 10).toChar :: loopFunc(n / 10)
- }
- loopFunc(n).reverse
- }
- def isPolindrome[T](ls: List[T]): Boolean = {
- def compare(l1: List[T], l2: List[T]): Boolean =
- if (l1.size != l2.size) false
- else l1 match {
- case head :: tail => (head == l2.head) && compare(tail, l2.tail)
- case _ => true
- }
- compare(ls.drop(ls.size/2), ls.reverse.drop(ls.size/2))
- }
- def traverseIndexes(min: Int, max: Int, start: (Int, Int), current: (Int, Int)): Stream[((Int, Int))] = current match {
- case (a, b) =>
- if ((a < min) || (b > max)) {
- start match {
- case (a, b) =>
- if (a == b)
- traverseIndexes(min, max, (a - 1, b), (a - 1, b))
- else
- traverseIndexes(min, max, (a, a), (a, a))
- }
- }
- else (a, b) #:: traverseIndexes(min, max, start, (a - 1, b + 1))
- }
- val fromNo = pow(10, digits - 1).toInt // 10 - for 2 digits
- val toNo = pow(10, digits).toInt - 1 // 99 - for 2 digits
- traverseIndexes(fromNo, toNo, (toNo, toNo), (toNo, toNo))
- .filter{ case (a, b) => isPolindrome(toDigits(a*b)) }
- .take(1).toList.map{ case (a, b) => a*b }.head
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement