tło
Parzystości permutacji , jak określono Wikipedia , jest następujący:
Znak lub podpis permutacji σ jest oznaczony sgn (σ) i zdefiniowany jako +1, jeśli σ jest parzyste, a -1, jeśli σ jest nieparzyste.
Znak permutacji można jawnie wyrazić jako
sgn (σ) = (−1) ^ N (σ)
gdzie N (σ) to liczba inwersji w σ.
Alternatywnie znak permutacji σ można zdefiniować od jego rozkładu do iloczynu transpozycji jako
sgn (σ) = (−1) ^ m
gdzie m jest liczbą transpozycji w rozkładzie.
Dla tych z was, którzy nie lubią zupy greckiego alfabetu w swojej matematyce, postaram się nieco uprościć definicję na przykładzie (również skradzionym z wikipedii).
Przykład
Rozważmy układ wejściowy {1, 2, 3, 4, 5}
i permutacji nim, powiedzmy {3, 4, 5, 2, 1}
. Aby przejść z oryginalnej tablicy do jej permutacji, musisz zamienić indeksy 0
oraz 2
, 1
a 3
następnie 2
i 4
. Chociaż nie jest to unikalne rozwiązanie, parzystość jest dobrze zdefiniowana, więc działa to we wszystkich przypadkach.
Ponieważ wymaga 3 zamian, oznaczamy tę permutację odd
parzystością. Jak można się spodziewać, mówi się, że permutacja wymagająca parzystej liczby zamian ma even
parzystość.
Wyzwanie
Wyzwaniem jest napisanie programu w jak najmniejszej liczbie bajtów, aby określić parzystość permutacji. Twój program lub funkcja musi:
- Zaakceptuj jako argumenty dwie tablice wejściowe (lub łańcuchy) reprezentujące zestaw przed i po permutacji.
- Zwróć lub wydrukuj znak
e
parzysty lubo
nieparzysty, biorąc pod uwagę permutację. - Należy założyć, że wszystkie indeksy w tablicach lub ciągach mają unikalne wartości.
Przypadki testowe
Zakładając, że zadeklarowałeś funkcję o nazwie f
:
f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"
To jest golf golfowy , wygrywa najkrótszy program w bajtach!
źródło
[10], [10] -> e
(zero transpozycji).[10 30 20], [30 20 10] -> e
(dwie transpozycje).[10 30 20 40], [30 20 40 10] -> o
(trzy transpozycje)Odpowiedzi:
Galaretka,
1312 bajtówWypróbuj online!
Jak to działa
źródło
MATL ,
1716 bajtówUsunięto 1 bajt dzięki sugestii Dennisa
Działa to w bieżącej wersji (15.0.0) języka.
Wypróbuj online !
Wyjaśnienie
Wykorzystuje to definicję parzystości w kategoriach inwersji. Inwersja to para elementów w drugiej tablicy, które są w „złej” kolejności w porównaniu z pierwszą tablicą. Ponieważ pierwsza tablica nie musi być sortowana, najpierw ją sortujemy, a ta sama zmiana kolejności potrzebna do tego sortowania jest stosowana do drugiej tablicy. Wtedy inwersja odpowiada parze elementów, która nie rośnie w drugiej tablicy.
Należy również zauważyć, że dwie tablice wejściowe można zamieniać, a wynik jest taki sam. Dlatego nie jest ważne, która tablica jest uważana za „oryginalną”, a która „permutowaną”.
źródło
x(1:end-2)
itp. Bez wyraźnego wskazania wielkościx
. Nie jestem pewien, czy to był dobry wybór, ale myślę, że jest już za późno na zmianę :-) Może znajdę kompatybilny sposób, aby dodać modułowe indeksowanie0
ma znaczenie „ostatni wpis”, więc mogę zapisać bajt (usunąć przyrost). Dzięki za pomysł!Oktawa,
5652 bajtówWygląda na to, że jak dotąd nikt nie stosuje tego podejścia: w zasadzie używam tylko wyznaczników odpowiednich macierzy permutacji. Wyrażenie
det(eye(nnz(a))(a,:))
zwraca wyznacznik macierzy permutacji zdefiniowanej przez wektora
. Następnie jest tylko kwestia wyodrębnienia odpowiedniego znaku z łańcucha, w zależności od wyniku.źródło
Haskell, 58 bajtów
Stosowanie:
Ta sama metoda, co moja odpowiedź w języku Python . dumny haskeller uratował bajt
cycle
.źródło
cycle"eo"!!...
Zamiast"eo"!!mod(...)2
oszczędzać jeden bajt.Python 2, 68 bajtów
Stosowanie:
Liczy liczbę par inwersji dwóch spakowanych list, tj. wartości
(a,A)
i(b,B)
z każdej listy pod tym samym indeksem przy pomocya<b
iA>B
. Te porównania są łączone jakoa<b<M>A>B
, przy użyciu właściwości, że listaM
jest większa niż dowolna liczba. Następnie suma jest pobierana modulo 2 i przekształcana we
lubo
.źródło
JavaScript (ES6), 73 bajty
Ponieważ interesuje nas tylko parzystość, wszelkie zduplikowane transpozycje po prostu anulują. Dogodnie indeksy tablic JavaScript nie są wielowymiarowe.
źródło
Mathematica, 77 bajtów
Zgadzam się!
źródło
Cycles
. Zwiększa rozmiarPermutationCycles
imienia, a nawetPermutationCycles
jest głupi, zwracającCycles
obiekt! `Mathematica, 31 bajtów
Możemy zmienić kolejność jednej listy na drugą, najpierw zmieniając kolejność jednej listy na dowolną kolejność (w tym przypadku kolejność kanoniczną) i ponownie uporządkuj tę listę do ostatecznej listy. Znak całkowitej permutacji jest parzysty, jeśli znaki dwóch permutacji są równe.
źródło