Mots de passe de Bob

13

introduction

Bob aime avoir des mots de passe différents pour chaque site Web qu'il utilise. Il veut des mots de passe dans un format spécial pour qu'il puisse s'en souvenir. Aidez-le en construisant un générateur de mot de passe aussi court que possible en longueur de code, car il aime garder les choses courtes comme son nom.

Défi

Construisez Bob un générateur de mot de passe qui prend quatre paramètres -

  • Adresse de domaine, (ex: stackexchange.com)
  • Prénom,
  • nom de famille,
  • Date et année de naissance.

et sort une chaîne qui a subi les transformations suivantes.

Chaque mot de passe a un modèle basé sur la longueur l du nom de domaine. Si l est premier, le modèle est de cette forme -

[birth-date][domain-name][lastname][birth-year][symbol]

sinon c'est de cette forme -

[symbol][birth-year][firstname][domain-name][birth-date].

Le champ de symbole aura des valeurs basées sur le type de domaine.

.com -> $$$
.org -> &&&
.net -> %%%
.edu -> +++
.gov -> @@@
.mil -> >>>
par défaut -> ~~~

Maintenant, il veut aussi exécuter un chiffrement par césar sur les champs - [firstname][domain-name][lastname]. La direction du décalage est à droite si l est premier, sinon elle est à gauche. La valeur de décalage est déterminée par la valeur d'ajout de la date et de l'année de naissance.

Après le processus ci-dessus, le texte ne peut pas être facilement mémorisé, il veut donc que le texte chiffré soit prononçable. Pour ce faire, il veut remplacer chaque troisième consonne consécutive par une voyelle dans l'ordre alphabétique (c'est-à-dire aeiou).

Enfin, il souhaite supprimer les occurrences consécutives de mêmes lettres.

Exemple

Entrée - stackexchange.com bob williams 0894

Sortie - 08qraicvafyecugjigyoq94 $$$.

Explication:

Le modèle de mot de passe est [birth-date][domain-name][lastname][birth-year][symbol], car la longueur du nom de domaine stackexchangeest un nombre premier. Le symbole sera $$$tel que le type de domaine .com.

Remplissons ces valeurs dans le modèle - 08stackexchangewilliams94$$$. Maintenant, le chiffre César doit être exécuté sur les champs [firstname][domain-name][lastname](c'est juste le nom de famille dans ce cas). La direction du décalage est correcte car l est premier et la valeur de décalage est 08+94 = 102.

Alors, 08stackexchangewilliams94$$$se transforme en 08qryaicvafylecugjjgykq94$$$. Maintenant, chaque troisième consonne consécutive est remplacée par une voyelle - 08qraaicvafyeecugjigyoq94$$$ toutes les occurrences consécutives de la même lettre sont supprimées - 08qraicvafyecugjigyoq94$$$. Ne vous inquiétez pas, c'est prononçable pour Bob.

information additionnelle

  • L'adresse de domaine, le prénom et le nom de famille ne contiennent que des alphabets minuscules.
  • L'adresse de domaine sera toujours constituée uniquement d'un domaine de second niveau et de niveau supérieur, comme stackexchange.comet non codegolf.stackexchange.com. De plus, des domaines comme .co.ukn'est pas autorisé mais juste .ukou .invalide.
  • Le remplacement de la voyelle dans l'ordre alphabétique est cyclique. Je veux dire après u, aest utilisé pour remplacer.
  • La plage ASCII pour le chiffre César est comprise entre 97 et 122 inclus.
  • Vous pouvez prendre des informations comme décrit ici .
  • La sortie doit être une chaîne.
  • Le format de la date et de l'année de naissance est ddet yy.So 02est donc acceptable et 2ne l'est pas.

Il s'agit de code-golf, donc le code le plus court en octets l'emporte. Bon golf!

Gurupad Mamadapur
la source
4
Le nom de domaine sera-t-il toujours composé uniquement d'un domaine de deuxième niveau et de niveau supérieur, comme stackexchange.com, non img.stackexchange.com? Qu'en est-il des domaines de pays comme bbc.co.uk?
briantist
Votre exemple d'appel utilise 0894qui s'additionne 102mais l'explication utilise 08+96=106. Le texte chiffré semble utiliser la 102valeur. Juste une légère incohérence qui pourrait être source de confusion ...
briantist
6
Bob est un mofo fou s'il peut prononcer cela.
Urne de poulpe magique du
5
@carusocomputing Peut-être que Bob est gallois?
briantist
1
Non, je veux dire que vous defualtne default
tapez

Réponses:

7

PowerShell 3+, 480 476 474 453 450 448 octets

param($d,$f,$l,$b)$s,$t=$d-split'\.'
$m,$y=$b-split'(?<=..)(?=..)'
$v=+$m+$y
$p='1'*$s.Length-match'^(?!(..+)\1+$)..'
$c={-join([char[]]"$input"|%{[char](97..122)[((+$_-97)+((26-$v),$v)[$p])%26]})}
$s=$s|&$c
$f=$f|&$c
$l=$l|&$c
$a=(($a=@{com='$';org='&';net='%';edu='+';gov='@';mil='>'}.$t),'~')[!$a]*3
("`"$(("$a$y$f$s$m","$m$s$l$y$a")[$p]-replace'([^aeiou\d]{3})',"`$('`$1'-replace'[a-z]`$$',('aeiou'[`$i++%5]))")`""|iex)-replace'([a-z])\1+','$1'

Essayez-le en ligne!

Enregistré 24 26 octets grâce à TimmyD !

Wow, c'était fou. Je ne pense pas pouvoir publier une ventilation complète de cela avant plus tard ou demain.

Remarque: toutes les fins de ligne sont \n( 0x10), de sorte que je n'ai pas à utiliser ;et à mettre tout cela sur une seule ligne.

Rapide vue d'ensemble:

  1. Divisez le domaine entre le deuxième niveau et le niveau supérieur.
  2. Divisez la date de naissance en mois et année.
  3. Calculez la valeur de décalage.
  4. Déterminez si la longueur du SLD est prime. Étant donné que le segment ne peut pas dépasser 63 caractères ( voir également RFC 1035 ), je pense qu'il était plus court juste pour coder en dur la liste des nombres premiers :) Utilisation de la méthode regex suggérée.
  5. Définissez un bloc de script (fonction anonyme essentiellement) pour effectuer le chiffrement César.
  6. Appliquer le chiffre au SLD, prénom et nom
  7. Obtenez le symbole avec une table de hachage et une entreprise drôle d'indexation.
  8. Enfin, un gâchis géant où j'applique le modèle approprié, exécutez un remplacement pour les triplets de consonnes, en remplaçant chacun par une sous-expression (code) qui remplacera cette section par la valeur appropriée, puis exécutez la chaîne résultante via Invoke-Expression( iex) pour exécuter le généré du code intégré, puis un remplacement final des lettres consécutives par une seule lettre.
briantiste
la source
@TimmyD wow je n'ai jamais vu ça avant, et c'est génial. Merci!
briantist
@TimmyD vous savez, à l'origine, j'ai essayé de l'écrire avec unary -joinet j'aurais juré qu'il rejoignait des espaces et non des $nulls, ce qui m'a surpris, mais après l'avoir réessayé, cela a fonctionné comme je m'y attendais à l'origine. Bizarre (et merci encore)!
briantist