Dane wejściowe: ciąg wielkich liter (ASCII [65; 90]), który jest n- tą * leksykograficzną permutacją multisettu jego znaków
* permutacje są ponumerowane od 0 lub 1 w górę
Wyjście: liczba całkowita base-10 N.
Rulez
- Mogą istnieć duplikaty (tak różni się to wyzwanie od tego )
- Znaki są uporządkowane według wartości ASCII
- W przypadku wprowadzania na długość mniejszą niż lub równą 1, sygnał wejściowy jest pierwszym permutacji i wynik
0
lub1
, odpowiednio - Pierwsza permutacja to ta, w której znak znajdujący się najbardziej po lewej stronie ma najniższą wartość, znak znajdujący się najbardziej po prawej stronie ma najwyższą wartość, a sekwencja znaków między pierwszym a ostatnim znakiem jest pierwszą permutacją multiset jego znaków (definicja rekurencyjna!)
- Zwycięża najkrótsza pozycja
Przykład
- Wejście
AAB
wytwarza wynik0
- Wejście
ABA
wytwarza wynik1
- Wejście
BAA
wytwarza wynik2
- Wejście
ZZZ
wytwarza wynik0
- Wejście
DCBA
wytwarza wynik23
EDYTOWAĆ
Dodatkowe podziękowania dla tego, który może wymyślić rozwiązanie, które nie generuje wszystkich permutacji, a następnie wyszukać dane wejściowe. To jakieś wyzwanie.
code-golf
permutations
kyrill
źródło
źródło
zzz
idcba
nie jest to wielkie litery.Odpowiedzi:
Galaretka , 5 bajtów
Wypróbuj online!
Wyjście 1-indeksowane.
źródło
Python 2, 69 bajtów
Wypróbuj online
źródło
Python,
302287 bajtówDead Possum opublikowało już krótkie rozwiązanie w języku Python, więc zdecydowałem się na dodatkowe wyróżnienia. To rozwiązanie nie generuje wszystkich permutacji. Może szybko obliczyć wskaźnik permutacji raczej dużego ciągu; poprawnie obsługuje również pusty ciąg.
Kod testowy:
wynik
Wersja bez gry w golfa:
O
lexico_permute_string
Ten algorytm, dzięki Narayana Pandita, pochodzi z https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
Aby utworzyć następną permutację w porządku leksykograficznym sekwencji
a
FWIW można zobaczyć uwagami wersję tej funkcji tutaj .
FWIW, oto funkcja odwrotna.
wynik
A oto funkcja, którą napisałem podczas opracowywania,
perm_unrank
która pokazuje rozkład subkont.wynik
źródło
z=0
i zastępować wt[0]
it[1:]
gdzie są one wykorzystywane (obecnieh
it
), aby zapisać 8 bajtów.True
wartość 1 lub mniej, ale myślę, że z twoim kodem powinno być w porządku?f=lambda n:n<2or n*f(n-1)
05AB1E , 5 bajtów
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
05AB1E , 5 bajtów
Wypróbuj online!
Niezależnie odkryta z odpowiedzi Adnana.
źródło
PHP, 124 bajty
PHP, 136 bajtów
Wersja online
Biegnij z
Oblicz z silnią
Wersja rozszerzona
Dane wyjściowe dla ciągu PPCG
Wersja online
źródło
print+$n´ with ´die("$n")´ and the loop will stop after the permutation is found. And I must add
$ n = 0` w pętli, wtedy rzutowanie na liczbę całkowitą nie działa w tej zmianieJulia,
121125 bajtówNiekonkurencyjne, ponieważ nie radzi sobie z powielonymi literami. Przeniesiłem to z innego języka, od części rozwiązania problemu Project Euler, który zrobiłem kilka lat temu, a pierwsza, 121-bajtowa wersja miała błąd, ponieważ transponowałem użycie permutowanego ciągu i posortowane, kanoniczne odniesienie strunowy.
W przypadku dużych nakładów ta wersja używa bignów kosztem 8 dodatkowych bajtów:
Nie golfowany:
Wykorzystuje system liczb czynnikowych , qv W ten sposób nie produkuje wszystkich permutacji i dla dużych danych wejściowych będzie działał znacznie szybciej niż te, które to robią.
Na przykład, alfabet można zapisać w dość wymyślonym zdaniu „Glif Quartz Job vex'd cwm finks”. To zdanie to 259.985,607,122,410,643,097,474,123 123 permutacja leksykograficzna liter alfabetu. (Około 260 septillionowych permutacji.) Ten program znajduje to w około 65 µs na mojej maszynie.
Zauważ, że liczba kończy się na ... 122 zamiast ... 123, ponieważ OP zażądał, aby permutacje były ponumerowane od 0 zamiast od 1.
Julia, 375 bajtów
Zostawiłem wcięcie dla czytelności, ale liczba bajtów jest bez niego.
Ten jest tylko prostym portem Julii genialnego rozwiązania PM 2Ring w języku Python. Byłem głodny, więc zdecydowałem, że mimo wszystko chcę ciasteczka. Ciekawie jest zobaczyć podobieństwa i różnice między dwoma językami. Zaimplementowałem
itertools.groupby
(w ograniczonej formie) jakog(w)
.Ale logika nie jest moja, więc idź i poprzyj odpowiedź PM 2Ring .
Wymień
f=factorial
sięf(x)=factorial(BigInt(x))
, jeśli chcesz być w stanie obsługiwać dużych nakładów jak p ( „QUARTZGLYPHJOBVEXDCWMFINKS”).źródło
BAA
- oczekiwany2
, rzeczywisty3
.MATL ,
131211 bajtów1 bajt zapisany dzięki GB !
Wyjście jest oparte na 1.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
q
prawo?Mathematica,
3331 bajtówZmiana specyfikacji problemu pozwoliła na oszczędności 2-bajtowe.
Czysta funkcja pobierająca listę jako dane wejściowe i zwracająca nieujemną liczbę całkowitą
N
w formularzu{{N}}
.źródło
-1
.JavaScript (ES6), 130 bajtów
Mniej golfa
Test
źródło
CJam , 7 bajtów
Wypróbuj online!
źródło
Pyth, 5 bajtów
Tłumacz online
Pobiera cytowane dane wejściowe.
źródło
'BAA'
muszą zostać zwrócone,2
ponieważ są zindeksowane, ale4
zamiast tego zwraca .Scala, 40 bajtów
Aby z niego skorzystać, przypisz tę funkcję do zmiennej:
Wypróbuj online w ideone
Niestety
permutations
zwraca iterator, który nie masorted
metody, więc należy go przekonwertować naSeq
źródło
C ++, 96 bajtów
Tutaj możemy w pełni wykorzystać standardową bibliotekę. Lista liter jest przekazywana jako iteratory początkowe / końcowe w standardowym stylu C ++.
Nie musimy generować wszystkich permutacji - ponieważ mamy transformację z jednej permutacji do jej poprzednika, po prostu liczymy, ile iteracji potrzeba, aby osiągnąć wartość zerową.
Program testowy:
Wyniki testu:
źródło
Japt, 6 bajtów
0-indeksowane
Spróbuj
źródło
Rubinowy, 50 bajtów
Spodziewałem się, że będzie to krótsze. Nie
sort
dodałbym, gdyby dokumenty nie mówiły „implementacja nie daje żadnych gwarancji co do kolejności uzyskiwania permutacji”.źródło