Losowanie riffle jest rodzajem losowania, w którym talia jest podzielona na dwie partycje, a następnie partycje są łączone z powrotem, aby utworzyć nową tasowaną talię.
Karty są łączone ze sobą w taki sposób, że karty zachowują swój względny porządek w obrębie partycji, której są członkami . Na przykład, jeśli karta A znajduje się przed kartą B w talii, a karty A i B znajdują się w tej samej partycji, karta A musi znajdować się przed kartą B w wyniku końcowym, nawet jeśli liczba kart między nimi wzrosła. Jeśli A i B znajdują się w różnych partycjach, mogą być w dowolnej kolejności, niezależnie od kolejności początkowej, w wyniku końcowym.
Każde losowanie karabinów można następnie traktować jako permutację oryginalnej talii kart. Na przykład permutacja
1,2,3 -> 1,3,2
jest losowym tasowaniem. Jeśli tak podzielisz talię
1, 2 | 3
widzimy, że każda karta w 1,3,2
tej samej kolejności względem każdej innej karty na partycji. 2
jest nadal po 1
.
Z drugiej strony poniższa permutacja nie jest przetasowaniem riffla.
1,2,3 -> 3,2,1
Widzimy to, ponieważ dla wszystkich dwóch (nietrywialnych) partycji
1, 2 | 3
1 | 2, 3
istnieje para kart, które nie zachowują względnej kolejności. W pierwszej partycji 1
i 2
zmień ich kolejność, podczas gdy w drugiej partycji 2
i 3
zmień ich kolejność.
Widzimy jednak, że 3, 2, 1
można to zrobić poprzez skomponowanie dwóch przetasowań karabinowych,
1, 3, 2 + 2, 3, 1 = 3, 2, 1
W rzeczywistości dość prostym faktem, który można udowodnić, jest to, że można dokonać dowolnej permutacji, łącząc pewną liczbę permutacji ruffle shuffle.
Zadanie
Twoim zadaniem jest stworzenie programu lub funkcji, która pobiera permutację (o rozmiarze N ) jako dane wejściowe i generuje najmniejszą liczbę permutacji losowych riffle (o rozmiarze N ), które można połączyć w celu utworzenia permutacji wejściowej. Nie trzeba samemu odtwarzać losowego tasowania riffów, ile ich jest.
To jest golf golfowy, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.
Możesz podać 1 lub 0 dla permutacji tożsamości.
Przypadki testowe
1,3,2 -> 1
3,2,1 -> 2
3,1,2,4 -> 1
2,3,4,1 -> 1
4,3,2,1 -> 2
źródło
4,3,2,1
być2
? Najpierw dzielimy się na środku i zyskujemy,3,1,4,2
a następnie ponownieOdpowiedzi:
Python 3 , 255 bajtów
Sprawdza wszystkie możliwe riffy aż do długości listy (wymagana maksymalna liczba), więc jest bardzo wolny dla większych danych wejściowych. Prawdopodobnie można by też trochę zagrać w golfa.
Wypróbuj online!
źródło
Czysty ,
206... 185 bajtówWypróbuj online!
Generuje każdy możliwy wynik
n
czasów przetasowania i sprawdza, czy lista jest członkiem.Chociaż jest to strasznie nieefektywny sposób rozwiązania problemu, ten kod jest szczególnie wolny ze względu na użycie listowego rozumienia zamiast kompozycji, co mocno ogranicza dowolną redukcję grafów elementarnych i skutkuje spektakularną wizytówką śmieciarza Clean.
Nie golfowany:
Wypróbuj online!
źródło