Ein "Reimschema" ist eine Folge von Buchstaben a
bis z
, so dass die ersten Vorkommen der Zeichen in aufsteigender Reihenfolge (ohne Lücken) beginnen a
. Zum Beispiel (mit markiertem erstem Vorkommen):
abccdbebdcfa
^^^ ^ ^ ^
Die Anzahl der Reimlängenschemata N
ergibt sich aus den Bell-Zahlen B(N)
. ( OEIS A000110 )
Die Herausforderung
Ihre Aufgabe ist es, eine Aufzählung dieser Reimschemata zu implementieren, dh eine bijektive Abbildung von ganzen Zahlen auf Reimschemata. Sie erhalten eine positive Ganzzahl N <= 26
sowie eine nicht negative Ganzzahl 0 <= i < B(N)
. Alternativ können Sie den Bereich verwenden 1 <= i <= B(N)
. Sie sollten ein Reimschema der Länge ausgeben N
, sodass jeder i
eine andere Zeichenfolge ergibt.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Sie können entweder Groß- oder Kleinbuchstaben verwenden (konsistent).
Ihr Code muss in der Lage sein, jede gültige Eingabe in angemessener Zeit zu verarbeiten (z. B. nicht länger als ein paar Stunden für den N = 26
schlimmsten Fall i
). Dies sollte Lösungen ermöglichen, die exponentiell mit skalieren N
(für kleine Basen), auch in langsamen Sprachen, aber Lösungen, die linear mit skalieren i
(dh B(N)
) , verbieten . Dies bedeutet insbesondere, dass Sie nicht alle gültigen Reimschemata mit einer Länge durchlaufen können, N
bis Sie die i
Schemata verworfen haben.
Es gelten die Standardregeln für Code-Golf .
Beispiele
Die genaue Zuordnung der i
zu Schemata (dh die Reihenfolge der Schemata für eine gegebene N
) liegt bei Ihnen. Angenommen, Sie haben die lexikografische Reihenfolge gewählt. Ihre Lösung sollte der folgenden Tabelle entsprechen ( -
wobei ungültige Eingaben angegeben werden):
N\i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 a - - - - - - - - - - - - - -
2 aa ab - - - - - - - - - - - - -
3 aaa aab aba abb abc - - - - - - - - - -
4 aaaa aaab aaba aabb aabc abaa abab abac abba abbb abbc abca abcb abcc abcd
Hier ist ein kurzes CJam-Skript, das alle gültigen Reimschemata für eine bestimmte Länge generiert (aber versuchen Sie nicht mehr als 10, sonst warten Sie eine Weile).
N
) ausgeben , vorausgesetzt, das ist nicht ganz einfach und ich war einfach zu dumm, um es zu finden.