Bobs Passwörter

13

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 stackexchangeeine 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.comund nicht codegolf.stackexchange.com. Auch Domains wie .co.ukist nicht erlaubt, aber nur .ukoder .inist gültig.
  • Das Ersetzen des Vokals in alphabetischer Reihenfolge erfolgt zyklisch. Ich meine nach u, awird 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 ddund yy-jahr 02ist und. So ist akzeptabel und 2nicht.

Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes. Viel Spaß beim Golfen!

Gurupad Mamadapur
quelle
4
Wird Domain - Name nur aus einer Second-Level und Top-Level - Domain besteht immer, wie stackexchange.com, nicht img.stackexchange.com? Was ist mit Länderdomains bbc.co.uk?
Briantist
Ihr Beispielaufruf verwendet, 0894was sich summiert, 102aber die Erklärung verwendet 08+96=106. Der verschlüsselte Text scheint den 102Wert zu verwenden. Nur eine leichte Inkonsistenz, die verwirrend sein könnte ...
Briantist
6
Bob ist ein verrückter Mofo, wenn er das aussprechen kann.
Magic Octopus Urn
5
@carusocomputing Vielleicht ist Bob Waliser?
Briantist
1
Nein ich meinte du tippst defualtnichtdefault
Roman Gräf

Antworten:

7

PowerShell 3+, 480 476 474 453 450 448 Byte

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'

Probieren Sie es online!

Gespeichert 24 26 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:

  1. Teilen Sie die Domain in die zweite und oberste Ebene auf.
  2. Teilen Sie das Geburtsdatum in Monat und Jahr auf.
  3. Berechnen Sie den Verschiebungswert.
  4. Bestimmen Sie, ob die Länge des SLD Primzahl ist. 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.
  5. Definieren Sie einen Scriptblock (im Wesentlichen anonyme Funktion), um die Caesar-Verschlüsselung durchzuführen.
  6. Wenden Sie die Chiffre auf das SLD sowie den Vor- und Nachnamen an
  7. Holen Sie sich das Symbol mit einer Hash-Tabelle und Indexierung lustiges Geschäft.
  8. Schließlich ein riesiges Durcheinander, in dem ich die entsprechende Vorlage anwende, ein Ersetzen für die Konsonantentriolen durchführe, wobei jedes durch einen Unterausdruck (Code) ersetzt wird, der diesen Abschnitt durch den entsprechenden Wert ersetzt, und dann die resultierende Zeichenfolge durch Invoke-Expression( iex) ausführt generiert eingebetteten Code, dann ein endgültiges Ersetzen aufeinanderfolgender Buchstaben durch einen einzelnen Buchstaben.
Briantist
quelle
@TimmyD Wow, ich habe das noch nie gesehen und es ist brillant. Vielen Dank!
Briantist
@TimmyD Sie wissen, ich habe ursprünglich versucht, es mit unary zu schreiben, -joinund ich hätte schwören können, dass es sich mit Leerzeichen und nicht mit $nulls 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)!
Briantist