Wprowadzenie
Dobble / Spot Jest to gra karciana, w której ludzie muszą w krótkim czasie wykryć ten sam symbol na karcie, wskazać ją i przejść do następnej pary. Każda karta ma wiele symboli (8 w normalnej wersji), ale dokładnie jeden jest wspólny dla każdej pary kart.
Przykład z fizycznej kopii gry:
Wyzwanie
Napisz program, który podając zestaw symboli (pojedyncze znaki ascii) i liczbę symboli na pojedynczej karcie wytworzy wyjściowe karty z symbolami dla każdej karty. Istnieje oczywiście wiele równoważnych kombinacji, twój program musi tylko napisać dowolną kombinację, która daje największą liczbę kart dla danego wejścia.
To jest golf golfowy, więc lepiej skróć kod, lepiej.
Byłoby również świetnie, gdyby obliczenia zakończyły się przed śmiercią wszechświata przed upałem w najbardziej skomplikowanym przypadku.
Wejście
Dwa argumenty funkcji / stdin (twój wybór)
Pierwszym z nich jest zbiór symboli, coś w rodzaju „ABCDE” lub [„A”, „B”, „C”, „D”, „E”] - wybór formatu, ciąg znaków, zestaw, lista, strumień lub cokolwiek jest idiomatyczne dla wybranego języka. Znaki będą podane z zestawu [A-Za-z0-9], bez duplikatów (więc maksymalny rozmiar zestawu symboli wejściowych wynosi 62). Nie będą koniecznie uporządkowane w ( więc możesz dostać „yX4i9A” również dla przypadku z 6 symbolami).
Drugim argumentem jest liczba całkowita, wskazująca liczbę symboli na pojedynczej karcie. Będzie to <= rozmiar zestawu symboli.
Wynik
Wydrukuj wiele wierszy oddzielonych znakami nowej linii, z których każdy zawiera symbole pojedynczej karty.
Przykłady
ABC
2
>>>>
AB
BC
AC
Lub
ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF
Lub
ABCDE
4
>>>>
ABCD
Poradnik
- Liczba wyprodukowanych kart nie może być większa niż liczba odrębnych symboli, aw wielu kombinacjach będzie znacznie mniejsza
- Możesz przeczytać trochę matematyki, jeśli potrzebujesz pomocy z matematyczną stroną problemu
To jest moje pierwsze wyzwanie golfowe, więc proszę wybacz możliwe problemy z formatowaniem / stylem - postaram się poprawić błędy, jeśli podasz je w komentarzach.
źródło
('abcdefghijklmnopqrstu', 5)
->['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']
lub inne rozwiązanie robocze na 21 kart. (Zauważ, że jest to rzutowa skończona płaszczyzna rzędu 4).Odpowiedzi:
Python 2 ,
192162 bajtyMam argument, że daje to maksymalny zestaw kart dla każdego scenariusza i obsługuje 3 przypadki testowe.
Wypróbuj online!
Algorytm
Biorąc pod uwagę alfabet
a
i rozmiar kartys
, weź wszystkie kombinacjes
elementówa
i wywołaj goC
, a następnie:C
, nazwij toC0
C0
C
które mają połączenie o wartościC0
nie równej1
C
C
będzie pustyNastępnie wydrukuj zapisane elementy.
Argument
Niektóre niepusty podzbiór
C
jest nasza maksymalna rozwiązanieK
. Ponieważ zawiera co najmniej jeden element i jakieś dwa elementy są nie do odróżnienia, wybrać dowolny elementC0
, odC
być wK
. Dla każdego elementue
w THEK
, cardinalitye
jednościx
oznacza 1x != e
WK
; więc wyeliminuj wszystkie elementy, wC
których zjednoczeniuC0
nie ma kardynalności 1. Z tego samego powodu wybierz nowy dowolny element wC
, dodaj goK
i zmniejszC
. OstatecznieC
jest to pusty zestaw iK
będzie to maksymalne rozwiązanie, ponieważ w żadnym momencie nie wybraliśmy elementu, który można odróżnić od jakiegokolwiek innego elementu.Przypadki testowe
Te przypadki testowe zostały napisane, zanim zdałem sobie sprawę, że drukowanie jest wymagane.
Aktualizacja
R
zmiennąK
zmienną w golfa , dzięki @Leo !źródło
A for A in C if len(set(A)&set(C[0]))==1
) już usuwa wybrane elementy, chyba że s == 1 (w tym przypadku len (set (C [0]) i set (C [0])) wynosiłby 1). Możesz zagrać w golfa od drugiej do ostatniej linii do:C=[A for A in C if len(set(A)&set(C[0]))==1<s]
Haskell,
175156 bajtówMoja pierwsza gra w golfa, daj mi znać, jeśli coś pomieszałem.
Wypróbuj online!
Dziękujemy @Paul Mutser za ulepszenia i -19 bajtów
Orginalna wersja
źródło
Perl 6 ,
8877 bajtówWypróbuj online!
źródło