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 stackexchange
est 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.com
et noncodegolf.stackexchange.com
. De plus, des domaines comme.co.uk
n'est pas autorisé mais juste.uk
ou.in
valide. - Le remplacement de la voyelle dans l'ordre alphabétique est cyclique. Je veux dire après
u
,a
est 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
dd
etyy
.So02
est donc acceptable et2
ne l'est pas.
Il s'agit de code-golf, donc le code le plus court en octets l'emporte. Bon golf!
stackexchange.com
, nonimg.stackexchange.com
? Qu'en est-il des domaines de pays commebbc.co.uk
?0894
qui s'additionne102
mais l'explication utilise08+96=106
. Le texte chiffré semble utiliser la102
valeur. Juste une légère incohérence qui pourrait être source de confusion ...defualt
nedefault
Réponses:
PowerShell 3+,
480476474453450448 octetsEssayez-le en ligne!
Enregistré
2426 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:
É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.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.la source
-join
et j'aurais juré qu'il rejoignait des espaces et non des$null
s, 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)!