Verschlüsseln:
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,
Entschlüsseln:
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/
Die beiden Programme sind um 3 versetzt und nehmen die Eingabe der Form vor:
<2-digit offset> <text>
Der Versatz muss 2-stellig sein, daher muss ein Versatz von 5 als eingegeben werden 05
.
Dies ist eine lange Übermittlung, aber fast alle Zeichen ohne Füllzeichen werden von beiden Programmen verwendet . Es gibt eine Menge Leerzeichen, die definitiv herausgolfen werden können, aber ich dachte, das Programm wäre auf diese Weise interessanter.
Dieses Bild hebt die Zeichen hervor, die von beiden Programmen verwendet werden.
Erläuterung
Das Hauptkonstrukt, das dies ermöglicht _{} -> b~!
, ermöglicht das willkürliche Überspringen von Zeichen im Entschlüsselungsprogramm. Wie?
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
Alles in allem macht das Verschlüsselungsprogramm nichts, aber das Entschlüsselungsprogramm überspringt den nächsten Befehl. Dies kann dann erweitert werden _{}! -> b~!$
, was stattdessen das willkürliche Überspringen von Zeichen im Verschlüsselungsprogramm ermöglicht .
Abgesehen davon drückt der größte Teil des Programms Zahlen, führt Operationen an diesen Zahlen durch und findet dann Möglichkeiten, sie zu platzieren. Ein nützliches Konstrukt ist beispielsweise ~~ -> ""
, bei dem zwei Werte für das Verschlüsselungsprogramm abgelegt werden, im Entschlüsselungsprogramm jedoch keine Pushs ausgeführt werden.
> <> 149 Bytes
Hier ist die weniger interessante Version, die die Tatsache ausnutzt, dass Anweisungen, die nicht durchgereicht werden, effektiv Kommentare in 2D-Sprachen sind.
Verschlüsseln:
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
Entschlüsseln:
^+-~/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~^
Die beiden Programme sind um 84 versetzt und werden auf die gleiche Weise wie oben eingegeben. Der erste Befehl entscheidet, welche Hälfte des Programms ausgeführt werden soll, wobei der i
Programmfluss im Verschlüsselungsprogramm nach rechts (eingegeben) und der ^
Programmfluss im Entschlüsselungsprogramm nach oben (in einer Schleife und von unten zurück) umgeleitet wird.
Erläuterung
Für die relevante Hälfte des Verschlüsselungsprogramms (Entschlüsselungsprogramm ist ähnlich):
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
Codierungswerkzeug
Dies hat nichts mit dem Rest des obigen Beitrags zu tun, aber ich dachte, ich würde das posten, weil ich es verwenden muss: 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>