Mam kupę czystych skarpet, które chcę poskładać w pary. Niestety mogę wziąć skarpetki tylko z dowolnego końca stosu, a nie ze środka. Co więcej, mogę jednocześnie usunąć skarpetki ze stosu pasującej pary. Moją strategią jest najpierw podzielić stos na jeden lub więcej mniejszych stosów. Myślę, że niektóre przykłady to wyjaśnią. Przedstawię każdą skarpetę jako dodatnią liczbę całkowitą (pasujące liczby całkowite oznaczają równe skarpetki).
Jeśli początkowy stos skarpet to
1 2 3 3 2 1
wtedy nie muszę robić żadnego podziału. Mogę usunąć obie 1
skarpetki, potem obie 2
skarpety, a następnie obie 3
skarpetki.
Jeśli zamiast tego początkowy stos to
1 2 3 2 3 1
potem muszę go najpierw podzielić, ponieważ nie będę w stanie sparować wszystkich skarpet po prostu usuwając je z końca. Jedną z możliwości jest podzielenie go na dwa stosy
1 2 3 and 2 3 1
Teraz mogę zdjąć 1
skarpetki, odejść 2 3 and 2 3
, następnie 3
skarpetki, odejść 2 and 2
i wreszcie 2
skarpetki.
Twoja praca
Biorąc pod uwagę początkowy stos skarpet, napisz program, który podzieli go na mniejsze stosy, które pozwolą mi posortować skarpetki. Twój program powinien podzielić stos na możliwie najmniejszą liczbę stosów (jeśli istnieje wiele najlepszych rozwiązań, potrzebujesz tylko jednego).
Dane wejściowe zostaną podane w postaci listy, łańcucha rozdzielanego lub innej dogodnej formy. Będzie zawierał tylko liczby całkowite pomiędzy 1
i pewną maksymalną wartość n
, przy czym każda liczba całkowita będzie występować dokładnie dwa razy.
Dane wyjściowe powinny składać się z listy danych wejściowych podzielonej na mniejsze listy, podane w dowolnej dogodnej formie.
Przykłady
Input Sample Output
1 1 1 1
1 2 1 2 1; 2 1 2
1 3 2 4 3 2 1 4 1 3 2; 4 3 2 1 4
1 2 3 4 3 4 1 2 1; 2 3; 4 3 4 1 2
1 1 2 2 3 3 1 1 2; 2 3 3
4 3 4 2 2 1 1 3 4 3 4 2; 2 1 1 3
Zauważ, że nie jest to jedyne dozwolone wyjście dla większości tych danych wejściowych. W drugim przypadku na przykład dane wyjściowe 1 2; 1 2
lub 1 2 1; 2
byłyby również akceptowane.
Dzięki Sp3000 za sugestie dotyczące testów!
Nienawidzę spędzać długiego czasu na sortowaniu ubrań, więc skróć swój kod tak krótko, jak to możliwe. Najkrótsza odpowiedź w bajtach wygrywa!
Notatki
- Nie chcę patrzeć za skarpetę, aby sprawdzić, czy jest tam pasująca para, więc zabranie obu skarpet w parę z tego samego końca nie jest dozwolone. Np. Jeśli stos jest
1 1 2 2
, to nie będziesz mógł zostawić go jako jednego stosu i wziąć obu1
skarpet z lewego końca.
123213
można podzielić na1; 23; 213
(1; 23; 213
->1; 2; 21
->; 2; 2
)?123213
przy użyciu tylko dwóch stosów, twoja odpowiedź musiałaby dać jeden z podziałów na dwa stosy.Odpowiedzi:
Pyth, 25 bajtów
Zestaw testowy
Wyjaśnienie:
źródło
JavaScript (ES6), 329
Nie jest to łatwe zadanie dla języka, który nie ma wbudowanych funkcji kombinatoryki.
Prawdopodobnie nieco bardziej golfowy.
Uwaga: wszystkie partycje mają co najmniej rozmiar 2, ponieważ partycja z jednym elementem jest zawsze mniej przydatna.
Objaśnienie w częściach
(jest to zbyt szczegółowe, ale trudno mi to wyjaśnić - w końcu przejdź do „poskładaj wszystko”)
Funkcja rekurencyjna do wyliczania wszystkich możliwych podziałów tablicy
Teraz potrzebuję partycji o rozmiarze 2 lub większym, więc muszę użyć tej funkcji z nieco innymi parametrami. Parametr v to „rozmiar tablicy - liczba pożądanych partycji - 1”. Następnie muszę zbudować partycje w nieco inny sposób.
Mogę więc wyliczyć listę partycji dla braku podziału, 1 podziału, 2 podziałów i tak dalej. Kiedy znajdę działającą partycję, zatrzymam się i wyprowadzę znaleziony wynik.
Aby to sprawdzić, zeskanuj listę partycji, zanotuj wartości na początku i na końcu każdej z nich, jeśli znalazłeś powtórzoną wartość, usuń ją. Powtarzaj, aż w końcu nic nie będzie można usunąć: jeśli wszystkie pary zostały usunięte, ta partycja jest dobra.
Zatem brakująca część jest po prostu pętlą calującą funkcję G, zwiększającą liczbę partycji. Pętla kończy się po znalezieniu wyniku.
Poskładać wszystko do kupy
Test
źródło