Hasła Boba

13

Wprowadzenie

Bob lubi mieć różne hasła dla każdej strony internetowej, z której korzysta. Chce hasła w specjalnym formacie, aby mógł zapamiętać. Pomóż mu, budując generator haseł, który ma możliwie najkrótszą długość kodu, ponieważ lubi skróty tak jak jego imię.

Wyzwanie

Zbuduj Bob generator haseł, który przyjmuje cztery parametry -

  • Adres domeny, (np .: stackexchange.com)
  • Imię,
  • nazwisko,
  • Data i rok urodzenia.

i wyprowadza ciąg, który przeszedł następujące transformacje.

Każde hasło ma szablon oparty na długości l nazwy domeny. Jeśli l jest liczbą pierwszą, szablon ma następującą postać -

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

inaczej jest w tej formie -

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

Pole symbolu będzie miało wartości oparte na typie domeny.

.pl -> $$$
.org -> &&&
.net -> %%%
.edu -> +++
.gov -> @@@
.mil -> >>>
domyślnie -> ~~~

Teraz chce także poprowadzić szyfr cezarowy nad polami. - [firstname][domain-name][lastname]Kierunek przesunięcia jest właściwy, jeśli l jest liczbą pierwszą, to jest lewą. Wartość przesunięcia zależy od wartości dodanej daty urodzenia i roku.

Po powyższym procesie tekst nie może być łatwo zapamiętany, dlatego chce, aby zaszyfrowany tekst był wymawiany. W tym celu chce zastąpić co trzecią z kolei spółgłoskę samogłoską w kolejności alfabetycznej (tj aeiou.).

Wreszcie chce usunąć kolejne wystąpienia tych samych liter.

Przykład

Wejście - Stackexchange.com Bob Williams 0894

Wyjście - 08qraicvafyecugjigyoq94 $$$.

Objaśnienie:

Szablon hasła to [birth-date][domain-name][lastname][birth-year][symbol], ponieważ długość nazwy domeny stackexchangejest liczbą pierwszą. Symbol będzie taki, $$$jaki jest typ domeny .com.

Wypełnijmy te wartości w szablonie - 08stackexchangewilliams94$$$. Teraz szyfr Cezara musi być uruchamiany na polach [firstname][domain-name][lastname](w tym przypadku jest to tylko nazwisko). Kierunek zmiany jest właściwy, ponieważ l jest liczbą pierwszą, a wartość przesunięcia wynosi 08+94 = 102.

A więc 08stackexchangewilliams94$$$zamienia się w 08qryaicvafylecugjjgykq94$$$. Teraz co trzecia z kolei spółgłoska jest zastępowana samogłoską - 08qraaicvafyeecugjigyoq94$$$ usuwane są wszystkie kolejne litery tej samej litery - 08qraicvafyecugjigyoq94$$$. Nie martw się, to wymawia Bob.

dodatkowe informacje

  • Adres domeny, imię i nazwisko zawierają tylko małe litery.
  • Adres domeny zawsze będzie składał się tylko z domeny drugiego poziomu i najwyższego poziomu, podobnie jak stackexchange.comi nie codegolf.stackexchange.com. Domeny takie jak .co.uknie są dozwolone, ale są prawidłowe .uklub .inprawidłowe.
  • Wymiana samogłoski w kolejności alfabetycznej odbywa się cyklicznie. Mam na myśli po u, asłuży do zastąpienia.
  • Zakres ASCII dla szyfru Cezara wynosi 97 - 122 włącznie.
  • Możesz pobrać dane zgodnie z opisem tutaj .
  • Dane wyjściowe muszą być ciągiem.
  • Format daty i roku urodzenia to ddi yy.Więc 02jest akceptowalny i 2nie jest.

To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach. Wesołego golfa!

Gurupad Mamadapur
źródło
4
Będzie nazwę domeny zawsze składać się tylko z drugiego poziomu i domeny najwyższego poziomu, jak stackexchange.comnie img.stackexchange.com? Co z domenami krajowymi bbc.co.uk?
briantist
Twoje przykładowe wywołanie wykorzystuje, ale 0894składa się 102z wyjaśnień 08+96=106. Zaszyfrowany tekst wydaje się używać 102wartości. Po prostu niewielka niespójność, która może być myląca ...
briantistka
6
Bob jest szalonym mofo, jeśli potrafi to wymówić.
Magic Octopus Urn
5
@carusocomputing Może Bob jest walijski?
briantist
1
Nie, miałem na myśli, że defualtnie default
piszesz

Odpowiedzi:

7

PowerShell 3+, 480 476 474 453 450 448 bajtów

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'

Wypróbuj online!

Zaoszczędź 24 26 bajtów dzięki TimmyD !

Wow, to było szalone. Nie sądzę, żebym mógł opublikować pełny opis tego problemu do czasu późniejszego lub jutrzejszego.

Uwaga: wszystkie zakończenia linii to \n( 0x10), więc nie muszę używać ;i umieszczać tego wszystkiego w jednym wierszu.

Szybki przegląd:

  1. Podziel domenę na drugi poziom i najwyższy poziom.
  2. Podziel datę urodzin na miesiąc i rok.
  3. Oblicz wartość przesunięcia.
  4. Ustal, czy długość SLD jest liczbą pierwszą. Ponieważ segment nie może być dłuższy niż 63 znaki ( patrz także RFC 1035 ), myślę, że krótsze było tylko zakodowanie listy liczb pierwszych :) Przy użyciu sugerowanej metody regex.
  5. Zdefiniuj blok skryptu (zasadniczo anonimowa funkcja), aby wykonać szyfr Cezara.
  6. Zastosuj szyfr do SLD, imienia i nazwiska
  7. Zdobądź symbol z hashtable i indeksowania śmieszne firmy.
  8. Wreszcie gigantyczny bałagan, w którym stosuję odpowiedni szablon, uruchamiam zamiennik dla trypletów spółgłoskowych, zastępując każdy z podwyrażeniem (kodem), który zastąpi tę sekcję odpowiednią wartością, a następnie uruchom wynikowy ciąg poprzez Invoke-Expression( iex), aby wykonać wygenerował kod emibedded, a następnie końcowe zastąpienie kolejnych liter jedną literą.
briantist
źródło
@ TimmyD wow, nigdy wcześniej tego nie widziałem i jest genialny. Dzięki!
briantist
@TimmyD wiesz, pierwotnie próbowałem napisać to z jednostką -joini mogłem przysiąc, że łączy się ze spacjami, a nie $nulls, co mnie zaskoczyło, ale po prostu spróbowałem ponownie, zadziałało tak, jak pierwotnie oczekiwałem. Dziwne (i jeszcze raz dzięki)!
briantist