Einführung
Bob möchte für jede Website, die er verwendet, unterschiedliche Passwörter haben. Er möchte Passwörter in einem speziellen Format, damit er sich erinnern kann. Helfen Sie ihm, indem Sie einen Kennwortgenerator erstellen, dessen Codelänge so kurz wie möglich ist, weil er es mag, Dinge so kurz wie seinen Namen zu halten.
Herausforderung
Bauen Sie Bob einen Passwortgenerator auf, der vier Parameter enthält -
- Domain-Adresse (z. B .: stackexchange.com)
- Vorname,
- Familienname, Nachname,
- Geburtsdatum und Jahr.
und gibt einen String aus, der die folgenden Transformationen durchlaufen hat.
Jedes Passwort hat eine Vorlage basierend auf der Länge l des Domain - Namen. Wenn l Primzahl ist, hat die Vorlage die folgende Form:
[birth-date][domain-name][lastname][birth-year][symbol]
sonst ist es von dieser Form -
[symbol][birth-year][firstname][domain-name][birth-date]
.
Das Symbolfeld enthält Werte, die auf dem Domänentyp basieren.
.com -> $$$ .org -> &&& .net -> %%% .edu -> +++ .gov -> @@@ .mil -> >>> Standard -> ~~~
Jetzt will er auch eine Cäsar-Chiffre über Felder ziehen - [firstname][domain-name][lastname]
Die Verschiebungsrichtung ist richtig, wenn ich Primzahl bin, sonst ist sie übrig. Der Schichtwert wird durch den Wert der Addition von Geburtsdatum und Jahr bestimmt.
Nach dem obigen Vorgang kann sich der Text nicht mehr leicht merken, sodass er möchte, dass der verschlüsselte Text ausgesprochen werden kann. Dazu möchte er jeden dritten Konsonanten in alphabetischer Reihenfolge durch einen Vokal ersetzen aeiou
.
Schließlich möchte er aufeinanderfolgende Vorkommen gleicher Buchstaben löschen.
Beispiel
Input - stackexchange.com Bob Williams 0894 Ausgabe - 08qraicvafyecugjigyoq94 $$$.
Erklärung:
Passwortvorlage ist [birth-date][domain-name][lastname][birth-year][symbol]
, weil die Länge des Domainnamens stackexchange
eine Primzahl ist. Symbol wird $$$
als Domain - Typ ist .com
.
Füllen wir diese Werte in die Vorlage - 08stackexchangewilliams94$$$
. Jetzt muss die Caesar-Chiffre auf Feldern ausgeführt werden [firstname][domain-name][lastname]
(in diesem Fall ist es nur der Nachname). Die Schaltrichtung ist richtig, da l die Primzahl und der Schaltwert ist 08+94 = 102
.
Also 08stackexchangewilliams94$$$
verwandelt sich in 08qryaicvafylecugjjgykq94$$$
. Jetzt wird jeder dritte aufeinanderfolgende Konsonant durch einen Vokal ersetzt - 08qraaicvafyeecugjigyoq94$$$
alle aufeinanderfolgenden Vorkommnisse desselben Buchstabens werden gelöscht - 08qraicvafyecugjigyoq94$$$
. Keine Sorge, es ist für Bob aussprechbar.
zusätzliche Information
- Domain-Adresse, Vorname und Nachname enthalten nur Kleinbuchstaben.
- Domain - Adresse wird immer besteht nur aus einer zweiten Ebene und Top-Level - Domain, wie
stackexchange.com
und nichtcodegolf.stackexchange.com
. Auch Domains wie.co.uk
ist nicht erlaubt, aber nur.uk
oder.in
ist gültig. - Das Ersetzen des Vokals in alphabetischer Reihenfolge erfolgt zyklisch. Ich meine nach
u
,a
wird verwendet, um zu ersetzen. - Der ASCII-Bereich für die Caesar-Chiffre liegt zwischen 97 und 122 (einschließlich).
- Sie können Eingaben wie hier beschrieben vornehmen .
- Die Ausgabe muss eine Zeichenfolge sein.
- Das Format von Geburtsdatum
dd
undyy
-jahr02
ist und. So ist akzeptabel und2
nicht.
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes. Viel Spaß beim Golfen!
stackexchange.com
, nichtimg.stackexchange.com
? Was ist mit Länderdomainsbbc.co.uk
?0894
was sich summiert,102
aber die Erklärung verwendet08+96=106
. Der verschlüsselte Text scheint den102
Wert zu verwenden. Nur eine leichte Inkonsistenz, die verwirrend sein könnte ...defualt
nichtdefault
Antworten:
PowerShell 3+,
480476474453450448 ByteProbieren Sie es online!
Gespeichert
2426 Bytes dank TimmyD !Wow, das war verrückt. Ich glaube nicht, dass ich eine vollständige Aufschlüsselung davon bis später oder morgen posten kann.
Hinweis: Alle Zeilenenden sind
\n
(0x10
), so dass ich nicht;
alles in einer Zeile verwenden und platzieren muss.Schneller Überblick:
Da das Segment nicht länger als 63 Zeichen sein kann ( siehe auch RFC 1035 ), war es meiner Meinung nach kürzer, nur die Liste der Primzahlen fest zu codieren :)Verwenden Sie die vorgeschlagene Regex-Methode.Invoke-Expression
(iex
) ausführt generiert eingebetteten Code, dann ein endgültiges Ersetzen aufeinanderfolgender Buchstaben durch einen einzelnen Buchstaben.quelle
-join
und ich hätte schwören können, dass es sich mit Leerzeichen und nicht mit$null
s verbindet, was mich überraschte, aber nachdem ich es einfach noch einmal versucht hatte, funktionierte es wie ich es ursprünglich erwartet hatte. Seltsam (und nochmals danke)!