File tree Expand file tree Collapse file tree
ROT13_Cipher/Fennel/bb010g Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ ;; ROT13 ciphering algorithm implementation
2+ ;; Based on ../../Lua/Yonaba/rot13.lua
3+ ;; See: http://en.wikipedia.org/wiki/ROT13
4+
5+ ;; Returns the ASCII bytecode of either 'a' or 'A'
6+ (local a_byte (string . byte :a))
7+ (local A_byte (string . byte :A))
8+ (local ascii_base (fn [ch ]
9+ (if (= (string . lower ch ) ch ) a_byte A_byte )))
10+
11+ (local caesar_cipher_ch (fn [key ] (fn [ch ]
12+ (let [base (ascii_base ch )
13+ offset (% (+ (- (string . byte ch ) base ) key ) 26 )]
14+ (string . char (+ offset base ))))))
15+
16+ ;; ROT13 is based on Caesar ciphering algorithm, using 13 as a key
17+ (local caesar_cipher (fn [key str ]
18+ (string . gsub str "%a" (caesar_cipher_ch key ))))
19+
20+ {
21+ :cipher (partial caesar_cipher 13 )
22+
23+ :decipher (partial caesar_cipher -13 )
24+ }
Original file line number Diff line number Diff line change 1+ ; Tests for rot13.lua
2+ (table . insert (or package . searchers package . loaders ) (. (require :fennel) :searcher))
3+ (local rot13 (require :rot13))
4+
5+ (var (total pass ) (values 0 0 ))
6+
7+ (local dec (fn [str len ]
8+ (local strlen (# str ))
9+ (if (< strlen len )
10+ (.. str (: '. ' :rep (- len strlen )))
11+ (: str :sub 1 len ))))
12+
13+ (local run (fn [msg f ]
14+ (set total (+ 1 total ))
15+ (local (ok err ) (pcall f ))
16+ (when ok (set pass (+ 1 pass )))
17+ (local status (if ok "PASSED" "FAILED" ))
18+ (print (: "%02d. %68s: %s" :format total (dec msg 68 ) status ))))
19+
20+ (run "Ciphering test" (fn []
21+ (assert (= (rot13.cipher "abcd" ) "nopq" ))
22+ (assert (= (rot13.cipher "WXYZ" ) "JKLM" ))
23+ (assert (= (rot13.cipher "abcdefghijklmnopqrstuvwxyz" ) "nopqrstuvwxyzabcdefghijklm" ))
24+ (assert (= (rot13.cipher "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ) "NOPQRSTUVWXYZABCDEFGHIJKLM" ))))
25+
26+ (run "Deciphering test" (fn []
27+ (assert (= (rot13.decipher "nopq" ) "abcd" ))
28+ (assert (= (rot13.cipher "WXYZ" ) "JKLM" ))
29+ (assert (= (rot13.cipher "nopqrstuvwxyzabcdefghijklm" ) "abcdefghijklmnopqrstuvwxyz" ))
30+ (assert (= (rot13.cipher "NOPQRSTUVWXYZABCDEFGHIJKLM" ) "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ))))
31+
32+ (print (: "-" :rep 80 ))
33+ (print (: "Total : %02d: Pass: %02d - Failed : %02d - Success: %.2f %%" :format
34+ total pass (- total pass ) (/ (* pass 100 ) total )))
You can’t perform that action at this time.
0 commit comments