Jeśli masz kopię Pythona 3 leżącą w pobliżu, możesz to zrobić w mgnieniu oka.
Po pierwsze, przepisz hasła w tablicy takiej jak ta. (Nie wpisuj znaków >>>
).
>>> hasła = ["kryjówka", "przepływ", "koc", "handel", "zakaz "," odejście "," studia "," szermierka "," bitwy "," komora "," imprezy "," przewoźnik "," płonący "," różny "," pracujący "," bicie "," wzmianka ", "chcąc"]
Możemy sprawdzić poczytalność i upewnić się, że wszystkie hasła są takie same:
Lista >>> (mapa (len, hasła) ) [7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7]
Teraz musimy sprawdzić, ile liter jest takich samych między dowolnymi dwoma hasłami. Jest to jedna linijka:
>>> def distance (a, b): return sum (1 for al, bl in zip (a, b) if al == bl) if a! = b else -1
Jeśli hasła są faktycznie takie same, zwracamy -1 zamiast 7, więc możemy zignorować te przypadki.
Teraz potrzebujemy tylko kodu wybierz hasła, które mają tyle pasujących znaków, ile mówi nam gra. To kolejna jedna linijka. Dajesz mu listę haseł, które wypróbowałeś i nie zadziałało oraz ile znaków było poprawnych.
>>> def refine (kandydaci, błędne_pw, dopasowania): result = list (x dla x w kandydatach, jeśli odległość (x, błędne_pw) == pasuje) zwraca wynik
Więc powiedzmy, że hasło „płynie” i uzyskałeś 1 znak. Auć. Następnie użyj tego, co zdefiniowaliśmy w ten sposób:
>>> passwords = refine (passwords, "flowing", 1); hasła ['ogólne', 'studia', 'strony', 'przewoźnik', 'wzmianka']
OK, a co powiesz na "studia" ... nie, 3 prawidłowe litery. / p>
>>> passwords = refine (hasła, "badania", 3); passwords ['party']
O, spójrz, to musi być hasło!
Jak więc możemy zautomatyzować wybór haseł z puli? To, co możemy zrobić, to przyjrzeć się każdej opcji i zobaczyć, w najgorszym przypadku, ile haseł pozostawia nam. Następnie możemy wybrać tę z najmniejszą liczbą pozostałych opcji w najgorszym przypadku. To hasło jest tym, które zapewnia najlepszą gwarancję zmniejszenia pola.
Ten kod sprawdza każde hasło z każdym innym hasłem z każdym innym hasłem, aby znaleźć najlepszego kandydata.
def get_next_guess (hasła): oceny = {} dla kandydata w hasłach: wyniki = [] reszta = (x dla x w hasłach, jeśli x! = kandydat) for correct_pw w pozostałej części: no_alternatives = len ( doprecyzuj (reszta, kandydat, odległość (kandydat, poprawne_pw))) wyniki.append (no_alternatives) wyniki [kandydat] = maks (wyniki) zwróć min (oceny, klucz = lambda x: oceny [x])
To odgaduje „imprezy” natychmiast na moim komputerze, co jest trochę szczęśliwe, ponieważ „bicie” byłoby równie dobrym przypuszczeniem. Zamiast tego spójrzmy na to na zrzucie ekranu, gdzie prawidłowe hasło brzmiało „OCZEKIWANIE”.
>>> passwords = ["wyczyść", "zgrupowane", "zdobywanie", "marnowanie", " prochowiec ”,„ pozwalający ”,„ zakończenia ”,„ płodny ”,„ szukający ”,„ pewni ”,„ bandyci ”,„ stwierdzający ”,„ chcący ”,„ imprezy ”,„ czekanie ”,„ stacja ”,„ maltaza ” , "monster"] >>> get_next_guess (hasła) 'wanting'>>> #incorrect, 6/7 poprawna>>>, passwords = wanting (passwords); hasła [„marnowanie”, „oczekiwanie”]
Gdy pozostały dwa hasła, get_next_guess
staje się w zasadzie rzutem kostką. Po prostu wypróbuj pierwszą, a potem drugą, a skończysz w trzech próbach, bez ponownego uruchamiania.
(Poza tym zabawa. Wiesz, link udostępniony przez Colina D z listą 12-znakowe hasła? Tamtejszy autor wybrał APPRECIATION
. To właściwie najlepsze przypuszczenie! W takim przypadku pozostawia Ci nie więcej niż dwie alternatywy, niezależnie od tego, jakie jest prawidłowe hasło faktycznie jest.)