Skip to content

Instantly share code, notes, and snippets.

@fgui
Created January 13, 2016 20:52
Show Gist options
  • Save fgui/78d8b27e8706c587847f to your computer and use it in GitHub Desktop.
Save fgui/78d8b27e8706c587847f to your computer and use it in GitHub Desktop.
clojure katas - alphabet cipher
(ns alphabet-cipher.coder)
(defn encode-int [range key msg]
(mod (+ key msg) range))
(defn decode-int [range key encoded-msg]
(mod (- encoded-msg key) range))
(defn decipher-int [range encoded-msg msg]
(mod (- encoded-msg msg) range))
(def range-letters (inc (- (int \z) (int \a))))
(defn string->nums [str]
(map #(- (int %) (int \a)) str))
(defn nums->string [nums]
(apply str (map #(char (+ (int \a) %)) nums)))
(defn operate-letters [op str-1 str-2]
(nums->string (map (partial op range-letters)
(string->nums str-1)
(string->nums str-2))))
(defn string-repeated [text]
(some #(when (= (seq text) (take (count text) (cycle %))) (apply str %))
(map #(take % text) (range (count text))))
)
(defn encode [keyword message]
(operate-letters encode-int (cycle keyword) message))
(defn decode [keyword message]
(operate-letters decode-int (cycle keyword) message))
(defn decipher [cipher message]
(string-repeated (operate-letters decipher-int cipher message)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment