introduction
Apparemment, cette question a été posée ici et elle a malheureusement été fermée. Je pensais que c'était une bonne idée d'essayer à nouveau, mais j'ai bien fait.
XKCD examine la manière dont nous sommes formés pour utiliser des mots de passe difficiles à retenir. Il pense que c'est sécurisé, mais prendrait 3 jours pour craquer un ordinateur. D'un autre côté, se souvenir de 4 ou 5 mots apporte l'intropie du mot de passe de Kuan et est facile à retenir. C'est fou comment ça marche, hein?
Défi
Le travail actuel consiste à créer 5 mots de passe en utilisant des mots. 4 mots par mot de passe et un minimum de 4 lettres par mot, mais pas de maximum. L'intropie du mot de passe de Kuan devra être calculée pour chaque mot de passe, mais aucun minimum forcé ne sera défini.
Qu'est-ce que l'intropie du mot de passe de Kuan?
L'intropie de mots de passe de Kuan est une mesure de l'imprévisibilité d'un mot de passe, selon Kuan. Il y a un calcul simple: E = log 2 (R) * L . E étant l'intropie du mot de passe de Kuan, R étant la plage de caractères disponibles et L la longueur du mot de passe.
La gamme de caractères disponibles est explicite. C'est la gamme de caractères qu'un mot de passe peut avoir, en l'occurrence les majuscules et les minuscules. Comme il y a 26 caractères dans l'alphabet, 26 x 2 = 52 caractères dans toute la plage du mot de passe.
La longueur du mot de passe est également explicite. C'est la longueur totale du mot de passe après la création.
Contraintes
- Pas d'entrée.
- Un mot ne peut pas réapparaître dans le même mot de passe.
- Aucun symbole ou nombre autorisé dans un mot de passe.
- 4 mots par mot de passe, mais un minimum forcé de 4 lettres par mot.
- Pas d'espaces entre les mots.
- Vous ne pouvez pas générer le même mot de passe encore et encore.
- Chaque mot doit être mis en majuscule dans un mot de passe.
- La sortie doit être lisible par l'homme et doit être espacée. Doit également inclure l'intropie du mot de passe de Kuan du mot de passe en utilisant l'équation de l'intropie du mot de passe de Kuan ci-dessus.
- Dictionnaire . Vous devez l’utiliser, le télécharger en tant que fichier texte et l’intégrer en conséquence. Ce sera la liste à partir de laquelle vous récupérerez des mots. Votre code devrait supposer qu'il est disponible.
- C'est le code-golf , la plus courte victoire d'octets.
Sortie
TriedScarProgressPopulation 153.9
TryingPastOnesPutting 119.7
YearnGasesDeerGiven 108.3
DoubtFeetSomebodyCreature 142.5
LiquidSureDreamCatch 114.0
N
symboles de l'ensembleS
, l'entropie du mot de passe estlog2(|S|)*N
. Ici, la taille du jeu de symboles est la taille du dictionnaire (|S|=4284
) et le nombre de symboles est le nombre de mots (N=4
), donc l'entropie de chaque mot de passe est48.3
.3t1ta#asd
), l'entropie correspondra au logarithme du nombre de mots de passe possibles. Si vous choisissez toujours 4 mots de manière uniforme et aléatoire dans un dictionnaire de 4284 mots, il existe 4284 ^ 4 mots de passe, chacun avec une entropie log₂ (4284) * 4 ≈ 48.26.Réponses:
Python 2,
1021019791 octetsSuppose que le dictionnaire est une liste nommée
f
.Peut être testé en enregistrant le fichier sous
dict.txt
et en appelantla source
exec
(exec
c’est un mot clé dans Python 2).shuffle(f);
.57*len(x)/10.
. Enregistrez un autre octet en supprimant les parenthèses pour que l’impression prenne un tuple. Voici une version réduite: TIOsample(f,4)
au lieu deshuffle
. Aussif
peut-êtreopen('dict.txt').read().split('\n')
,open('dict.txt').readlines()
ou tout simplementopen('dict.txt')
(je sais que ce n'est pas encore , mais golfed).PowerShell (3.0+), 77 octets
Essayez-le en ligne!
En utilisant le truc de Jonathan Allan
57*len/10
.$d
contient le dictionnaire sous forme de tableau de mots. Si vous jouez à la maison et que vous voulez combler$d
:Utiliser une version golfée de
(Get-Culture).TextInfo.ToTitleCase()
pour capitaliser la première lettre; Je ne pense pas qu'il y ait un moyen plus court de faire cela dans PowerShell.Le reste est assez simple, je pense.
Le lien TIO contient l’ensemble du dictionnaire; désactivez le cache et allez fou!
la source
$d
comme supposé supposer qu’il est présent dans l’environnement.(gc d)| random..
où le dictionnaire est un fichier appelé d dans le même répertoire.Gelée , 22 octets
Un lien monadique prenant une liste de caractères, le dictionnaire analysé (comme autorisé dans le chat ).
Essayez-le en ligne! (Cliquez sur "Arguments" pour masquer le dictionnaire et réduire le besoin de défilement.)
Comment?
Comme le dictionnaire ne contient que des mots valides (
4
caractères ou plus, uniquement[a-z]
), il n’est pas nécessaire de vérifier cette condition.Étant donné que tous les mots du dictionnaire ont une longueur,
[4-8]
les longueurs de mot de passe possibles sont[16,32]
comprises et les entropies possibles ne seront jamais arrondies différemment à une décimale supérieure à celle du remplacementlog(52,2)
par5.7
. Le seul problème est que l' utilisation d' une valeur en virgule flottante5.7
donnera des erreurs d' arrondi en virgule flottante pour les longueurs18
,26
et31
. Cependant, multiplier par57
, puis diviser par10
utiliser×57÷⁵
permet d'éviter ce problème (tout en restant un octet plus court que l'impression de la valeur de précision de virgule flottante complète×52l2¤
).la source
Ruby,
8983 octetsSuppose que les mots de passe sont stockés dans la variable
d
. Vous pouvez ajouter cette ligne avant le code:et appelez le script par exemple comme ceci:
Exemple de sortie:
KitchenMiseryLurkJoints ... wow.
-6 octets de Ajedi32
la source
shuffle!
et en remplaçantpop
parsample
.A word cannot reappear in the same password
, pensant que cela signifiait ne pas réutiliser les mots avec tous les mots de passe. Merci :)Mathematica, 178 octets
Essayez-le en ligne
copier et coller en utilisant ctrl-v et appuyer sur Maj + Entrée pour exécuter
Mathematica, 136 octets
en supposant que m est le dictionnaire, le code est
.
la source
hosts
fichier).Bash ,
6665 octetsEssayez-le en ligne!
Le dictionnaire est recived par STDIN. Mélange tous les mots du dictionnaire et affiche les premiers 4.
Pour chaque mot, additionne sa longueur dans la variable et rappelle le mot en majuscule. En fin de compte, appelle BC pour faire le calcul.
Solution Awk, 112 octets, quatre mots de passe:
la source
(Ceci est une adaptation de la réponse des martistes, mais je n'ai pas le représentant à commenter)
Python,
8886 octetsEn exploitant le caractère
set
non déterministe, vous évitez d'importer des bibliothèques aléatoires.la source
set(f).pop()
.set(f).pop()
cela ne fonctionne pas, je l'ai essayé. Cela donne le même résultat à chaque fois.Japt , 30 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 164 octets
Suppose que le dictionnaire est passé à la fonction en tant que tableau.
Test Snippet
la source
Mathematica, 71 octets
En supposant que le dictionnaire est déjà chargé dans un tableau appelé
d
.Explication:
la source
ColdFusion 216 octets
Cela fonctionne dans ColdFusion 11+ et Lucee 4.5+
Pour l'exécuter: https://trycf.com/gist/ff14e2b27d66f28ff69ab90365361b12/acf11?theme=monokai
Le lien TryCF a moins de golf, mais le même code.
Je ne m'attendais pas vraiment à avoir une réponse compétitive au golf; Je voulais juste voir ce qu'il faudrait faire pour relever ce défi dans ColdFusion. Surtout qu'il n'y a pas beaucoup de FC dans ces réponses. :-) Après l'installation, c'était étonnamment plus court que prévu.
Ma première tentative a été un peu plus courte jusqu'à ce que je me souvienne que le même mot ne peut pas être utilisé plus d'une fois. Même s'il est très improbable que le randomiseur sélectionne le même index plusieurs fois, je dépose les index dans les clés d'une structure, ce qui évite les doublons. Ensuite, j'utilise cette liste de clés pour construire ma chaîne de mot de passe finale. J'ai aussi utilisé le truc mathématique pour trouver l'entropie.
la source
PHP ,
136129 octets-7 octets, merci Jörg
Essayez-le en ligne!
la source
Python 3, 252 octets
C’est mon tout premier défi de golf de code que j’ai fait! Je sais qu'il existe d'autres réponses Python ici (qui sont probablement meilleures que les miennes), mais cela avait l'air amusant, et je voulais donc l'essayer de toute façon. Voici la version golfée:
Je posterais un Essayez-le en ligne! lien, mais cela ne supporte pas plusieurs fichiers. Alors, voici un lien de repl.it: https://repl.it/InIl/0
En outre, voici la version sans golf:
Comme je l’ai dit, c’est ma première fois dans le code gofling, alors je suis sûr que cela pourrait être beaucoup amélioré.
la source
tcl, 137
Pas un gagnant à coup sûr, mais je pense que ça peut être un peu plus joué au golf.
demo - Le but de la ligne 1 est seulement de mettre le contenu du dictionnaire dans la variable
d
la source
Vim, 87 frappes
Suppose que le dictionnaire est dans un fichier nommé
w
. Utilisera toujours 4 mots consécutifsExplication:
la source
q / kdb +,
76746556 octetsSolution:
Exemple:
Explication:
Lire dans la liste de mots, se séparer de "", choisir 4 mots au hasard dans cette liste, mettre la première lettre en majuscule de chaque mot, puis se joindre. Introduisez ceci dans une fonction lambda qui renvoie le mot de passe et l’entropie calculée:
Remarques:
J'ai cédé et utilisé 5.70044 au lieu de
2 xlog 52 xexp
...la source