Enkripsi:
ffii{{~~__:0a('0'*!.0a('0'*22(!'(~$~_:}-}$-a*}+{{if~~:i:0({}?;__:{}84{}*__({}?\__:{} _{}70{}g_{})_{}?\4__{}8*-_{}+{}80{}g_%4_{}8*{}+\\sl||||||||||||||||||||||||||||9||||||||||||||9||||||||||||||||||||||||||||||||||||||||||||||||||||9
> > >!;7f7-_{}!%_{}!<872-d_{}!&_{}!<[755(7(%~~_{}!<[55(7(_{}!*!*23a(_{}!'_{}!"55(7((~~_{}~~~o__'4'0.{{{o,
Dekripsi:
iill~~""bb=3d+*3*-$13d+*3*-55+$*+"'"b=!0!'0d-!.~~li""=l=3+~!B>bb=~!;7~!-bb+~!B_bb=~!#b~!:3~!jb~!,b~!B_7bb~!;-0b~!.~!;3~!jb(7b~!;-~!.__vo < < <
##############################################################################A######################A##############################A$>:i:0b~!$(b~!$?;:50gb~!$)b~!$?^:88+:+(""b~!$?^88+:+b~!$-$-56d+b~!$*b~!$%88+:++""b~!"""rbb*7*31~~~r/
Kedua program diimbangi oleh 3, dan mereka mengambil input dari formulir:
<2-digit offset> <text>
Offset harus 2 digit, sehingga offset 5 harus dimasukkan sebagai 05
.
Ini adalah pengiriman yang panjang, tetapi hampir semua karakter non-filler digunakan oleh kedua program . Ada banyak ruang putih yang pasti bisa bermain golf, tapi saya pikir programnya akan lebih menarik dengan cara ini.
Gambar ini menyoroti karakter yang digunakan oleh kedua program.
Penjelasan
Konstruk utama yang memungkinkan ini adalah _{} -> b~!
, yang memungkinkan melewatkan karakter acak dalam program dekripsi. Bagaimana?
Encrypt:
_ : Mirror, but is a no-op if the program flow is horizontal
{ : Shift stack left
} : Shift stack right
Decrypt:
b : Push 11 to stack
~ : Pop top of stack
! : Skip the next instruction
Secara keseluruhan, program enkripsi tidak melakukan apa-apa, tetapi program dekripsi melewatkan instruksi selanjutnya. Ini kemudian dapat diperluas ke _{}! -> b~!$
, yang memungkinkan melewatkan karakter acak dalam enkripsi program sebagai gantinya.
Selain itu, sebagian besar sisa program mendorong angka, melakukan operasi pada angka-angka itu kemudian menemukan cara untuk menghapusnya. Misalnya, satu konstruk yang bermanfaat adalah ~~ -> ""
, yang mengeluarkan dua nilai untuk program enkripsi, tetapi tidak mendorong apa pun dalam program dekripsi.
> <>, 149 byte
Inilah versi yang kurang menarik, yang menggunakan fakta bahwa instruksi yang tidak dilewati adalah komentar efektif dalam bahasa 2D.
Enkripsi:
i68*:@-a*i@@-+i~v
4:v?)g31:;?(0:i:/8
(?v48*-+03g%48*+\*
_~\of0. .1+1fo/
j*+:zq<6B99A6=qz6g
53Ji?C58/8;?r0?C5:
C?EiJ4r?<EFJ3;EtEg
:tAC5EK8l5tKK86t*i
Dekripsi:
^+-~/5"V~^55" ^sk
)/k4}\(&/04|%/^/$-
|4k)-~" %(\y)-~ Q~
TsQd[%#ttt#& &[d$
_~ /of1+7..6+2fo+\
*(?^48*-$-04g%48*/
84:^?)g41:;?(0:i:\
/i68*:@-a*i@@-+i~^
Kedua program diimbangi oleh 84, dan mengambil input dengan cara yang sama seperti di atas. Instruksi pertama memutuskan setengah dari program yang akan dijalankan, dengan i
(input) mempertahankan aliran program ke kanan dalam program enkripsi, dan^
mengarahkan aliran program ke atas (berputar-putar dan kembali dari bawah) dalam program dekripsi.
Penjelasan
Untuk separuh yang relevan dari program enkripsi (program dekripsi serupa):
i read first input digit as char
68*:@-a* subtract 48 (ASCII "0") and multiply by 10, keeping another 48 on the stack
i read second input digit as char
@@-+ subtract 48 and add to 10*(first digit), giving the offset
i~ read in space and discard it
--- LOOP ---
: copy the offset
i: read input char
:0)?; check if less than 0 (i.e. EOF) and terminate if so
:13g)?v check if greater than ~ in cell (1,3) and drop down if so
48*(?v check if less than 32 and drop down if so
48*-+03g%48*+ calculate Caesar shift of the char, fetching 95 from (0,3)
of1+1. repeat loop
of0. repeat loop
Alat pengkodean
Ini tidak terkait dengan sisa posting di atas, tetapi saya pikir saya akan memposting ini karena saya perlu menggunakannya: P
for(var i=0;i<95;++i){var option=document.createElement("option");option.text=i;document.getElementById("offset").add(option)};function update(m){if(m==1)var code=document.getElementById("in").value;else var code=document.getElementById("out").value;var offset=parseInt(document.getElementById("offset").value);var output="";for(var i=0;i<code.length;i++){var n=code[i].charCodeAt(0);if(n<32||n>127)output+=code[i];else{var c=(n-32+offset*m)%95;output+=String.fromCharCode(c<0?c+95+32:c+32)}}if(m==1)document.getElementById("out").value=output;else document.getElementById("in").value=output};
<html><body><textarea id="in" onkeyup="update(1)" rows=5 style="width:100%"></textarea><textarea id="out" rows=5 style="width:100%" onkeyup="update(-1)"></textarea><select id="offset" onchange="update(1)"></select></body></html>