25 lines
800 B
Prolog
25 lines
800 B
Prolog
cypher(O, S) :-
|
|
nonvar(O),
|
|
var(S),
|
|
atom_chars(O,Oc),
|
|
sub_chars(Oc,Sc),
|
|
atom_chars(S,Sc).
|
|
cypher(O, S) :-
|
|
nonvar(S),
|
|
var(O),
|
|
atom_chars(S,Sc),
|
|
sub_chars(Oc,Sc),
|
|
atom_chars(O,Oc).
|
|
|
|
% mapping based on ADA implementation but have added space character
|
|
base(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,' ']).
|
|
subs(['V',s,c,i,'B',j,e,d,g,r,z,y,'H',a,l,v,'X','Z','K',t,'U','P',u,m,'G',f,'I',w,'J',x,q,'O','C','F','R','A',p,n,'D',h,'Q','W',o,b,' ','L',k,'E','S','Y','M','T','N']).
|
|
|
|
sub_chars(Original,Subbed) :-
|
|
base(Base),
|
|
subs(Subs),
|
|
maplist(sub_char(Base,Subs),Original,Subbed).
|
|
|
|
sub_char([Co|_],[Cs|_],Co,Cs) :- !.
|
|
sub_char([_|To],[_|Ts], Co, Cs) :- sub_char(To,Ts,Co,Cs).
|