Bacon cipher: Difference between revisions

m
Line 1,013:
1. Note
 
MasksCodes are stored in association lists.
 
<pre>#\x -> assoc -> maskcode -> rassoc -> #\x</pre>
 
For instance.
 
<pre>(cdr (assoc #\a +abccodes+)) = (A A A A A) (car (rassoc '(A A A A A) +abccodes+) = #\a </pre>
 
2. Program
Line 1,025:
<lang lisp>;; 22.06.14
 
(defconstant +abccodes+
'((#\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))
Line 1,036:
(#\y . (B B A A A)) (#\z . (B B A A B)) (#\space . (B B B A A))))
 
(defun encode (txttext msgmessage)
(let (cipher maskcode)
(setf msg (string-downcase msgmessage))
(loop for c across msgmessage do
(setf maskcode (append maskcode (cdr (assoc c +abccodes+)))))
(setf txttext (string-downcase txttext))
(loop for c across txttext always maskcode do
(when (alpha-char-p c)
(when (eq (car maskcode) 'B)
(setf c (char-upcase c)))
(setf maskcode (cdr maskcode)))
(setf cipher (append cipher (list c))))
(return-from encode (coerce cipher 'string)))))
 
(defun decode (txttext)
(let (key maskcode)
(setf txttext (remove-if-not 'alpha-char-p txttext))
(loop for c across txttext do
(if (lower-case-p c)
(setf maskcode (append maskcode '(A)))
(setf mask (append maskcode '(B))))
(when (= (length maskcode) 5)
(setf key (append key (list (car (rassoc maskcode +abccodes+ :test #'equal)))))
(setf maskcode nil)))
(return-from decode (coerce key 'string))))</lang>
 
422

edits