RosettaCodeData/Task/Caesar-cipher/Lambdatalk/caesar-cipher.lambdatalk

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