69 lines
1.5 KiB
Plaintext
69 lines
1.5 KiB
Plaintext
{def caesar
|
|
|
|
{def caesar.alphabet {A.split ABCDEFGHIJKLMNOPQRSTUVWXYZ}}
|
|
|
|
{def caesar.delta
|
|
{lambda {:s :i :a}
|
|
{A.get {% {+ {A.in? {A.get :i :a} {caesar.alphabet}} 26 :s} 26}
|
|
{caesar.alphabet}}}}
|
|
|
|
{def caesar.loop
|
|
{lambda {:s :a :b :n :i}
|
|
{if {> :i :n}
|
|
then :b
|
|
else {caesar.r :s
|
|
:a
|
|
{A.set! :i {caesar.delta :s :i :a} :b}
|
|
:n
|
|
{+ :i 1}} }}}
|
|
|
|
{lambda {:shift :txt}
|
|
{let { {:s :shift}
|
|
{:t {S.replace [^A-Z] by in :txt}} }
|
|
{A.join {caesar.loop :s
|
|
{A.split :t}
|
|
{A.new}
|
|
{- {W.length :t} 1}
|
|
0 }}}}}
|
|
-> caesar
|
|
|
|
|
|
{def text VENI, VIDI, VICI}
|
|
-> text
|
|
{S.map {lambda {:i} {br}:i: {caesar :i {text}}}
|
|
{S.serie 0 26}}
|
|
->
|
|
|
|
0: VENIVIDIVICI
|
|
1: WFOJWJEJWJDJ
|
|
2: XGPKXKFKXKEK
|
|
3: YHQLYLGLYLFL
|
|
...
|
|
23: SBKFSFAFSFZF
|
|
24: TCLGTGBGTGAG
|
|
25: UDMHUHCHUHBH
|
|
26: VENIVIDIVICI
|
|
|
|
As a shorter alternative:
|
|
|
|
{def CAESAR
|
|
{def CAESAR.rot
|
|
{lambda {:shift :txt :alpha :i}
|
|
{A.get {% {+ {A.in? {A.get :i :txt} :alpha} 26 :shift} 26}
|
|
:alpha}}}
|
|
{def CAESAR.loop
|
|
{lambda {:shift :txt :alpha}
|
|
{S.map {CAESAR.rot :shift :txt :alpha}
|
|
{S.serie 0 {- {A.length :txt} 1}}} }}
|
|
{lambda {:shift :txt}
|
|
{S.replace \s by in
|
|
{CAESAR.loop :shift
|
|
{A.split {S.replace \s by in :txt}}
|
|
{A.split ABCDEFGHIJKLMNOPQRSTUVWXYZ}} }}}
|
|
-> CAESAR
|
|
|
|
{CAESAR 1 VENI VIDI VICI}
|
|
-> WFOJWJEJWJDJ
|
|
{CAESAR 25 WFOJWJEJWJDJ}
|
|
-> VENIVIDIVICI
|