Source

euler / clojure / 22.clj

; Using names.txt (right click and 'Save Link/Target As...'), a 46K text file
; containing over five-thousand first names, begin by sorting it into
; alphabetical order. Then working out the alphabetical value for each name,
; multiply this value by its alphabetical position in the list to obtain a name
; score.
; 
; For example, when the list is sorted into alphabetical order, COLIN, which is
; worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN
; would obtain a score of 938 × 53 = 49714.
; 
; What is the total of all the name scores in the file?
;
; Answer: 871198282

(defn char->int [c]
  (- (int c) (dec (int \A))))

(defn str->int [s]
  (apply + (map char->int s)))

(let [names (sort (re-seq #"[A-Z]+" (slurp "names.txt")))]
 (prn (apply + (map #(* %1 (str->int %2))
                    (iterate inc 1) names))))