Introduction:
J'ai des tas de chiffrements différents stockés dans un document que j'ai compilé quand j'étais enfant, j'ai choisi quelques-uns de ceux que je pensais être les mieux adaptés aux défis (pas trop triviaux et pas trop difficiles) et les ai transformés en défis. La plupart d'entre eux sont toujours dans le bac à sable, et je ne sais pas encore si je vais tous les poster, ou seulement quelques-uns. Mais voici le premier à commencer.
Un chiffrement informatique chiffrera le texte donné en groupes de caractères «aléatoires» d'un donné length
. Si un tel groupe contient un chiffre, il utilisera ce chiffre pour indexer dans son propre groupe le caractère chiffré. Si aucun chiffre n'est présent dans le groupe, cela signifie que le premier caractère est utilisé.
Par exemple, disons que nous voulons chiffrer le texte this is a computer cipher
avec une longueur donnée de 5
. Il s'agit d'une sortie potentielle (remarque: les nombres sont indexés 1 dans l'exemple ci-dessous):
t h i s i s a c o m p u t e r c i p h e r (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv (without spaces of course, but added as clarification)
Prenons quelques groupes comme exemples pour expliquer comment déchiffrer le groupe:
qu5dt
: Ce groupe contient un chiffre5
, de sorte que le 5 (1-indexé) caractère de ce groupe est le caractère utilisé pour le texte déchiffré:t
.hprit
: Ce groupe ne contient pas de chiffres, de sorte que le premier caractère de ce groupe est utilisé implicitement pour le texte déchiffré:h
.osyw2
: Ce groupe contient un chiffre2
, de sorte que le (1-indexé) 2e caractère de ce groupe est le caractère utilisé pour le texte déchiffré:s
.
Défi:
Étant donné un entier length
et une chaîne word_to_encipher
, sortez une chaîne chiffrée aléatoire comme décrit ci-dessus.
Vous n'avez qu'à chiffrer étant donné le length
et word_to_encipher
, donc pas besoin de créer un programme / fonction de déchiffrement également. Cependant, je pourrais faire un défi de partie 2 pour le déchiffrement à l'avenir.
Règles du défi:
- Vous pouvez supposer que le
length
sera dans la plage[3,9]
. - Vous pouvez supposer que le
word_to_encipher
test ne contiendra que des lettres. - Vous pouvez utiliser des minuscules ou des majuscules (veuillez indiquer celui que vous avez utilisé dans votre réponse).
- Vos sorties, chaque groupe et les positions des chiffres dans un groupe (le cas échéant) doivent être uniformément aléatoires . Ainsi, toutes les lettres aléatoires de l'alphabet ont les mêmes chances de se produire; la position de la lettre chiffrée dans chaque groupe a les mêmes chances de se produire; et la position du chiffre a les mêmes chances de se produire (sauf lorsqu'il s'agit du premier caractère et qu'aucun chiffre n'est présent; et il ne peut évidemment pas être à la même position que le caractère chiffré).
- Vous êtes également autorisé à utiliser des chiffres indexés de 0 au lieu de 1 indexés. Veuillez indiquer laquelle des deux vous avez utilisée dans votre réponse.
- Le chiffre
1
(ou0
lorsqu'il est indexé 0) ne sera jamais présent dans la sortie. Ceb1ndh
n'est donc pas un groupe valide pour chiffrer le caractère «b». Toutefois,b4tbw
est valable, où les4
chiffre leb
à la position 4 (1-indexé), et les autres personnagesb
,t
,w
sont aléatoires (qui par coïncidence contient également unb
). D' autres groupes possibles valides delength
5 à Chiffrer le caractère « b » sont:abcd2
,ab2de
,babbk
,hue5b
, etc.
Règles générales:
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues non-golfeur de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Des règles standard s'appliquent à votre réponse avec des règles d'E / S par défaut , vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code (par exemple TIO ).
- De plus, l'ajout d'une explication à votre réponse est fortement recommandé.
Cas de test:
Input:
Length: 5
Word to encipher: thisisacomputercipher
Possible output:
qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv
Input:
Length: 8
Word to encipher: test
Possible output:
ewetng4o6smptebyo6ontsrbtxten3qk
Input:
Length: 3
Word to encipher: three
Possible output:
tomv3h2rvege3le
abcd2
,ab2de
,babbk
tout de même? Est égalementb1akk
valide?b1akk
moi, je dirais non. Le modifiera dans la description du défi pour clarifier. Si le premier caractère est le chiffre chiffré, aucun chiffre ne doit être présent."a??"
a 676 résultats possibles, mais"1a?"
,"?a1"
,"2?a"
,"?2a"
, a only104 résultats. Donc, si j'essaye de choisir un résultat parmi tous ces 780 résultats, la distribution de la "position de la lettre chiffrée" est 13: 1: 1, pas 1: 1: 1. Et je considérerais cela comme un fonctionnement "uniformément aléatoire".Réponses:
Pyth, 22 octets
Essayez-le en ligne.
Utilise l'index en minuscules et zéro.
Explication
Algorithme très simple.
la source
Perl 6 , 125 octets
Essayez-le en ligne!
Prend l'entrée et la sortie en majuscules. Prend les entrées au curry, comme
f(n)(string)
. Utilise 1 indexation.Explication:
la source
Python 2 ,
187177176156154148 octetsEssayez-le en ligne!
Utilise des lettres majuscules et des nombres indexés 0.
-3 octets, merci à Kevin Cruijssen
la source
sample(R(l),2)[::1|-(random()<.5)]
dire?range(l)
et les mélange. Mais apparemment, l'échantillon ne garantit pas la commande, il n'est donc pas nécessaire :)(j==i)*(n>0)
? La multiplication a la priorité de l'opérateur sur la soustraction, n'est-ce pas?JavaScript (Node.js) , 135 octets
Essayez-le en ligne!
Merci Arnauld pour 1B
la source
R ,
134132123 octetsEssayez-le en ligne!
Prend des lettres majuscules.
Explication de l'ancien code (essentiellement la même approche):
la source
Java (JDK) , 193 octets
Essayez-le en ligne!
IntStream
(obtenuString::chars
) comme entrée, ainsi qu'un nombre et renvoie un autreIntStream
.double
àint
sont inutiles à cause du+=
hack.la source
Japt , 29 octets
Essayez-le en ligne!
Zéro indexé.
Explication:
la source
C, 115 octets
Essayez-le en ligne!
Index 0, minuscule.
Légèrement non golfé et étendu:
Le code devrait être assez simple. Les deux aléas
i
,j
générés en un seulrand()
appel sont bons car indépendants puisque gcd (n
,~-n
) = 1 etRAND_MAX
est grand.la source
Nettoyer , 256 octets
Essayez-le en ligne!
Choisit:
x
(position du personnage dans le segment)y
qui n'est pas égal àx
(position du chiffre dans le segment)x
et non égale ày
moins quex
zérola source
JavaScript, 134 octets
Essayez-le en ligne!
Cette réponse a choisi la chaîne codée parmi toutes les chaînes codées possibles uniformément. Il est donc plus possible de faire de la lettre encodée la première.
la source
C # (Visual C # Interactive Compiler) , 171 octets
Essayez-le en ligne!
Explication...
la source
Fusain ,
3530 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. 0 indexé. Explication:
Saisissez la longueur.
Saisissez le mot et bouclez sur les caractères.
Choisissez une position aléatoire pour la lettre déchiffrée.
Choisissez une position aléatoire différente pour le chiffre, sauf si la lettre est à la position 0, auquel cas placez également le chiffre à la position 0.
Faites une boucle pour chaque caractère de sortie et activez la position.
S'il s'agit de la position du chiffre, affichez la position de la lettre déchiffrée.
Mais si c'est la position de la lettre déchiffrée, sortez la lettre. Cela a priorité sur la position du chiffre car le charbon de bois prend la dernière entrée si plusieurs boîtiers de commutation ont la même valeur.
Sinon, affichez une lettre aléatoire.
la source
05AB1E , 26 octets
0 indexé.
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source