Écrivez un programme qui prend deux lignes d'entrée et utilise la première comme une phrase clé pour crypter la seconde selon la technique de cryptage Playfair.
Wikipedia décrit le cryptage Playfair en détail , mais pour éviter toute ambiguïté, voici un bref résumé:
1. Générez un tableau clé:
Remplacez toutes les occurrences de J
dans la phrase clé par I
, puis supprimez tous les caractères non alphabétiques et les caractères répétés. Insérez dans une table de cryptage 5 × 5, remplissant les cellules restantes avec le reste de l'alphabet (sauf J
; nous n'aimons pas J
).
Exemple:
S T A C K
O V E R F
Stack Overflow --> STACKOVERFLW --> L W B D G
H I M N P
Q U X Y Z
2. Préparez le message à chiffrer
Remplacez-les J
par un I
, supprimez tous les caractères non alphabétiques et divisez-les en paires, en utilisant un X
pour séparer deux fois les paires contenant la même lettre. Si vous vous retrouvez avec un nombre impair de lettres, ajoutez X
à la fin. (Note: numéraux doivent être précisées en pleine - ONE
, TWO
, THREE
, etc. - mais vous pouvez supposer cela a déjà été fait pour vous.)
Exemple:
In:
The cat crept into the crypt, crapped, and crept out again.
Out:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
3. Cryptage
Chiffrez chaque paire de lettres à tour de rôle. S'ils se trouvent dans des lignes et des colonnes différentes de la table des clés, remplacez chacun par la lettre de la même ligne dans la colonne où se trouve l'autre lettre (par exemple, VM
⇒ EI
, LZ
⇒ GQ
). S'ils sont dans la même ligne (ou colonne), choisissez les deux caractères immédiatement à droite (ou en dessous), en les enroulant si nécessaire (par exemple, OE
⇒ VR
, ZG
⇒ KP
).
Exemple:
In:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
Out:
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY
La chaîne produite par ce processus est le message chiffré, que votre programme doit sortir.
Règles:
- Le texte et la clé d'entrée peuvent être obtenus à partir d'
stdin
arguments de ligne de commande ou d'autres sources similaires. L'entrée codée en dur n'est pas autorisée. - Votre programme doit accepter les majuscules et les minuscules pour la phrase de passe et le message.
- La sortie chiffrée peut être en majuscule ou en minuscule.
- Votre programme doit accepter des phrases clés d'au moins 64 caractères et des textes de message d'au moins 16 Ko.
- Vous n'êtes pas obligé de gérer les entrées non ASCII.
- Vous pouvez ignorer la possibilité que la paire de lettres
XX
se produise pendant le cryptage. - Il n'est pas nécessaire d'ajouter des espaces à la sortie du programme.
- Votre réponse doit inclure un exemple de message, de phrase clé et de sortie chiffrée produite par votre programme.
- Il s'agit d'un défi de golf de code, donc la réponse avec le code le plus court (en octets) gagnera.
REMARQUE: N'oubliez pas que vous ne devez couper les lettres consécutives que si elles apparaissent dans la même paire . Ainsi, par exemple,
MASSACHUSETTS
devrait être chiffré commeMA SX SA CH US ET TS
- le doubleS
doit être divisé, mais pas le doubleT
.
la source
J
" Avez-vous des sentiments similaires à propos de l'APL?Réponses:
JI *,536431417380263218203197186167(avec de nombreuses suggestions de @algorithmshark)
exemple d'utilisation:
divise correctement l'entrée:
* remplacez chaque
J
par unI
, non?la source
Rubis,
461411366359352346330 caractèresMerci à @daniero pour avoir sauvé ... euh, beaucoup d'octets. \ o /
Voici le code non golfé:
Voici quelques exemples de sorties:
la source
chars
dans un tableau, en supposant que vous utilisez Ruby 2. Vous pouvez également utiliser&
comme opérateur d'ensemble au lieu detr
:t=->s{s.gsub(?j,?i).upcase.chars&[*?A..?Z]}
(7 octets enregistrés). Les deux lignes suivantes peuvent être jointes avec quelque chose commek,m=[1,2].map{t[gets.chop]}
(notezchop
plutôt quechomp
).&
élimine également le besoin deuniq
plus tard. Et la fonctionchars
to array s'applique également à la ligne 6.tr
à&
la ligne 1 ne fonctionne pas parce quem
ne peut pas êtreuniq
ified. Cependant,k.uniq
peut être raccourci à(k&k)
(1 octet désactivé).C:
495401355341 caractèresC'est juste un croquis approximatif pour l'instant. Je devrais pouvoir raser au moins une centaine de caractères.Objectif atteint: plus d'une centaine de caractères (154 à partir de maintenant) ont mystérieusement disparu du code.
Avec un espace blanc agréable:
J'ai écrit la première itération du programme sur le point de s'endormir, donc il y avait beaucoup de déclarations inutiles et autres. La plupart de ces problèmes sont corrigés, mais il existe de nombreux domaines où des améliorations sont très certainement possibles.
la source
Matlab - 458 caractères
Quelques exemples:
la source
Haskell - 711
Démo:
Code:
Grande version:
la source
Pyth - 111
Trop tard pour participer, je voulais juste partager. Voici l'encodeur et le décodeur
Explication:
Exemple de clé / message / sortie:
la source
C, 516
Ajout de sauts de ligne pour une meilleure
lisibilité. (La lisibilité est sortie par la fenêtre, je le crains.)Exemple:
la source
Python 3,
709705685664Accepte les entrées de stdin.
Exemple:
la source
Python: 591 octets
Cela permet
stdin
d'obtenir la clé et le message dans cet ordre. J'espère que ce n'est pas de la triche d'utiliser une liste plate pour stocker la matrice de cryptage, car cela a rendu le travail avec la matrice assez simple. Voici quelques exemples d'exécutions:la source
z
àlambda x:0if b not in x else b.remove(x)or 1
. Il y a aussi beaucoup d'espace dont vous pouvez vous débarrasser. Cela vous permettrait également de le déplacer directement dans l'filter
appel au lieu de le définir à l'extérieur.Java - 791
Mon premier golf, donc toute critique est la bienvenue. Utiliser Java parce que je ne devrais pas. Cela ne semble pas si mal; moins du double de la taille du leader actuel. Je m'attendais à ce qu'il soit plus grand car c'est, eh bien, Java :)
Avec formatage automatique:
Exemple de sortie:
la source
JS (nœud) -
528466Exemple de sortie:
la source
UU
. On dirait qu'il y a eu une répétitionE
que vous auriez dû diviser.PHP 582
Décodeur non golfé
les sorties
la source
Perl, 265
Très simple.
Dentelé:
la source
CoffeeScript - 610
Démo:
Code:
Version non golfée:
la source