Mã hóa:
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,
Giải mã:
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/
Hai chương trình được bù 3, và chúng lấy đầu vào của mẫu:
<2-digit offset> <text>
Phần bù phải có 2 chữ số, do đó, phần bù 5 cần được nhập là 05
.
Đây là một bài nộp dài, nhưng gần như tất cả các ký tự không điền được sử dụng bởi cả hai chương trình . Có rất nhiều khoảng trắng chắc chắn có thể được đánh gôn, nhưng tôi nghĩ chương trình này sẽ thú vị hơn theo cách này.
Hình ảnh này làm nổi bật các ký tự được sử dụng bởi cả hai chương trình.
Giải trình
Cấu trúc chính làm cho điều này có thể là _{} -> b~!
, cho phép bỏ qua các ký tự tùy ý trong chương trình giải mã. Làm sao?
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
Nói chung, chương trình mã hóa không làm gì cả, nhưng chương trình giải mã bỏ qua hướng dẫn tiếp theo. Điều này sau đó có thể được mở rộng _{}! -> b~!$
, cho phép bỏ qua các ký tự tùy ý trong chương trình mã hóa thay thế.
Bên cạnh đó, hầu hết các phần còn lại của chương trình đang đẩy số, thực hiện các thao tác trên những số đó sau đó tìm cách bật chúng. Ví dụ, một cấu trúc hữu ích là ~~ -> ""
, bật hai giá trị cho chương trình mã hóa, nhưng không đẩy được gì trong chương trình giải mã.
> <>, 149 byte
Đây là phiên bản ít thú vị hơn, sử dụng thực tế là các hướng dẫn không được thông qua là nhận xét hiệu quả bằng các ngôn ngữ 2D.
Mã hóa:
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
Giải mã:
^+-~/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~^
Hai chương trình được bù bằng 84 và lấy đầu vào giống như trên. Lệnh đầu tiên quyết định một nửa chương trình sẽ thực hiện, với i
(đầu vào) duy trì luồng chương trình ngay trong chương trình mã hóa và ^
chuyển hướng chương trình đi lên (vòng quanh và quay lại từ dưới) trong chương trình giải mã.
Giải trình
Đối với một nửa có liên quan của chương trình mã hóa (chương trình giải mã tương tự):
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
Công cụ mã hóa
Điều này không liên quan đến phần còn lại của bài viết ở trên, nhưng tôi nghĩ tôi sẽ đăng bài này vì tôi cần sử dụng nó: 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>