Wyzwanie
Dla danego zestawu n liczb całkowitych napisz program, który wyświetli jego indeks leksykograficzny.
Zasady
- Dane wejściowe muszą być tylko zbiorem unikatowych nieujemnych liczb całkowitych oddzielonych spacjami.
- Powinieneś wypisać indeks leksykograficzny (zakres od 0 do n! -1 włącznie) permutacji.
- Nie można używać bibliotek permutacji ani wbudowanych permutacji.
- Nie możesz wygenerować zestawu permutacji ani żadnego podzbioru permutacji danych wejściowych, aby pomóc ci znaleźć indeks.
- Nie można również zwiększać ani zmniejszać danej permutacji do następnej / poprzedniej (leksykograficznie) permutacji.
- Punkty bonusowe (-10 bajtów), jeśli znajdziesz sposób, aby to zrobić bez użycia silni.
- Czas działania powinien być krótszy niż 1 minuta dla n = 100
- Wygrywa najkrótszy kod bajtowy
- Zwycięzca wybrany we wtorek (22 lipca 2014 r.)
Więcej informacji o permutacjach
- http://www.monkeyphysics.com/articles/read/26/numbering_permutations.html
- Operacja grupy permutacji
- http://lin-ear-th-inking.blogspot.com/2012/11/enumerating-permutations-using.html
Przykłady
0 1 2 --> 0
0 2 1 --> 1
1 0 2 --> 2
1 2 0 --> 3
2 0 1 --> 4
2 1 0 --> 5
0 1 2 3 4 5 6 7 --> 0
0 1 2 3 4 5 7 6 --> 1
0 1 2 3 4 6 5 7 --> 2
1 3 5 17 --> 0
781 780 779 13 --> 23
81 62 19 12 11 8 2 0 --> 40319
195 124 719 1 51 6 3 --> 4181
code-golf
math
combinatorics
set-theory
permutations
Kyle McCormick
źródło
źródło
Odpowiedzi:
GolfScript, 12 (22 znaków - 10 bonusów)
Punkty bonusowe za niestosowanie silni. Dane wejściowe należy podać na STDIN w formacie opisanym w pytaniu. Możesz wypróbować kod online .
źródło
CJam, 31, z silnią
źródło
Python 2 (77 = 87-10)
Taki czytelny. Wiele wbudowanych. Łał.
Korzystamy z faktu, że indeks leksykograficzny permutacji jest sumą elementów permutacji liczby inwersji powyżej tego elementu (wartości po nim, ale poniżej niego) pomnożonej przez silnię liczby elementów po nim. Zamiast oceniać to wyrażenie wielomianowe termin po terminie, używamy czegoś podobnego do metody Hornera .
Zamiast zapętlać indeksy tablic, wielokrotnie usuwamy pierwszy element listy i przetwarzamy pozostałe elementy. Wyrażenie
sorted(p).index(p.pop(0))
zlicza liczbę inwersji za pierwszym indeksem, biorąc jego pozycję na posortowanej liście, jednocześnie wykonując usunięcie.Niestety musiałem użyć Pythona 2 i wziąć 4 dodatkowe znaki dla
raw_input
(chociaż -1 dlaprint
), ponieważ w Pythonie 3map(int,...)
tworzy obiekt mapy, który nie obsługuje operacji na listach,źródło
Pyth (13 = 23-10)
Port mojej odpowiedzi w języku Python .
Tłumaczenie Pythona (z pominięciem niektórych nieistotnych elementów):
Liczby wejściowe pozostają ciągami, ale są sortowane jako liczby całkowite za pomocą eval jako klucza. Lista jest odwrócona, dzięki czemu
pop
zajmuje przód, a nie tył.źródło
Kobra - 202
Oczywiście Cobra tak naprawdę nie konkuruje w tym przypadku.
źródło
J, 5 bajtów (15–10)
Działa to w czasie O ( n 2 ) i jest w stanie łatwo obsłużyć n = 100.
Stosowanie
Wyjaśnienie
źródło