Écrivez deux programmes:
- Un qui lit une chaîne et une clé et code la chaîne en un chiffrement de barrière ferroviaire à l'aide de cette clé. - De même, écrivez un programme pour la fonction inverse: déchiffrer une clôture ferroviaire à l'aide d'une clé.
Pour ceux qui ne savent pas ce qu'est le chiffrement de clôture ferroviaire, il s'agit essentiellement d'une méthode d'écriture de texte brut d'une manière qui crée un motif linéaire en spirale. Exemple - lorsque "FOOBARBAZQUX" est clôturé sur rail à l'aide de la clé de 3.
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
En lisant la ligne spirale ci-dessus, le texte chiffré devient "FAZOBRAQXOBU".
En savoir plus sur - Chiffre de clôture ferroviaire - Wikipedia .
Le code dans n'importe quelle langue est le bienvenu.
La réponse la plus courte en octets l'emporte.
la source
Réponses:
Python 133 octets
Exemple d'utilisation:
Remarque: les résultats des comptages de rails pairs sont différents de ceux du code que vous avez fourni, mais ils semblent être corrects. Par exemple, 6 rails:
correspond à
AKUBJLTVCIMSWDHNRXEGOQYFPZ
, et nonAKUTBLVJICMSWXRDNHQYEOGZFP
comme le produit votre code.L'idée de base est que chaque rail peut être trouvé directement en prenant des tranches de chaîne
[i::m]
, oùi
est le numéro de rail (0
-indexé), et sem
trouve(num_rails - 1)*2
. Les rails intérieurs doivent en outre être entrelacés avec[m-i::m]
, réalisé en zippant et en joignant les deux ensembles de caractères. Étant donné que le second peut potentiellement être un caractère plus court,il est complété avec un caractère supposé ne pas apparaître n'importe où (il est converti en liste et complété avec une chaîne vide._
), puis ce caractère est supprimé si nécessaire,Une forme légèrement plus lisible par l'homme:
la source
APL
5241Si la chaîne de texte d'entrée i et le numéro de clé n sont préinitialisés, la solution peut être raccourcie de 9 caractères. L'exécution de la solution contre les exemples donnés par primo donne des réponses identiques:
Après réflexion, il semble y avoir une solution basée sur un indice plus court:
la source
Python 2 , 124 + 179 = 303 octets
Encoder:
Essayez-le en ligne!
Décoder:
Essayez-le en ligne!
la source
MATL, 70 octets (total)
Essayez-le sur MATL en ligne
Essayez plusieurs cas de test
Prend un drapeau comme troisième entrée,
F
pour chiffrer la chaîne,T
pour la déchiffrer (merci à Kevin Cruijssen pour cette idée).Cela a commencé comme une réponse de Julia jusqu'à ce que je réalise que la frappe stricte gênait trop, surtout pour le déchiffrement. Voici le code Julia que j'avais pour le chiffrement (rétroporté vers la v0.6 pour TIO):
Julia 0,6 , 191 octets
Essayez-le en ligne!
Explication:
L'opération de clôture ferroviaire
peut être vu comme lisant r = 3 caractères d'entrée, puis lisant r-2 caractères et préfixant et suffixant cela avec des valeurs fictives (null), puis relisant r caractères, etc., créant une nouvelle colonne à chaque fois:
puis inverser toutes les deux colonnes (puisque la partie zag du zigzag monte au lieu de descendre, ce qui fait une différence lorsque r> 3), puis lit cette matrice le long des lignes et supprime les caractères fictifs.
Le déchiffrement ne semblait pas avoir de modèles évidents comme celui-ci, mais en cherchant à ce sujet, je suis tombé sur ce post , qui m'a dit que (a) c'était un algorithme bien connu et (peut-être?) Publié pour les chiffrements ferroviaires, et ( b) le déchiffrement était une simple réutilisation de la même méthode, lui donnant les indices de la chaîne et obtenant les indices de ces indices après chiffrement, et lisant le texte chiffré à ces endroits.
Étant donné que le déchiffrement doit faire des choses en travaillant sur les indices, ce code effectue également le chiffrement en triant les indices de la chaîne, puis dans ce cas simplement en indexant ces index réarrangés.
la source
Je veux être expliqué dans ce code.
la source
Java 10,
459451445439327 octets-12 octets grâce à @ceilingcat .
-112 octets combinant les deux fonctions avec un indicateur de mode supplémentaire en entrée.
La fonction prend une troisième entrée
M
. Si c'est le cas,true
il chiffrera et s'il l'est,false
il déchiffrera.Essayez-le en ligne.
Explication:
la source