Opis wyzwania
„Wykroczenie” sekwencji jest permutacją, w której żaden element nie pojawia się w pierwotnej pozycji. Na przykład ECABD
jest odstępstwem ABCDE
, ale CBEDA
nie jest:
ABCDE
| | <- B and D are in their orignal positions
CBEDA
Biorąc pod uwagę sekwencję, wygeneruj jej przypadkowe odstępstwo.
Notatki
Możesz wziąć ciąg znaków jako dane wejściowe lub tablicę / listę elementów (liczby całkowite, znaki, obiekty ...)
Zamiast zwracać nowy obiekt, możesz zmodyfikować istniejący, zamieniając jego elementy
Każde odstępstwo powinno mieć jednakowe prawdopodobieństwo wygenerowania
Możesz założyć, że w sekwencji jest więcej niż jeden element i żaden nie pojawia się więcej niż jeden raz
Odpowiedzi:
CJam , 14 bajtów
Wypróbuj online!
Powoduje tasowanie danych wejściowych, aż stanie się zaburzeniem.
Wyjaśnienie
źródło
Galaretka , 6 bajtów
Wypróbuj online!
Wyjaśnienie
Jonathan Allan uratował bajt.
źródło
Ẋ=³S$¿
oszczędza bajt.$
. Dzięki!Python, 85 bajtów
Modyfikuje przekazaną do niej listę (dozwoloną przez meta i w pytaniu).
Wypróbuj online tutaj!
źródło
def D(l):
zl=input()
, a następnie zapisać przestrzenie wcięć w następujących liniach (tak masz program zamiast funkcji). Nie głosowałem jednak!ES6 (JavaScript),
71, 69 bajtówDane wejściowe i wyjściowe są tablicami i powinny działać z dowolnymi typami elementów (ciągi, liczby itp.), O ile można je porównać z „==”.
Grał w golfa
Test
Interaktywny fragment kodu
źródło
Perl 6 , 33 bajtów
Lambda, która pobiera listę liczb całkowitych lub znaków jako dane wejściowe i zwraca nową listę.
Jeśli musi obsługiwać listy dowolnych wartości,
ne
musiałby zostać zastąpiony!eqv
(+2 bajty).( Wypróbuj online. )
Wyjaśnienie:
{ }
: Definiuje lambda..pick(*)
: Generuje losowe losowanie listy danych wejściowych..pick(*) xx *
: Tworzy leniwą, nieskończoną sekwencję takich przetasowań.(* Zne $_).all
: Lambda, która zamyka dwie listy (argument*
i zewnętrzny argument lambda$_
) za pomocąne
operatora (ujemna równość łańcucha), dając listę boolanów, a następnie tworzyall
połączenie, aby zwinąć je do jednego stanu boolowskiego.first PREDICATE, SEQUENCE
: Pobiera pierwszy element z naszej nieskończonej sekwencji permutacji, która spełnia test „wykolejenia”.źródło
Brachylog ,
19181513 bajtówWypróbuj online!
Wyjaśnienie
źródło
Perl 6 , 45 bajtów
Spróbuj
Dane wejściowe to tablica czegokolwiek.
Rozszerzony:
źródło
MATL, 7 bajtów
To jest tłumaczenie mojego postu Octave (i podobne do niektórych innych zgłoszeń tutaj). Wczoraj opublikowałem swój pierwszy post MATL (pęknięcie CNR), więc myślę, że nie jest to optymalne, ale najlepsze, jakie do tej pory mam.
Szczerze mówiąc, nie jestem do końca pewien, czy
t
jest tam potrzebny, ale jest to jedyny sposób, w jaki mogę go uruchomić. Służy do porównywania danych wejściowych użytkownika (pobranych zG
) z losową permutacją. Myślałbym, że mógłbym porównać te dwa bez tego, ale ...?W każdym razie oto:
Wypróbuj online!
źródło
t
tam potrzebuję , czy mogę się go pozbyć? Fajnie było grać w golfa w MATL ... :)t
(lub równoważnie innegoG
) Musisz zostawić coś na stosie do następnej iteracji lub jako wynik końcowyWłaściwie 13 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Oktawa,
5655 bajtówMusimy użyć,
input('')
ponieważ nie jest to funkcja. Ponadto, ponieważ mogę wybrać, aby dane wejściowe były ciągiem, możemy użyć tej sztuczkinnz(x)==numel(x)
.Wyjaśnienie:
Dzięki Luisowi za zauważenie, że wejście może być ciągiem, więc mogłem użyć
nnz
zamiastnumel
zapisywania dwóch bajtów.źródło
MATL, 13 bajtów
To wspólny wysiłek @LuisMendo i mnie. W przeciwieństwie do wielu innych odpowiedzi tutaj, ta jest deterministyczna w tym sensie, że nie próbkuje losowych permutacji, dopóki nie otrzyma wykroczenia, ale generuje wszystkie wykroczenia i wybiera jedną losowo.
Wypróbuj online!
Wyjaśnienie
źródło
Pyth -
109 bajtówPowoduje to tasowanie danych wejściowych, podczas gdy dowolny ze znaków jest równy znakom ze swojego indeksu na wejściu.
Wypróbuj online tutaj .
źródło
Mathematica, 57 bajtów
Nienazwana funkcja przyjmuje listę wielorybników jako dane wejściowe i wyjściowe. Po wygenerowaniu wszystkich permutacji
#
danych wejściowychx
zachowujemy tylko te, dla których zbiór#-x
różnic elementarnych nie zawiera0
; następnie dokonujemy (równomiernie) losowego wyboru z tego zestawu.źródło
#/.x_:>NestWhile[RandomSample[#,Length@#]&,#,Not@FreeQ[#-x,0]&]&
oczywiście szybszy w praktyce dla długich strunPHP, 85 bajtów
Kopiuje argument ciągu do dwóch tablic, tasuje jeden z nich, aż różnica między nimi (także porównanie indeksów elementów) będzie równa drugiej. Uruchom z
-r
.źródło
R, 59 bajtów
Odczytuje listę elementów do STDIN, pobiera długość listy i rozpoczyna zakres próbkowania od 1 do długości, dopóki nie znajdzie takiego, który nie dzieli miejsc z uporządkowaną listą. Następnie drukuje tę listę.
źródło
Cud , 32 bajty
Stosowanie:
Wyjaśnienie
Bardziej czytelny:
Funkcja rekurencyjna
f
. Dokonuje elementarnego porównania międzyf
listą danych wejściowych a tasowaną wersją listy danych wejściowych. Jeśli porównanie daje jakiekolwiek równe wartości, tof
jest wywoływane na liście losowej. W przeciwnym razie po prostu zwracamy listę losową.źródło
Rubinowy, 67 bajtów
źródło
Oktawa,
5453 bajtyWygeneruj wszystkie permutacje
a
i wybierz losowo wiersz, który nie ma wspólnego elementua
.Uwaga: Jest to przypadkowo to samo, co odpowiedź @Lawr MATL!
źródło
Clojure,
949079 bajtów-4 bajty poprzez zmianę warunku wewnątrz redukcji na
and
i wstawianiedone?
.-11 bajtów poprzez konwersję redukcji na
some
.WOOT! Pokonaj PHP.
Metoda siłowa. Tasuje listę, gdy jest niepoprawna. To kończy się głupio szybko, biorąc pod uwagę, że jest to metoda brutalnej siły, która nie robi nic, aby zapobiec podwójnym próbom. Okazało się 1000 dearangments z 1000 elementów długiej listy w mniej niż sekundę.
Nie golfowany:
źródło
Clojure, 56 bajtów
Zauważ, że łańcucha nie można przetasować, należy go przepuścić przez
seq
lubvec
.Początkowo próbowałem,
#(first(remove(fn[s]((set(map = % s))true))(iterate shuffle %)))
alerecur
podejście jest rzeczywiście krótsze niżiterate
.Magia polega na tym, że
(set(map = % s))
zwraca albo zbiór fałszów, zbiór prawdy, albo zbiór prawdy i fałszu. Może to być użyte jako funkcja, jeśli zawiera,true
wówczas odpowiedź brzmitrue
, w przeciwnym razie fałsznil
.=
z przyjemnością przyjmuje dwa argumenty wejściowe, bez potrzeby owijania go czymś.Może istnieje jeszcze krótszy sposób sprawdzenia, czy którakolwiek z wartości jest prawdziwa?
źródło
APL, 11 bajtów.
Z ciągiem we właściwym argumencie:
⍵[⍋(⍴⍵)?⍴⍵]
Wyjaśnienie
ρ⍵
pobiera długość (lub kształt) odpowiedniego argumentu.?
zwraca losową tablicę(⍴⍵)
tych liczb.⍋
zwraca ich kolejność, aby zapewnić brak duplikatów.⍵[..]
reprezentuje losowy asortyment ciągu przy użyciu tego indeksu.źródło
⍵
.