Mam kombinowaną kłódkę, która ma litery zamiast cyfr. Wygląda to tak: http://pictures.picpedia.com/2012/09/Word_Combination_Padlock.jpg Jest 5 rolek, z których każda zawiera 10 różnych liter.
Większość ludzi lubi używać słowa w swojej kombinacji zamiast dowolnego ciągu liter. (Oczywiście mniej bezpieczne, ale łatwiejsze do zapamiętania.) Dlatego przy produkcji zamka dobrze byłoby zbudować go tak, aby zawierał kombinację liter, których można użyć do utworzenia jak największej liczby 5-literowych angielskich słów.
Twoim zadaniem, jeśli zdecydujesz się to zaakceptować, jest znalezienie przypisania liter do rolek, co pozwoli na utworzenie jak największej liczby słów. Na przykład rozwiązaniem może być
ABCDEFGHIJ DEFGHIJKLM ZYXWVUTSR ABCDEFGHIJ ABCDEFGHIJ
(To znaczy, jeśli nie czujesz się zbyt pomysłowy).
Aby zachować spójność, użyj listy słów na stronie http://www.cs.duke.edu/~ola/ap/linuxwords
Każde 5-literowe słowo z tej listy jest poprawne, w tym nazwy własne. Zignoruj Sino- i L'vov oraz wszelkie inne słowa na liście, które zawierają znak inny niż az.
Zwycięski program to ten, który daje największy zestaw słów. W przypadku, gdy wiele programów znajdzie ten sam wynik, pierwszy z opublikowanych wygrywa. Program powinien zostać uruchomiony w mniej niż 5 minut.
Edycja: odkąd aktywność umarła i nie ma lepszych rozwiązań, ogłaszam zwycięzcę Petera Taylora! Dziękujemy wszystkim za pomysłowe rozwiązania.
źródło
Odpowiedzi:
1275 słów przez prostą chciwą wspinaczkę
Kod to C #. Wytworzone rozwiązanie to
Używam tego formatu wyjściowego, ponieważ bardzo łatwo go przetestować:
źródło
Main
metodę, aby wywoływała różne_Main
metody.Python (3), 1273 ≈ 30,5%
To naprawdę naiwne podejście: trzymaj sumę częstotliwości każdej litery w każdej pozycji, a następnie eliminuj „najgorszą” literę, aż pozostałe litery zmieszczą się na rolkach. Dziwi mnie, że wydaje się, że robi to tak dobrze.
Najciekawsze jest to, że mam prawie taką samą moc wyjściową jak rozwiązanie C # 1275, tyle że
N
zamiast tego mam ostatnią rolkęA
. ToA
była moja ostatnia eliminacja, nawet przed wyrzuceniem aV
i aG
.Produkuje:
źródło
Mathematica , 1275 słów w kółko ...
Ten kod nie jest golfowy, ponieważ wydaje się, że nie wymaga tego pytanie.
Liczba słów szybko (mniej niż 10 sekund) ewoluuje do 1275 w większości przebiegów, ale nigdy nie przekracza tego. Próbowałem naruszyć litery więcej niż jeden na raz, próbując wydostać się z teoretycznego maksimum lokalnego, ale to nigdy nie pomogło. Podejrzewam, że 1275 jest limitem dla danej listy słów. Oto kompletny przebieg:
Oto kilka innych „zwycięskich” wyborów:
Jak komentuje Peter, w rzeczywistości są to te same rozwiązania w różnych zamówieniach. Posortowane:
źródło
shortlist
dawna wydaje się długi i chociaż nie jest to Golf, chciałbym coś krótszego. Możesz pomóc?Python, 1210 słów (~ 29%)
Zakładając, że tym razem poprawnie policzyłem słowa, jest to nieco lepsze niż rozwiązanie FakeRainBrigand. Jedyna różnica polega na tym, że dodam kolejno każdą rolkę, a następnie usuwam z listy wszystkie słowa, które nie pasują do rolki, dzięki czemu otrzymuję nieco lepszą dystrybucję dla kolejnych rolek. Z tego powodu daje dokładnie ten sam pierwszy kołowrotek.
Program generuje
źródło
iPython (
273210 bajtów, 1115 słów)1115/4176 * ~ 27%
Obliczałem je w iPython, ale moja historia (dostosowana do usuwania debugowania) wyglądała tak.
Jeśli idziemy krótko; Mógłbym to przyciąć.
Skrócony:
Moje wyniki to:
['sbcapfdtmg', 'aoeirulhnt', 'aironeluts', 'etnlriaosc', 'seyrdtnlah']
.* Moja matematyka na 4176 może być trochę krótka z powodu słów z pominiętymi myślnikami lub apostrofami
źródło
Q
? (todo) słowa
Słowa powinny być przechowywane w pliku o nazwie
words
Działa za około 170 ms na moim i7. Analizuje listę słów, szukając najczęstszego listu na każdej pozycji (oczywiście odfiltrowuje osoby niebędące kandydatami). Jest to leniwe naiwne rozwiązanie, ale daje całkiem dobry wynik przy minimalnym kodzie.
Wyniki:
źródło
Edytować: Teraz, gdy reguły zostały zmodyfikowane, to podejście jest zdyskwalifikowane. Zostawię to tutaj na wypadek, gdyby ktoś był zainteresowany, dopóki w końcu nie zacznę modyfikować go pod kątem nowych zasad.
Python: 277 znaków
Jestem prawie pewien, że uogólniona wersja tego problemu to NP-Hard, a pytanie nie wymagało znalezienia najszybszego rozwiązania, więc oto metoda zrobienia tego z brutalną siłą:
Zauważ, że zmieniłem nazwę pliku listy słów na „w”, aby zapisać kilka znaków.
Dane wyjściowe to liczba możliwych słów z danej konfiguracji, po której następuje sama konfiguracja:
Ostatni wiersz wyjścia przed zakończeniem programu gwarantuje optymalne rozwiązanie.
źródło