Sha256: 91abdf98f444360c1669cf2063e1f4f25aaa601ab664957619e3341616b3b681

Contents?: true

Size: 780 Bytes

Versions: 107

Compression:

Stored size: 780 Bytes

Contents

(ns luhn)

(defn to-reversed-digits
  "returns a lazy sequence of least to most significant digits of n"
  [n]
  (->> [n 0]
       (iterate (fn [[i _]] [(quot i 10) (mod i 10)]))
       (take-while (complement #{[0 0]}))
       (map second)
       rest))

(defn checksum
  "returns the luhn checksum of n, assuming it has a check digit"
  [n]
  (-> (->> n
           to-reversed-digits
           (map * (cycle [1 2]))
           (map #(if (>= % 10) (- % 9) %))
           (apply +))
      (mod 10)))

(defn valid?
  "whether n has a valid luhn check-digit"
  [n]
  (zero? (checksum n)))

(defn add-check-digit
  "given a number, adds a luhn check digit at the end"
  [n]
  (let [n-shifted (* 10 n)
        check-digit (- 10 (checksum n-shifted))]
    (+ n-shifted check-digit)))

Version data entries

107 entries across 107 versions & 1 rubygems

Version Path
trackler-2.0.8.6 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.8.5 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.8.4 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.8.3 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.8.2 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.8.1 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.7.0 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.44 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.43 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.42 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.41 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.40 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.39 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.38 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.37 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.36 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.35 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.34 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.33 tracks/clojure/exercises/luhn/src/example.clj
trackler-2.0.6.32 tracks/clojure/exercises/luhn/src/example.clj