Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Determines if a sequence is palindromic
- (defn is-palindrome [_seq]
- (let [len (count _seq)
- mid (/ len 2)
- a (subvec _seq 0 mid)
- b (subvec _seq (+ mid (mod len 2)))]
- (= a (reverse b))))
- ; Builds a vector from an integer
- ; > 34 -> [3 4]
- (defn int-to-vec [_num]
- (vec (map #(- (int %) 48) (str _num))))
- ; Repeats an integer i, n times
- ; returns the concatenation as an integer
- ; > (repeat-int 9 3) -> 999
- (defn repeat-int [i n]
- (Integer/parseInt (apply str (repeat n i))))
- ; Calculates the multiplier for some level
- (defn num-for-level [highest level]
- (- highest (* 2 (inc level))))
- ; Generates palindromes for a specific depth level
- (defn vals-for-level [highest level]
- (let [extra (num-for-level highest (dec level))
- mul (num-for-level highest level)
- dat (map #(num-for-level highest (dec %))
- (range 0 (inc level)))
- partdat (map #(* % mul) dat)
- fulldat (conj partdat (* extra extra))
- filtered (filter #(is-palindrome (int-to-vec %)) fulldat)]
- filtered))
- ; Calculates the largest palindrome
- ; which is also a product of two
- ; n-digit values
- ; > (largest-palindrome 2) -> 9009
- ; > (largest-palindrome 3) -> 906609
- ; > (largest-palindrome 4) -> 99000099
- ; > (largest-palindrome 5) -> 9966006699
- (defn largest-palindrome [digit_count]
- (if (< digit_count 1)
- nil
- (let [maxval (repeat-int 9 digit_count)]
- (loop [level 0]
- (let [palindromes (vals-for-level maxval level)]
- (if (empty? palindromes)
- (if (< level maxval)
- (recur (inc level))
- nil)
- (let [value (apply max palindromes)]
- value)))))))
Advertisement
Add Comment
Please, Sign In to add comment