Crypter:
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,
Déchiffrer:
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/
Les deux programmes sont décalés de 3 et prennent la forme:
<2-digit offset> <text>
Le décalage doit être de 2 chiffres, donc un décalage de 5 doit être entré comme 05
.
Il s'agit d'une longue soumission, mais presque tous les caractères non remplisseurs sont utilisés par les deux programmes . Il y a beaucoup d'espaces qui peuvent certainement être joués au golf, mais je pensais que le programme serait plus intéressant de cette façon.
Cette image met en évidence les caractères utilisés par les deux programmes.
Explication
La construction principale qui rend cela possible est _{} -> b~!
, qui permet de sauter arbitrairement des caractères dans le programme de déchiffrement. Comment?
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
Dans l'ensemble, le programme de cryptage ne fait rien, mais le programme de décryptage ignore l'instruction suivante. Cela peut ensuite être étendu à _{}! -> b~!$
, ce qui permet à la place de sauter arbitrairement des caractères dans le programme de chiffrement .
En dehors de cela, la plupart du reste du programme consiste à pousser les numéros, à effectuer des opérations sur ces numéros, puis à trouver des moyens de les faire apparaître. Par exemple, une construction utile est ~~ -> ""
, qui affiche deux valeurs pour le programme de chiffrement, mais ne pousse rien dans le programme de déchiffrement.
> <>, 149 octets
Voici la version la moins intéressante, qui utilise le fait que les instructions non transmises sont en fait des commentaires en langage 2D.
Crypter:
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
Déchiffrer:
^+-~/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~^
Les deux programmes sont décalés de 84 et prennent les entrées de la même manière que ci-dessus. La première instruction décide quelle moitié du programme exécuter, avec i
(entrée) maintenant le flux du programme vers la droite dans le programme de cryptage et ^
redirigeant le flux du programme vers le haut (en boucle et en revenant par le bas) dans le programme de décryptage.
Explication
Pour la moitié pertinente du programme de cryptage (le programme de décryptage est similaire):
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
Outil de codage
Ce n'est pas lié au reste du post ci-dessus, mais je pensais que je posterais ceci parce que je dois l'utiliser: 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>