Wczoraj zadałem to pytanie na temat przetasowań riffle. Wydaje się, że wczorajsze pytanie było nieco zbyt trudne, więc jest to powiązane, ale o wiele łatwiejsze zadanie.
Dzisiaj jesteś proszony o ustalenie, czy permutacja jest tak naprawdę przetasowaniem riffle. Nasza definicja losowego przetasowania jest dostosowana do naszego ostatniego pytania:
Pierwszą częścią losowania jest podział. W partycji podziel talię kart na dwie części. Te dwa podrozdziały muszą być ciągłe, wzajemnie się wykluczające i wyczerpujące. W prawdziwym świecie chcesz, aby twoja partycja była jak najbliższa, jak to możliwe, jednak w tym wyzwaniu nie jest to rozważane, wszystkie partycje, w tym te, które są zdegenerowane (jedna partycja jest pusta), są jednakowo ważne.
Po ich podzieleniu karty są łączone w taki sposób, że karty zachowują względną kolejność w obrębie podziału, którego 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ść.
Zadanie
Biorąc pod uwagę permutację dowolną rozsądną metodą, ustal, czy reprezentuje ona prawidłowe losowanie karabinu. Powinieneś wypisać dwie różne stałe wartości: jedną dla „Tak, to jest losowe odtwarzanie riffla”, a drugą dla „Nie, to nie jest losowe odtwarzanie losowe”.
To jest golf golfowy, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.
Przypadki testowe
1,3,2 -> True
3,2,1 -> False
3,1,2,4 -> True
2,3,4,1 -> True
4,3,2,1 -> False
1,2,3,4,5 -> True
1,2,5,4,3 -> False
5,1,4,2,3 -> False
3,1,4,2,5 -> True
2,3,6,1,4,5 -> False
źródło
0
dla falsy, ale jakakolwiek liczba całkowita[1, +∞)
dla prawdy?[3,1,4,2,5]
.[2,3,6,1,4,5]
.[0, ..., n-1]
zamiast zamiast danych[1, ..., n]
wejściowych?Odpowiedzi:
JavaScript (ES6), 47 bajtów
Pobiera dane wejściowe jako tablicę liczb całkowitych. Zwraca wartość logiczną.
Przypadki testowe
Pokaż fragment kodu
W jaki sposób?
Tablica wejściowa A jest poprawnym tasowaniem riffla, jeśli składa się z co najwyżej dwóch odrębnych sekwencji z przeplotem kolejnych liczb całkowitych.
Zasady wyzwanie określić, że mamy otrzymać permutacji z [1 ... n] . Nie musimy więc dodatkowo sprawdzać, czy posortowane połączenie tych sekwencji faktycznie prowadzi do takiego zakresu.
Używamy licznika x zainicjowanego na A [0] i licznika y początkowo niezdefiniowanego.
Dla każdego wpisu z w A , zaczynając od drugiego:
źródło
Haskell , 41 bajtów
Wypróbuj online!
Sprawdza, czy lista skonkatenowana z samym sobą zawiera liczby
0..n-1
w kolejności jako podsekwencja.źródło
Haskell , 43 bajty
s
pobiera listę liczb całkowitych jak w przykładach OP i zwraca aBool
.Wypróbuj online!
Jak to działa
x
zp
kolei i sprawdza, czy może to być pierwszy element z drugim rozbiorze shuffle. Następnieor
zwraca,True
jeśli którykolwiek z czeków byłTrue
.filter
)p
na elementy mniejsze i większe niż (lub równe)x
, łącząc i sprawdzając, czy powstała lista[1..length p]
, tj. Elementy w kolejności.[1..length p]
wykonywana, poprzez sprawdzenie, czy wynik jest ściśle mniejszy niż lista nieskończona[1..] == [1,2,3,etc.]
, co daje taki sam wynik dla dowolnej permutacji.źródło
Galaretka ,
136 bajtówWypróbuj online!
Wersja alternatywna, wyzwanie postdate, 5 bajtów
Wypróbuj online!
Jak to działa
źródło
Python 2 , 39 bajtów
Wypróbuj online!
Pobiera indeksowaną listę 0 i generuje kod wyjścia.
źródło
Brachylog , 9 bajtów
Wypróbuj online!
Predykat kończy się powodzeniem, jeśli dane wejściowe reprezentują odtwarzanie losowe riffle, a jeśli nie, oznacza to, że między innymi, jeśli predykat zostanie uruchomiony jako cały program, wydrukowany zostanie sukces
true.
i błąd zostanie wydrukowanyfalse.
. Dane wejściowe są traktowane jako lista wszelkiego rodzaju elementów i interpretuje je jako reprezentację permutacji posortowanej przez siebie.Czuję, że coś w duchu
⊆ᵐ
powinno działać zamiast czterobajtowej konstrukcji „kanapkowej”⟨⊆⊇⟩
.źródło
Python 2 ,
756047 bajtówdzięki Dennisowi za -13 bajtów
Wypróbuj online!
Wyjście odbywa się za pomocą kodu wyjścia.
źródło
Rubinowy , 35 bajtów
Wypróbuj online!
W jaki sposób?
l & [*1..a] | l
stosuje przecięcie, a następnie połączenie: najpierw uzyskaj elementy,l
które są,<=a
a następnie dodaj pozostałe elementyl
bez zmiany kolejności. Jeśli a jest liczbą, której szukamy, to ta operacja jest taka sama jak sortowaniel
.źródło
Czysty ,
5655 bajtówWypróbuj online!
źródło
Pyth, 5 bajtów
Zestaw testowy
Sprawdza, czy lista podwójnych danych wejściowych zawiera posortowaną wersję siebie jako podsekwencji.
Dzięki Erikowi Outgolfer na 1 bajt, który lepiej wykorzystuje niejawne dane wejściowe
+QQ
zamiast zamiast*2Q
.źródło
}SQy+
. Zostaje rozszerzony do}SQy+QQ
.Pyth , 9 bajtów
Zestaw testowy.
Zaoszczędzono 3 bajty dzięki isaacg .
Pyth , 14 bajtów
Wypróbuj tutaj! lub Zweryfikuj wszystkie przypadki testowe.
Wyjścia
True
iFalse
odpowiednio losowe odtwarzanie losowe i losowe.W jaki sposób?
źródło
<#0
może zostać zastąpiony przez-
2 kolejne bajty.Łuska , 7 bajtów
Zestaw testowy!
źródło
Perl, 28 bajtów
Obejmuje
+1
dlaa
Wejście na STDIN, 1 oparte
Wykorzystuje algorytm xnor
źródło
C (gcc) , 61 bajtów
Wypróbuj online!
źródło