Eingabe: Eine Folge von Großbuchstaben (ASCII [65; 90]), die die N- te * lexikographische Permutation des Mehrfachsatzes seiner Zeichen darstellt
* Permutationen werden von 0 oder 1 aufwärts nummeriert
Ausgabe: Basis-10-Ganzzahl N
Rulez
- Es könnte Duplikate geben (so unterscheidet sich diese Herausforderung von dieser )
- Die Zeichen werden nach ihrem ASCII-Wert sortiert
- Im Fall einer Eingabe einer Länge von weniger als oder gleich 1 ist , ist der Eingang die erste Permutation und das Ergebnis ist ,
0
oder1
jeweils - Die erste Permutation ist diejenige, bei der das am weitesten links stehende Zeichen den niedrigsten Wert hat, das am weitesten rechts stehende Zeichen den höchsten Wert hat und die Zeichenfolge zwischen dem ersten und dem letzten Zeichen die erste Permutation des Mehrfachsatzes seiner Zeichen ist (rekursive Definition!)
- Der kürzeste Eintrag gewinnt
Beispiel
- Input
AAB
erzeugt Output0
- Input
ABA
erzeugt Output1
- Input
BAA
erzeugt Output2
- Input
ZZZ
erzeugt Output0
- Input
DCBA
erzeugt Output23
BEARBEITEN
Zusätzliches Lob an denjenigen, der eine Lösung finden kann, die nicht alle Permutationen erzeugt und dann nach der Eingabe sucht. Das ist eine Herausforderung.
code-golf
permutations
kyrill
quelle
quelle
zzz
unddcba
sind nicht groß geschrieben.Antworten:
Gelee , 5 Bytes
Probieren Sie es online!
1-indizierte Ausgabe.
quelle
Python 2, 69 Bytes
Probieren Sie es online aus
quelle
Python,
302287 BytesDead Possum hat bereits eine kurze Pythonic-Lösung veröffentlicht, daher habe ich mich für das besondere Lob entschieden. Diese Lösung generiert nicht alle Permutationen. Es kann den Permutationsindex einer ziemlich großen Zeichenfolge schnell berechnen. Es behandelt auch eine leere Zeichenfolge korrekt.
Testcode:
Ausgabe
Nicht Golf Version:
Über
lexico_permute_string
Dieser Algorithmus stammt aufgrund von Narayana Pandita von https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
Erzeugen der nächsten Permutation in lexikographischer Reihenfolge
a
FWIW, Sie können hier eine kommentierte Version dieser Funktion sehen .
FWIW, hier ist die Umkehrfunktion.
Ausgabe
Und hier ist eine Funktion, die ich während der Entwicklung geschrieben habe und
perm_unrank
die die Aufteilung der Unterzählungen zeigt.Ausgabe
quelle
z=0
und ersetzent[0]
undt[1:]
wo sie verwendet werden (derzeith
undt
), um 8 Bytes zu sparen.True
für Werte von 1 oder niedriger zurück, aber ich denke, mit Ihrem Code sollte das in Ordnung sein?f=lambda n:n<2or n*f(n-1)
05AB1E , 5 Bytes
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
05AB1E , 5 Bytes
Probieren Sie es online!
Unabhängig von Adnans Antwort entdeckt.
quelle
PHP, 124 Bytes
PHP, 136 Bytes
Online Version
Laufen Sie mit
Mit Fakultät berechnen
Erweiterte Version
Ausgabe für den String PPCG
Online Version
quelle
print+$n´ with ´die("$n")´ and the loop will stop after the permutation is found. And I must add
$ n = 0` in der Schleife ersetzen, dann funktioniert die Umwandlung in eine Ganzzahl bei dieser Änderung nichtJulia,
121125 BytesNicht konkurrierend, da doppelte Buchstaben nicht korrekt behandelt werden. Ich habe dies aus einer anderen Sprache portiert, aus einem Teil einer Lösung für ein Projekt-Euler-Problem, das ich vor einigen Jahren durchgeführt habe, und die erste 121-Byte-Version hatte einen Fehler, weil ich die Verwendung der permutierten Zeichenfolge und der sortierten kanonischen Referenz transponiert hatte Zeichenfolge.
Für große Eingaben verwendet diese Version Bignums zum Preis von 8 zusätzlichen Bytes:
Ungolfed:
Verwendet ein faktoriadisches Zahlensystem , s. Dazu: Es werden nicht alle Permutationen erzeugt, und bei großen Eingaben wird es enorm schneller ausgeführt als bei denjenigen, die dies tun.
Zum Beispiel kann das Alphabet in den eher erfundenen Satz "Quarz-Glyphen-Job vex'd cwm finks" permutiert werden. Dieser Satz ist die 259.985.607.122.410.643.097.474.123. Lexikografische Permutation der Buchstaben des Alphabets. (Ungefähr 260 Septillionstel Permutation.) Dieses Programm findet das in ungefähr 65 µs auf meiner Maschine.
Beachten Sie, dass die Nummer auf ... 122 anstatt auf ... 123 endet, da OP die Nummerierung der Permutationen von 0 anstatt von 1 verlangt hat.
Julia, 375 Bytes
Ich habe die Einrückung für die Lesbarkeit belassen, aber die Byteanzahl ist ohne.
Dies ist nur eine reine Julia-Portierung von PM 2Rings brillanter Python-Lösung. Ich hatte Hunger und entschied, dass ich den Keks doch haben wollte. Es ist interessant, die Ähnlichkeiten und Unterschiede zwischen den beiden Sprachen zu sehen. Ich habe
itertools.groupby
(in eingeschränkter Form) implementiert alsg(w)
.Aber die Logik ist nicht meine, also stimme der Antwort von PM 2Ring zu .
Ersetzen Sie
f=factorial
durch,f(x)=factorial(BigInt(x))
wenn Sie in der Lage sein möchten, große Eingaben wie p ("QUARTZGLYPHJOBVEXDCWMFINKS") zu verarbeiten.quelle
BAA
- erwartet2
, tatsächlich3
.MATL ,
131211 Bytes1 Byte gespart dank GB !
Die Ausgabe ist 1-basiert.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
q
Richtige?Mathematica,
3331 BytesDurch Ändern der Problemspezifikation konnten 2 Byte eingespart werden.
Reine Funktion, die eine Liste als Eingabe nimmt und eine nicht negative Ganzzahl
N
im Formular zurückgibt{{N}}
.quelle
-1
.JavaScript (ES6), 130 Byte
Weniger golfen
Prüfung
quelle
CJam , 7 Bytes
Probieren Sie es online!
quelle
Pyth, 5 Bytes
Online-Dolmetscher
Übernimmt die angegebenen Eingaben.
quelle
'BAA'
muss zurückgegeben werden,2
da es mit Nullen indiziert ist, aber es wird4
stattdessen zurückgegeben.Scala, 40 Bytes
Um es zu verwenden, weisen Sie diese Funktion einer Variablen zu:
Probieren Sie es online bei ideone
Leider wird
permutations
ein Iterator zurückgegeben, der keinesorted
Methode hat, sodass er in eine konvertiert werden mussSeq
quelle
C ++, 96 Bytes
Hier können wir die Standardbibliothek voll ausnutzen. Die Liste der Buchstaben wird als Start- / End-Iterator im Standard-C ++ - Stil übergeben.
Wir müssen nicht alle Permutationen generieren - da wir eine Transformation von einer Permutation zu ihrer Vorgängerversion haben, zählen wir einfach, wie viele Iterationen erforderlich sind, um den nullten Wert zu erreichen.
Testprogramm:
Testergebnisse:
quelle
Japt, 6 Bytes
0-indiziert
Versuch es
quelle
Ruby, 50 Bytes
Ich habe erwartet, dass das kürzer wird. Ich hätte das nicht hinzugefügt,
sort
wenn die Dokumentation nicht gesagt hätte: "Die Implementierung gibt keine Garantie für die Reihenfolge, in der die Permutationen ausgegeben werden."quelle