Le password di Bob


13

introduzione

A Bob piace avere password diverse per ogni sito Web che utilizza. Vuole le password in un formato speciale per poterle ricordare. Aiutalo costruendo un generatore di password che sia il più corto possibile nella lunghezza del codice, perché gli piace tenere le cose brevi proprio come il suo nome.

Sfida

Costruisci Bob un generatore di password che accetta quattro parametri:

  • Indirizzo di dominio, (es: stackexchange.com)
  • Nome di battesimo,
  • cognome,
  • Data e anno di nascita

e genera una stringa che ha subito le seguenti trasformazioni.

Ogni password ha un modello basato sulla lunghezza l del nome di dominio. Se l è primo, il modello è di questo modulo -

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

altrimenti è di questa forma -

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

Il campo simbolo avrà valori basati sul tipo di dominio.

.com -> $$$
.org -> &&&
.net -> %%%
.edu -> +++
.gov -> @@@
.mil -> >>>
impostazione predefinita -> ~~~

Ora vuole anche eseguire un codice caesar sui campi [firstname][domain-name][lastname]. La direzione del turno è giusta se io sono il primo, altrimenti è lasciato. Il valore di spostamento è determinato dal valore di aggiunta della data e dell'anno di nascita.

Dopo il processo sopra, il testo non può essere facilmente ricordato, quindi vuole che il testo cifrato sia pronunciabile. Per fare ciò, vuole sostituire ogni consonante su tre con una vocale in ordine alfabetico (cioè, aeiou).

Infine, vuole eliminare le ricorrenze consecutive delle stesse lettere.

Esempio

Input - stackexchange.com bob williams 0894

Uscita - 08qraicvafyecugjigyoq94 $$$.

Spiegazione :

Il modello di password è [birth-date][domain-name][lastname][birth-year][symbol], poiché la lunghezza del nome di dominio stackexchangeè un numero primo. Il simbolo sarà $$$come il tipo di dominio .com.

Riempiamo questi valori nel modello - 08stackexchangewilliams94$$$. Ora il codice di Cesare deve essere eseguito sui campi [firstname][domain-name][lastname](in questo caso è solo il cognome). La direzione del cambio è corretta perché l è il primo e il valore del cambio è 08+94 = 102.

Quindi, 08stackexchangewilliams94$$$si trasforma in 08qryaicvafylecugjjgykq94$$$. Ora ogni terza consonante consecutiva è sostituita da una vocale - 08qraaicvafyeecugjigyoq94$$$ ogni ocuurenze consecutive della stessa lettera è cancellata - 08qraicvafyecugjigyoq94$$$. Non preoccuparti, è pronunciabile per Bob.

informazioni addizionali

  • L'indirizzo del dominio, il nome e il cognome contengono solo alfabeti minuscoli.
  • L'indirizzo di dominio sarà sempre costituito solo da un dominio di secondo e di livello superiore, simile stackexchange.come non codegolf.stackexchange.com. Inoltre, domini come .co.uknon sono consentiti ma solo .uko .insono validi.
  • La sostituzione della vocale in ordine alfabetico è ciclica. Voglio dire dopo u, aviene utilizzato per sostituire.
  • L'intervallo ASCII per il codice Caesar è compreso tra 97 e 122.
  • Puoi prendere l'input come descritto qui .
  • L'output deve essere una stringa.
  • Il formato della data e dell'anno di nascita è dde yy. Quindi 02è accettabile e 2non lo è.

Questo è code-golf, quindi vince il codice più breve in byte. Buon golf!


4
Il nome di dominio sarà sempre composto solo da un dominio di secondo e di primo livello, come stackexchange.comno img.stackexchange.com? Che dire dei domini di paesi come bbc.co.uk?
Briantist,

La tua chiamata di esempio utilizza ciò 0894che si aggiunge 102ma utilizza la spiegazione 08+96=106. Il testo cifrato sembra utilizzare il 102valore. Solo una leggera incoerenza che potrebbe essere
fonte di

6
Bob è un mofo pazzo se riesce a pronunciarlo.
Magic Octopus Urn

5
@carusocomputing Forse Bob è gallese?
Briantist,

1
No, intendevo dire che defualtnon default
digiti

Risposte:


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'

Provalo online!

Risparmiato 24 26 byte grazie a TimmyD !

Caspita, questa era pazza. Non credo di poter pubblicare una suddivisione completa di questo fino a dopo o domani.

Nota: tutte le terminazioni di riga sono \n( 0x10), quindi non devo usare ;e mettere tutto su una riga.

Veloce panoramica:

  1. Dividi il dominio nel secondo livello e nel livello superiore.
  2. Dividi la data di nascita in mese e anno.
  3. Calcola il valore di spostamento.
  4. Determina se la lunghezza di SLD è primaria. Dal momento che il segmento non può essere più lungo di 63 caratteri ( vedi anche RFC 1035 ), penso che sia stato più breve solo per hardcode l'elenco di numeri primi :) Utilizzando il metodo regex suggerito.
  5. Definire uno scriptblock (essenzialmente una funzione anonima) per eseguire il codice Caesar.
  6. Applicare la cifra a SLD, nome e cognome
  7. Ottieni il simbolo con un business divertente hashtable e indicizzazione.
  8. Infine, un pasticcio gigantesco in cui applico il modello appropriato, eseguo una sostituzione per le terzine di consonanti, sostituendo ognuna con una sottoespressione (codice) che sostituirà quella sezione con il valore appropriato, quindi eseguo la stringa risultante attraverso Invoke-Expression( iex) per eseguire il ha generato il codice emebedded, quindi una sostituzione finale di lettere consecutive con una sola lettera.

@TimmyD caspita non l'ho mai visto prima, ed è geniale. Grazie!
briantist

@TimmyD sai, inizialmente ho provato a scriverlo con unario -joine avrei potuto giurare che si unisse agli spazi e non a $nulls, il che mi ha sorpreso, ma dopo averlo provato di nuovo ha funzionato come mi aspettavo inizialmente. Strano (e grazie ancora)!
briantist
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.