Wprowadzenie
Najwyraźniej pytanie zostało tu zadane i niestety zostało zamknięte. Pomyślałem, że warto spróbować ponownie, ale zrobiłem to dobrze.
XKCD patrzy na to, jak jesteśmy szkoleni w używaniu „trudnych do zapamiętania haseł”, myśląc, że jest bezpieczny, ale zamiast tego złamanie komputera zajęłoby 3 dni. Z drugiej strony, zapamiętywanie 4-5 słów podnosi Intropy Kuan i jest łatwe do zapamiętania. Szalony, jak to działa, co?
Wyzwanie
Obecnie zadaniem jest utworzenie 5 haseł za pomocą słów. 4 słowa na hasło i minimum 4 litery na słowo, ale nie maksimum. Intropy hasła Kuan będą musiały zostać obliczone dla każdego hasła, ale wymuszone minimum nie zostanie ustawione.
Co to jest intropy hasła Kuan?
Według Kuan, hasło Intropy Kuana jest miarą nieprzewidywalności hasła. Jest proste obliczenie: E = log 2 (R), * L . E oznacza Intropy hasła Kuan, R oznacza zakres dostępnych znaków, a L długość hasła.
Zakres dostępnych znaków jest oczywisty. Jest to zakres znaków, które może zawierać hasło, w tym przypadku jest to duża i mała litera. Ponieważ w alfabecie jest 26 znaków, 26 x 2 = 52 znaków w całym zakresie hasła.
Długość hasła jest również oczywista. Jest to całkowita długość hasła po utworzeniu.
Ograniczenia
- Brak wejścia.
- Słowo nie może pojawić się ponownie z tym samym hasłem.
- Hasło lub cyfry nie są dozwolone.
- 4 słowa na hasło, ale wymuszone minimum 4 litery na słowo.
- Brak spacji między słowami.
- Nie można wygenerować tego samego hasła w kółko.
- Każde słowo musi być pisane wielkimi literami w haśle.
- Wyjście musi być czytelne dla człowieka, musi być rozstawione. Musi również zawierać hasło Kuan wraz z nim przy użyciu równania hasła Kuan powyżej.
- Słownik . Musisz tego użyć, pobrać go jako plik tekstowy i odpowiednio zintegrować. To będzie lista, z której pobierasz słowa. Twój kod powinien zakładać, że jest dostępny.
- To jest golf golfowy , najkrótsze bajty wygrywają.
Wydajność
TriedScarProgressPopulation 153.9
TryingPastOnesPutting 119.7
YearnGasesDeerGiven 108.3
DoubtFeetSomebodyCreature 142.5
LiquidSureDreamCatch 114.0
N
symbole z zestawuS
, entropia hasła tolog2(|S|)*N
. Tutaj rozmiar zestawu symboli jest rozmiarem słownika (|S|=4284
), a liczba symboli to liczba słów (N=4
), więc entropia dla każdego hasła wynosi48.3
.3t1ta#asd
), entropia będzie logarytmem liczby możliwych haseł. Jeśli zawsze wybierasz losowo 4 słowa równomiernie ze słownika 4284-słowowego, wówczas masz 4284 ^ 4 hasła, każde z logiem entropijnym₂ (4284) * 4 ≈ 48,26.Odpowiedzi:
Python 2,
1021019791 bajtówPrzyjmuje słownik jako listę o nazwie
f
.Można przetestować, zapisując plik jako
dict.txt
i wywołującźródło
exec
(exec
jest słowem kluczowym w języku Python 2).shuffle(f);
.57*len(x)/10.
. Zapisz kolejny bajt, usuwając nawiasy, co powoduje, że wydruk zajmuje krotkę. Oto skrócona wersja: TIOsample(f,4)
zamiastshuffle
. Równieżf
może to byćopen('dict.txt').read().split('\n')
,open('dict.txt').readlines()
albo po prostuopen('dict.txt')
(wiem, to nie grałem, ale nadal).PowerShell (3.0+), 77 bajtów
Wypróbuj online!
Korzystanie Jonathan Allan „s
57*len/10
podstęp.$d
zawiera słownik jako tablicę słów. Jeśli grasz w domu i chcesz wypełnić$d
:Użycie wersji gry w golfa do użycia dużej
(Get-Culture).TextInfo.ToTitleCase()
litery; Nie sądzę, że istnieje krótszy sposób na to w PowerShell.Reszta jest dość prosta.
Łącze TIO ma cały słownik; wyłącz pamięć podręczną i zwariuj!
źródło
$d
zakładając, że jest obecny w środowisku.(gc d)| random..
gdzie słownik jest plikiem o nazwie d w tym samym katalogu.Galaretka , 22 bajty
Monadyczny link zawierający listę znaków, parsowany słownik ( dozwolony na czacie ).
Wypróbuj online! (Kliknij „Argumenty”, aby ukryć słownik i zmniejszyć potrzebę przewijania.)
W jaki sposób?
Ponieważ słownik zawiera tylko prawidłowe słowa (tylko
4
znaki lub więcej[a-z]
), nie ma potrzeby sprawdzania tego warunku.Ponieważ wszystkie słowa w słowniku mają długości w
[4-8]
możliwych długościach hasło są w[16,32]
, i ewentualne entropie nigdy okrągły inaczej do jednego miejsca po przecinku niż zastępująclog(52,2)
z5.7
. Jedynym problemem jest to, że przy użyciu wartość zmiennoprzecinkową z5.7
da zmiennoprzecinkowych zaokrąglania błędów dla długości18
,26
oraz31
. Jednak pomnożenie przez,57
a następnie podzielenie przez10
użycie×57÷⁵
pozwala uniknąć tego (będąc nadal bajtem krótszym niż drukowanie za pomocą pełnej wartości precyzji zmiennoprzecinkowej×52l2¤
).źródło
Rubin,
8983 bajtówZakłada, że hasła są przechowywane w zmiennej
d
. Możesz dodać ten wiersz przed kodem:i wywołać skrypt na przykład w ten sposób:
Przykładowe dane wyjściowe:
KitchenMiseryLurkJoints ... wow.
-6 bajtów z Ajedi32
źródło
shuffle!
i zastąpieniepop
zsample
.A word cannot reappear in the same password
, uważając, że nie oznacza to ponownego użycia słów we wszystkich hasłach. Dzięki :)Mathematica, 178 bajtów
Wypróbuj online
skopiuj i wklej używając Ctrl-V i naciśnij Shift + Enter, aby uruchomić
Mathematica, 136 bajtów
zakładając, że m jest słownikiem, kod jest
.
źródło
hosts
pliku).Bash ,
6665 bajtówWypróbuj online!
Słownik jest odbierany przez STDIN. Najpierw tasuje wszystkie słowa w słowniku i wypisuje 4.
Dla każdego słowa sumuje jego długość w var l i przypomina słowo pisane wielką literą. Na koniec wzywa bc do wykonania matematyki.
Rozwiązanie awk, 112 bajtów, cztery hasła:
źródło
(Jest to adaptacja odpowiedzi Martmistów, ale nie mam przedstawiciela, aby komentować)
Python,
8886 bajtówWykorzystując
set
to, co jest niedeterministyczne, możesz uniknąć importowania bibliotek losowości.źródło
set(f).pop()
.set(f).pop()
to nie działa, próbowałem. Za każdym razem daje ten sam wynik.Japt , 30 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 164 bajty
Zakłada, że słownik jest przekazywany do funkcji jako tablica.
Test Snippet
źródło
Mathematica, 71 bajtów
Zakładając, że słownik jest już załadowany do tablicy o nazwie
d
.Wyjaśnienie:
źródło
ColdFusion 216 bajtów
Działa to w ColdFusion 11+ i Lucee 4.5+
Aby go uruchomić: https://trycf.com/gist/ff14e2b27d66f28ff69ab90365361b12/acf11?theme=monokai
Łącze TryCF ma mniej golfa, ale ten sam kod.
Tak naprawdę nie spodziewałem się, że będę miał konkurencyjną odpowiedź na golfa; Chciałem tylko zobaczyć, co trzeba zrobić, aby ukończyć to wyzwanie w ColdFusion. Zwłaszcza, że w tych odpowiedziach nie ma dużo CF. :-) Po instalacji był zaskakująco krótszy niż się spodziewałem.
Moja pierwsza próba była trochę krótsza, dopóki nie przypomniałem sobie, że tego samego słowa nie można użyć więcej niż raz. Mimo że jest bardzo mało prawdopodobne, aby randomizator wybrał ten sam indeks więcej niż raz, wrzucam indeksy do kluczy struktury, co zapobiegnie duplikacji. Następnie używam tej listy kluczy do zbudowania mojego końcowego ciągu hasła. Użyłem też sztuczki matematycznej, aby znaleźć entropię.
źródło
PHP ,
136129 bajtów-7 bajtów, dzięki Jörg
Wypróbuj online!
źródło
Python 3, 252 bajty
To jest moje pierwsze wyzwanie w golfa, które wykonałem! Wiem, że są tu inne odpowiedzi w języku Python (prawdopodobnie lepsze niż moje), ale wyglądało to zabawnie, więc i tak chciałem spróbować. Oto wersja golfowa:
Chciałbym opublikować Wypróbuj online! link, ale nie obsługuje wielu plików. Oto link do repl.it: https://repl.it/InIl/0
Oto też wersja bez golfisty:
Tak jak powiedziałem, to mój pierwszy raz gofling kodu, więc jestem pewien, że można to znacznie poprawić.
źródło
tcl, 137
Na pewno nie zwycięzca, ale myślę, że może być trochę bardziej golfa.
demo - celem pierwszego wiersza jest tylko wstawienie zawartości słownika do zmiennej
d
źródło
Vim, 87 naciśnięć klawiszy
Zakłada, że słownik znajduje się w pliku o nazwie
w
. Zawsze będzie używać 4 kolejnych słówObjaśnienie:
źródło
q / kdb +,
76746556 bajtówRozwiązanie:
Przykład:
Wyjaśnienie:
Przeczytaj listę słów, rozdziel „”, wybierz 4 losowe słowa z tej listy, pierwszą literę każdego słowa, a następnie połącz ze sobą. Wprowadź to do funkcji lambda, która zwraca hasło i obliczoną „entropię”:
Uwagi:
Wpadłem i użyłem 5.70044 zamiast
2 xlog 52 xexp
...źródło