LiamGoodacre

Largest Palindrome of the mul of 2 n-digits

Jan 23rd, 2012
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Determines if a sequence is palindromic
  2. (defn is-palindrome [_seq]
  3.   (let [len (count _seq)
  4.         mid (/ len 2)
  5.         a (subvec _seq 0 mid)
  6.         b (subvec _seq (+ mid (mod len 2)))]
  7.     (= a (reverse b))))
  8.  
  9. ; Builds a vector from an integer
  10. ; > 34 -> [3 4]
  11. (defn int-to-vec [_num]
  12.   (vec (map #(- (int %) 48) (str _num))))
  13.  
  14. ; Repeats an integer i, n times
  15. ;   returns the concatenation as an integer
  16. ; > (repeat-int 9 3) -> 999
  17. (defn repeat-int [i n]
  18.   (Integer/parseInt (apply str (repeat n i))))
  19.  
  20. ; Calculates the multiplier for some level
  21. (defn num-for-level [highest level]
  22.   (- highest (* 2 (inc level))))
  23.  
  24. ; Generates palindromes for a specific depth level
  25. (defn vals-for-level [highest level]
  26.   (let [extra (num-for-level highest (dec level))
  27.         mul (num-for-level highest level)
  28.         dat (map #(num-for-level highest (dec %))
  29.               (range 0 (inc level)))
  30.         partdat (map #(* % mul) dat)
  31.         fulldat (conj partdat (* extra extra))
  32.         filtered (filter #(is-palindrome (int-to-vec %)) fulldat)]
  33.     filtered))
  34.  
  35. ; Calculates the largest palindrome
  36. ;   which is also a product of two
  37. ;   n-digit values
  38. ; > (largest-palindrome 2) -> 9009
  39. ; > (largest-palindrome 3) -> 906609
  40. ; > (largest-palindrome 4) -> 99000099
  41. ; > (largest-palindrome 5) -> 9966006699
  42. (defn largest-palindrome [digit_count]
  43.   (if (< digit_count 1)
  44.     nil
  45.     (let [maxval (repeat-int 9 digit_count)]
  46.       (loop [level 0]
  47.         (let [palindromes (vals-for-level maxval level)]
  48.           (if (empty? palindromes)
  49.             (if (< level maxval)
  50.               (recur (inc level))
  51.               nil)
  52.             (let [value (apply max palindromes)]
  53.               value)))))))
Advertisement
Add Comment
Please, Sign In to add comment