Bacon cipher: Difference between revisions
Content added Content deleted
Cyril Nocton (talk | contribs) |
Cyril Nocton (talk | contribs) |
||
Line 1,013: | Line 1,013: | ||
1. Note |
1. Note |
||
Codes are stored in association lists. |
|||
<pre>#\x -> assoc -> |
<pre>#\x -> assoc -> code -> rassoc -> #\x</pre> |
||
For instance. |
For instance. |
||
<pre>(cdr (assoc #\a + |
<pre>(cdr (assoc #\a +codes+)) = (A A A A A) (car (rassoc '(A A A A A) +codes+) = #\a </pre> |
||
2. Program |
2. Program |
||
Line 1,025: | Line 1,025: | ||
<lang lisp>;; 22.06.14 |
<lang lisp>;; 22.06.14 |
||
(defconstant + |
(defconstant +codes+ |
||
'((#\a . (A A A A A)) (#\b . (A A A A B)) (#\c . (A A A B A)) |
'((#\a . (A A A A A)) (#\b . (A A A A B)) (#\c . (A A A B A)) |
||
(#\d . (A A A B B)) (#\e . (A A B A A)) (#\f . (A A B A B)) |
(#\d . (A A A B B)) (#\e . (A A B A A)) (#\f . (A A B A B)) |
||
Line 1,036: | Line 1,036: | ||
(#\y . (B B A A A)) (#\z . (B B A A B)) (#\space . (B B B A A)))) |
(#\y . (B B A A A)) (#\z . (B B A A B)) (#\space . (B B B A A)))) |
||
(defun encode ( |
(defun encode (text message) |
||
(let (cipher |
(let (cipher code) |
||
(setf msg (string-downcase |
(setf msg (string-downcase message)) |
||
(loop for c across |
(loop for c across message do |
||
(setf |
(setf code (append code (cdr (assoc c +codes+))))) |
||
(setf |
(setf text (string-downcase text)) |
||
(loop for c across |
(loop for c across text always code do |
||
(when (alpha-char-p c) |
(when (alpha-char-p c) |
||
(when (eq (car |
(when (eq (car code) 'B) |
||
(setf c (char-upcase c))) |
(setf c (char-upcase c))) |
||
(setf |
(setf code (cdr code))) |
||
(setf cipher (append cipher (list c)))) |
(setf cipher (append cipher (list c)))) |
||
(return-from encode (coerce cipher 'string))))) |
(return-from encode (coerce cipher 'string))))) |
||
(defun decode ( |
(defun decode (text) |
||
(let (key |
(let (key code) |
||
(setf |
(setf text (remove-if-not 'alpha-char-p text)) |
||
(loop for c across |
(loop for c across text do |
||
(if (lower-case-p c) |
(if (lower-case-p c) |
||
(setf |
(setf code (append code '(A))) |
||
(setf mask (append |
(setf mask (append code '(B)))) |
||
(when (= (length |
(when (= (length code) 5) |
||
(setf key (append key (list (car (rassoc |
(setf key (append key (list (car (rassoc code +codes+ :test #'equal))))) |
||
(setf |
(setf code nil))) |
||
(return-from decode (coerce key 'string))))</lang> |
(return-from decode (coerce key 'string))))</lang> |
||