Załóżmy, że masz listę słów i chcesz używać literówek do literowania każdego słowa. Na przykład, aby przeliterować kota , użyłbyś trzech kart oznaczonych C, A, T.
Zakładając, że każda karta jest dwustronna , prześlij program określający minimalną liczbę kart, których można użyć do przeliterowania całej listy słów.
Input to lista słów, może być oparta na plikach, zakodowana na stałe, w wierszu poleceń, cokolwiek. Dane wyjściowe to lista kart sformatowanych i uporządkowanych według własnego uznania, pod warunkiem, że jest jasne, w jaki sposób karty są oznaczone.
Przypadek nie ma znaczenia: Golf, golf i GOLF są równoważne.
Kilka wskazówek:
- liczba kart nie może być mniejsza niż długość najdłuższego słowa
- nie ma sensu, aby karta miała tę samą literę po obu stronach
- chociaż wielkość liter nie jest znacząca, zalecamy użycie małych liter, aby skorzystać z niektórych symetrii
Przykłady wykorzystują pewne symetrie :
Dane wejściowe: ben, torfowisko, pluskwa, legowisko, robić, łania, pies, należny, wykopany, Ed, koniec, gob, Bóg, Ned, oda, długopis, Poe, mops
Wyjście: b / d, e / g, o / n
Wkład: i, i, ape, są, bed, bud, bur, Dan, Deb, dub, ucho, Ed, era, drzemka, patelnia, groszek, pub, Rae, pobiegł, pocierać
Wyjście: a / b, d / r, e / n
Sprawiając, że jest to konkurs popularności, więc elegancja kodu, wydajność w czasie wykonywania i spryt (w tym naginanie reguł i luki) są ważne!
Dodanie : Niektórzy pytali o „dozwolone” symetrie, czy można użyć specjalnych czcionek i czy karty można złożyć.
Dozwolonymi symetriami są dowolne litery, które wyglądają podobnie po obrocie o 0, 90, 180 lub 270 stopni. Obejmuje to b / q, d / p i n / u. Powiedziałbym również M / W, Z / N i oczywiście I / l (duże i, małe litery L). Prawdopodobnie drapię powierzchnię, więc jeśli są jeszcze jakieś wątpliwości, po prostu zapytaj.
Aby to uprościć, ogranicz się do standardowej czcionki bezszeryfowej, powiedzmy używanej w SE.
Jeśli chodzi o spasowanie, podczas gdy możesz dokonać niesamowitych podstawień, np. B może być D, E, F, I, P lub R, a może C lub L, jeśli spasujesz naprawdę kreatywnie, myślę, że to zginanie, dosłownie za dużo !
Z tym problemem wpadłem, grając z moimi podobnymi kartami. Zauważyłem, jak łatwo było wymyślić karty jednostronne, a jak trudno było wymyślić karty dwustronne.
Dodatek : Podaj nagrodę za najpopularniejszą odpowiedź. W przypadku remisu przyzna ten, który złożył jako pierwszy.
Kolejna wskazówka:
- rozwiązanie problemu jednostronnego da ci wyobrażenie o minimalnej liczbie potrzebnych kart (np. 20 kart jednostronnych przekłada się na co najmniej 10 potrzebnych kart dwustronnych)
Dodatek : Och, przeszkadza, byłem zajęty i zapomniałem o wygranej nagrody. Skończyło się to na nikim, ponieważ jedyna odpowiedź została złożona przed rozpoczęciem nagrody! Przepraszam za to.
n/u
,d/p
? Co zb/q
im/w
? A co jeśli złożęP
kartę na pół, aby górna połowa stała sięD
?Odpowiedzi:
C # - CardChooser
streszczenie
Ta aplikacja używa metody brutalnej siły, aby spróbować rozwiązać każdą listę. Najpierw tworzę listę potencjalnych kart do wyboru, a następnie określam, które najlepiej pasuje (usuwa najwięcej znaków i skraca najbardziej długie słowa), dodaję to do listy wyników i kontynuuję ten proces, dopóki nie wybiorę wystarczającej liczby potencjalnych kart aby usunąć każde słowo z listy, następnie przerzucam te karty do każdego słowa i drukuję wynik.
Jeśli chcesz zobaczyć bardziej ograniczoną wersję tego kodu bez pobierania i budowania dostarczonej aplikacji formularzy systemu Windows, możesz użyć linku podanego w celu uruchomienia mojego programu na mniejszych zestawach danych, pamiętaj, że jest to wersja aplikacji konsoli, więc wynikowe karty NIE są obracane: http://ideone.com/fork/VD1gJF
Historia zmian
Aktualny - Dodano lepszą optymalizację wyników sugerowaną przez @Zgarb
Aktualizacja 3 - Więcej czyszczenia kodu, więcej błędów naprawionych, lepsze wyniki
Aktualizacja 2 - formularze Windows, więcej pełnych danych wyjściowych
Aktualizacja 1 - Nowa / lepsza obsługa symetrii postaci
Oryginał - aplikacja na konsolę
Przykłady
acr, rufowy, ain, sll, wygrać, powiedzieć, powiedział, szybki, epicki
hes, will, with, wont, will, willve, willnt, yet, you, youd, youll
aaaa, bbbb, cccc
Kod
Nadal muszę połączyć to w jeden większy projekt z kodami ConsoleApp i WindowsForms, które współużytkują te same klasy i metody, a następnie rozdzielić różne regiony w metodzie RunButton_Click, aby móc pisać jednostki wokół nich, w każdym razie, kiedy znajdę czas, aby to zrobić. Będę, bo teraz mam to:
źródło
i
karty?said
ostatni list nie jest W ani p