Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 KB | None | 0 0
  1. package pl.scalania.euler
  2.  
  3. import scala.math._
  4.  
  5. object Euler04 {
  6.  
  7. def largestPalindrome(digits:Int):Long = {
  8.  
  9. def toDigits(n: Long): List[Char] = {
  10. def loopFunc(n: Long): List[Char] = {
  11. if (n <= 0) Nil
  12. else ('0'.toInt + n.toInt % 10).toChar :: loopFunc(n / 10)
  13. }
  14. loopFunc(n).reverse
  15. }
  16.  
  17. def isPolindrome[T](ls: List[T]): Boolean = {
  18. def compare(l1: List[T], l2: List[T]): Boolean =
  19. if (l1.size != l2.size) false
  20. else l1 match {
  21. case head :: tail => (head == l2.head) && compare(tail, l2.tail)
  22. case _ => true
  23. }
  24. compare(ls.drop(ls.size/2), ls.reverse.drop(ls.size/2))
  25. }
  26.  
  27. def traverseIndexes(min: Int, max: Int, start: (Int, Int), current: (Int, Int)): Stream[((Int, Int))] = current match {
  28. case (a, b) =>
  29.  
  30. if ((a < min) || (b > max)) {
  31. start match {
  32. case (a, b) =>
  33.  
  34. if (a == b)
  35. traverseIndexes(min, max, (a - 1, b), (a - 1, b))
  36. else
  37. traverseIndexes(min, max, (a, a), (a, a))
  38. }
  39. }
  40. else (a, b) #:: traverseIndexes(min, max, start, (a - 1, b + 1))
  41. }
  42.  
  43. val fromNo = pow(10, digits - 1).toInt // 10 - for 2 digits
  44. val toNo = pow(10, digits).toInt - 1 // 99 - for 2 digits
  45.  
  46. traverseIndexes(fromNo, toNo, (toNo, toNo), (toNo, toNo))
  47. .filter{ case (a, b) => isPolindrome(toDigits(a*b)) }
  48. .take(1).toList.map{ case (a, b) => a*b }.head
  49.  
  50. }
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement