Votre tâche consiste à prendre une chaîne cryptée en entrée et à sortir la chaîne décryptée pour révéler son message caché.
Les chaînes, à la fois l'entrée et la sortie, contiendront des caractères de cette liste de 64 caractères ASCII (notez l'espace de tête):
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
Ces caractères se voient attribuer des numéros, dans l'ordre indiqué ci-dessus:
! " # $ % & ...
0 1 2 3 4 5 6 ...
Ainsi, l'espace est le numéro 0, le !
numéro 1 et le ~
numéro 63. Ces nombres peuvent être représentés en code binaire 6 bits:
: 0: 000000
!: 1: 000001
": 2: 000010
#: 3: 000011
.. ... ......
z: 61: 111101
|: 62: 111110
~: 63: 111111
Le cryptage est très simple:
Je vais utiliser eC
pour les caractères cryptés et C
pour les caractères de la chaîne d'origine. C(n)
est le nième caractère de la chaîne d'origine, tandis que eC(n)
le nième caractère de la chaîne cryptée.
Vous utiliserez la représentation binaire 6 bits des caractères. Le premier caractère sera eC(0) = not(C(0))
. De là, tous les personnages le seront eC(n) = xor(C(n),C(n-1))
.
Exemple:
Supposons que la chaîne d'entrée soit code
.
c
est le 38ème caractère (indexé zéro), ou100110
en binaire. La version chiffrée a tous les bits inversés, donc011001 -> 25 -> '9'
(encore une fois, zéro indexé).o
est le 50e caractère, ou110010
en binaire.xor(100110, 110010) = 010100 = 20 = '4'
.d
est le 39ème caractère, ou100111
en binaire.xor(100111, 110010) = 010101 = 21 = '5'
.e
est le 40ème caractère, ou101000
en binaire.xor(101000, 100111) = 001111 = 15 = '/'
.
Donc, si la chaîne d'origine est code
, la chaîne cryptée deviendra 945/
.
Cas de test:
945/
code
,&'8[14 =?;gp+% 2'@s&&c45/eg8?&
programming puzzles & code golf
;a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com
~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
la source
Réponses:
Gelée ,
2726 octetsEssayez-le en ligne!
Version alternative, 22 octets (non concurrente)
Jelly a finalement rattrapé d'autres langages de golf et a obtenu un atome ASCII imprimable , donc cela fonctionne maintenant.
Essayez-le en ligne!
Comment ça fonctionne
la source
JavaScript (ES6), 115 octets
Cas de test
Afficher l'extrait de code
la source
^
va à droite de la]
. La réponse fonctionne toujours avec ce changement pour les cas de test, je crois.d
partir de ce qui manque?Gelée ,
3431 octets-3 octets grâce à Dennis (utilisez
ḟ
deux fois plutôt queœ-
,;
et¤
; utilisez”~
plutôt que 63 )Un lien monadique prenant et renvoyant des listes de personnages.
* Note: les arguments d'entrée à un programme Jelly utilisent chaîne Python mise en forme, afin de citer avec
"
,'
,'''
(ou si non ambiguë citant non) sont toutes les options.Essayez-le en ligne!
Comment?
Bitwise-xor est inversible (étant donné les "zéros de tête").
Bitwise-Not est un xor avec "tous les" - dans ce cas, seuls 6 sont nécessaires, donc 2 7 -1 = 63 .
Une fois que nous avons créé le tableau ou les caractères et recherché les index des caractères d'entrée, le décodage lui-même est alors simplement une réduction cumulative par bit-xor, après quoi nous pouvons réindexer dans le même tableau.
* Remarque: la recherche d'un espace dans p donnera un 64, mais ce n'est pas un problème puisque l'indexation dans p est modulaire, donc l'ajout d'un interligne
1
revient à ajouter 64, ramenant l'index à l'endroit où il doit être).la source
Java, 225 octets
Je n'ai pas joué au golf à Java depuis très longtemps, donc tous les conseils de golf sont appréciés.
Essayez-le en ligne!
la source
String D(String E){
devient doncE->{
(-15 octets);-1-J
peut être+~J
(-1 octet); eti=-1
peut êtrei=0
, le++
peut être déplacé versi++<1?
, puis lei-1
devienti-2
(-1 octet). Essayez-le en ligne: 208 octets05AB1E , 40 octets
Essayez-le en ligne!
Explication
la source
Jeu d'instructions CPU x86, 235 octets
La fonction find () et deCript () + la chaîne abc: 171 octets + 64 octets = 235 assemblage avec nasmw et compilateur / bibliothèque avec le compilateur Borland C:
résultats:
L'assemblage est meilleur (par exemple le vrai j'utilise un système de macro, oui je sais qu'il est trop long mais comme le C one + - avec le système de macro, par exemple le vrai parce que les instructions sont plus simples, il est facile d'écrire du code dans l'assemblage même sans faire des corrections en un seul écrit en anglais (pas moi))
la source
C (gcc) , 153 octets
Essayez-le en ligne!
Légèrement moins golfé
la source
APL (Dyalog Unicode) , 52 octets SBCS
A besoin
⎕IO←0
Essayez-le en ligne!
la source
¨
:{C[2⊥≠\⍉~@0⍉(6/2)⊤⍵⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']}
⍵
, vous pouvez enregistrer deux octets par conversion en un programme complet:C[2⊥≠\⍉~@0⍉(6/2)⊤⍞⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']
Roda ,
120100 bytesEssayez-le en ligne!
J'ai utilisé l'
l=63
astuce de la réponse JavaScript.En ce moment je travaille sur le raccourcissementA
donc le golf est en cours ...la source
Python 2 , 155 octets
Essayez-le en ligne!
la source
PHP, 103 octets
Essayez-le en ligne!
PHP, 107 octets
Essayez-le en ligne!
PHP, 118 octets
Essayez-le en ligne!
la source
Python + Numpy, 214 octets
Ne peut pas rivaliser avec une autre solution Python, mais utilise une approche numérique pure et différente:
Un peu d'explication:
S=A(r(32,60)+...)
- définir l'alphabet comme des plages de codesT=A(r(128))
- table de hachage init de taille 128 (plus grand point de code)T[S]=A(r(64))
- remplir la table de hachage, c'est-à-dire écrire des indices 0-63 aux éléments avec des indices ASCIIW=T[fromstring(s,"b")]
- convertir l'entrée en tableau et la traduire en nouveaux codesW[0]=~W[0]
- inverser la 1ère valeurW=S[bitwise_xor.accumulate(W)&63]
- utilisez la méthode d'accumulation de Numpy avec xor pour éviter la boucle, réinitialisez les 2 bits de gauche et retransformez en asciila source
Alice , 46 octets
Essayez-le en ligne!
Explication
La première moitié du programme s'exécute en mode ordinal et configure le mappage des nombres aux caractères. La seconde moitié s'exécute en mode cardinal et utilise ce mappage pour décoder l'entrée.
la source
Japt
-P
, 33 octetsEssayez-le en ligne!
Pour une raison quelconque, les cas de test s'opposent à l'exécution en tant que suite, voici donc les deuxième , troisième et quatrième individuellement.
Explication:
la source
APL (NARS), 72 caractères, 144 octets
Cela suppose que l'entrée est toujours dans le tableau ... Pour comprendre comment déchiffrer, j'ai dû d'abord écrire la version d'assemblage ... test:
la source
105103 octets, le code de machine (x86 16 bits), 57 instructionsEn cours d'exécution: enregistrer sur codegolf.com, dosbox:
codegolf.com < input.bin
Partie amusante presque oubliée:
Howdy, ceci est ma deuxième entrée. Le précédent était RC4 . Fait avec HT hexeditor , sans compilateur , mais cette fois, j'utilisais Ctrl-a
assemble instruction
, je ne sais toujours pas si cela compte comme entrée ou non.Pourquoi comment
De la même manière, j'ai commencé par créer un fichier avec
NOP
s, puis j'ai réutilisé la lecture / écriture à partir de RC4 . J'ai d'abord écrit en «échelle de traduction» en python de ascii à index. et utilisé cela dans l'assemblage, créé une échelle similaire en sens inverse, enfin j'ai ajouté une petite astuce pour gérer le premier octetDe manière similaire à RC4, la dernière étape consistait à se débarrasser des
nops
, ce qui nécessitait de réparer les sauts.Dissection
Encore une fois, le programme repose sur les valeurs de registre initiales .
Mannequin, sera nécessaire plus tard
lire l'octet
quitter si stdin a terminé
échelle qui traduit ascii en index (sachez que tous les sauts vont à 0x134)
x ou octet par octet précédent,
SI
points à l'adresse0x100
, qui contient initialement 0xFF à partir de l'opcode d'une instruction factice en haut, ce qui entraîne un comportement négatif (rappel: les COM sont chargés à 0x100)limiter le résultat à l'index et stocker l'octet à 0x100,
échelle en sens inverse
mettez l'octet sous [di], écrivez l'octet dans stdout (sachez que AH = 40h utilise DX comme adresse, mais il a été défini en haut, lors de la lecture de l'octet)
gardez à l'esprit que stdin -> stdout et stdout vers stdin se fait en utilisant inc bx / dec bx
boucle ^^
Outils et ressources
la source