Jonglieren nach Zahlen

20

Ihre Aufgabe ist es, ein gültiges Jongliermuster zu generieren, indem Sie eine vorgegebene Vorlage ausfüllen. Aber zuerst müssen Sie wahrscheinlich wissen, wie ein solches Muster bezeichnet wird.

Bildbeschreibung hier eingeben

Einführung in Siteswap

Siteswap ist die etablierte Notation für Jongliermuster. Es funktioniert durch Teilen des Musters in Beats. Bei jedem Schlag wechseln sich linke und rechte Hand beim Werfen eines Balls ab. Jeder Wurf (dh jeder Schlag) wird mit einer Zahl gekennzeichnet, die angibt, wann der Ball als nächstes geworfen wird - dies entspricht direkt der Höhe des Wurfs.

Schauen wir uns einige Beispiele an. Sehen Sie Animationen von all diesen hier .

3-Ball-Kaskade

Das einfachste 3-Ball-Muster. Jeder Ball wird bei jedem dritten Schlag geworfen (abwechselnde Hände). Das Ausschreiben der Beats sieht folgendermaßen aus (die ASCII-Linien verbinden zwei Beats, auf die derselbe Ball geworfen wird):

Beat     1 2 3 4 5 6 7 8 9
Hand     L R L R L R L R L
Siteswap 3 3 3 3 3 3 3 3 3
         └─┼─┼─┘ │ │
           └─┼───┘ │
             └─────┘

Beachten Sie, wie jeder Ball auf eine Kugel geworfen wird L Schlag geworfen wird, als nächster auf einen RSchlag geworfen wird. Sitewap-Muster wiederholen sich implizit, sodass dieses Muster normalerweise als bezeichnet wird 333, obwohl dies einfach 3auch ausreichen würde.

441

Hier ist ein etwas komplizierteres Beispiel mit dem siteswap 441 :

Beat     1 2 3 4 5 6 7 8 9
Hand     L R L R L R L R L
Siteswap 4 4 1 4 4 1 4 4 1
         │ │ └─┘ │ │
         └─┼─────┘ │
           └───────┘

Beachten Sie, wie Würfe mit gerader Nummer zu derselben Hand gehen, aus der sie geworfen wurden, während Würfe mit ungerader Nummer zur anderen Hand gehen.

423

Manchmal möchte man einfach einen Ball durch einen Schlag halten, anstatt ihn zu werfen. All das bedeutet, dass dieser Ball das nächste Mal geworfen wird, wenn diese Hand an der Reihe ist - dh 2 Schläge später. Das Halten eines Balls entspricht also einem 2im Muster:

Beat     1 2 3 4 5 6 7 8 9
Hand     L R L R L R L R L
Siteswap 4 2 3 4 2 3 4 2 3
         │ └─┼─┘ │ │
         │   └───┼─┘
         └───────┘

50505

A 0bedeutet, dass die aktuelle Hand bei diesem Schlag leer ist, wie dieses Muster zeigt:

Beat     1 2 3 4 5 6 7 8 9
Hand     L R L R L R L R L
Siteswap 5 0 5 0 5 5 0 5 0
         └───┼───┼─┘   │
             └───┼─────┘
                 └───────>

Multiplex Jonglieren

Dieses Problem wäre bei Vanilla Siteswap allerdings etwas zu einfach. Geben Sie Multiplexmuster ein! Multiplex Jonglieren bedeutet, dass Sie mehrere Bälle gleichzeitig aus einer Hand werfen. Wenn Sie beispielsweise in der obigen 3-Ball-Kaskade bei jedem dritten Schlag zwei weitere Bälle werfen würden, würde das Muster folgendermaßen [33]33aussehen:

Beat     1    2 3 4    5 6 7    8 9
Hand     L    R L R    L R L    R L
Siteswap [33] 3 3 [33] 3 3 [33] 3 3
          └┴──┼─┼──┴┘  │ │
              └─┼──────┘ │
                └────────┘

Hier ist ein weiteres Beispiel, bei dem der Multiplex-Wurf zwei verschiedene Höhen / Längen hat. Es könnte bezeichnet werden als entweder [34]11oder [43]11:

Beat     1    2 3 4    5 6 7    8 9
Hand     L    R L R    L R L    R L
Siteswap [43] 1 1 [43] 1 1 [43] 1 1
          ││  └─┴──┘│  │
          │└────────┘  │
          └────────────┘

(Beachten Sie, dass der 1im Takt geworfene Schlag im Takt 2landet 3und sofort wieder (als ein anderer 1) geworfen wird , um im Takt zu landen4 Wurf und Teil des zweiten Multiplex-Wurfs zu sein.)

Der Seitenwechsel für die Animation am Anfang dieses Beitrags war [53]15121 .

Mustergültigkeit

Damit ein Muster semantisch gültig ist, muss die Anzahl der Bälle in einer Hand immer der Anzahl der Würfe entsprechen, die bei diesem Schlag angegeben wurden. Dies bedeutet, dass bei einem Schlag mit a keine Bälle landen 0dürfen, dass bei einem Schlag mit einer anderen Ziffer nur ein Ball landen darf und dass bei einem Multiplexschlag n Bälle landen dürfen, wobei n die Anzahl der Stellen ist in diesem Multiplexwurf. Das Muster muss sich auch nahtlos wiederholen lassen.

Beispiele für ungültige Muster sind 543(alle Bälle würden im selben Takt landen), 240(die 2würden im 0Takt landen ) oder33[24] (es landen keine Bälle im Multiplex-Takt, aber zwei Bälle landen auf den beiden anderen beiden Takten).

Die Herausforderung

Sie nehmen ein Siteswap-Muster, das Platzhalter enthält, und geben ein gültiges Muster aus, wobei diese Platzhalter ausgefüllt sind.

Nehmen Sie als Eingabe (über stdin, Befehlszeilenargument, Datei oder Funktionsparameter) eine Zeichenfolge des Formats

n s

Dabei nhandelt es sich um eine Ganzzahl, die die Anzahl der zu verwendenden Bälle angibt, und sum ein Site-Swap-Muster ( ohne Leerzeichen). Sie können davon ausgehen, dass es syntaktisch korrekt ist - alle eckigen Klammern stimmen überein und sind nicht verschachtelt, und es gibt keine unerwarteten Zeichen. Alle Würfe sind einstellige Würfe ( 0- 9). Allerdings , einige Schläge können nur als eine bezeichnet werden _, die mit einem einzigen oder einem Multiplex - Wurf in der Ausgabe gefüllt werden soll.

Hinweis: so etwas [_3]wird nicht Bestandteil der Eingabe. Entweder fehlt der gesamte Beat oder es wird der gesamte Beat angegeben.

Geben Sie ein gültiges Muster aus, das mit der angegebenen Anzahl von Bällen jongliert werden kann und mit dem Eingabemuster in allen angegebenen Schlägen übereinstimmt. Wenn mit den angegebenen Eingaben kein gültiges Muster möglich ist, wird ausgegeben !. Die Ausgabe erfolgt ebenfalls über stdout, in eine Datei oder als Funktionsrückgabewert.

Hinweis: Die Ausgabe darf bei Multiplex-Throws keine unnötigen eckigen Klammern oder Nullen enthalten. Also müssen Ausgaben, die enthalten [3]oder [03]nicht akzeptiert werden, 3stattdessen ausgegeben werden. Die Reihenfolge der Ziffern in einem Multiplex-Wurf ist nicht relevant.

Hinweis: Sie können Muster weglassen, die bei zyklischen Permutationen doppelt vorhanden sind. ZB für die Eingabe 3 __(beachten Sie die beiden Platzhalter), beide 42und24 sind gültige Antworten (unter anderem), aber sie beschreiben tatsächlich das gleiche Muster. Sie können entweder beide oder nur einen von ihnen ausgeben, müssen dies jedoch konsequent tun.

Dies ist Codegolf , der kürzeste Code gewinnt (vorbehaltlich der unten in der Frage aufgeführten Boni).

Sie können verwenden JugglingLab verwenden mit Mustern , um zu sehen, ob sie gültig sind und wie sie aussehen.

Beispiele

Input           Possible Outputs     Comments

3 _             3
                [21]
                [111]

3 4_3           423

4 4_2           4[51]2
                4[42]2
                4[321]2

3 _23_          6231
                4233
                323[31]
                2235
                223[41]
                0237
                023[43]
                [42]231
                [32]23[11]
4 5_3           !                    5 and 3 will both land at the third beat, but
                                     there is only a single throw at that beat. This
                                     cannot be fixed with any throw in the blank.

2 5_4           !                    Any possible throw in the wildcard (including a
                                     0) will make a pattern for at least 3 balls.

3 54_           !                    The only solution that would correspond to a
                                     3-ball pattern is 540, which is not semantically
                                     valid because the 5 and 4 both land at beat 3.
                                     There are valid solutions, but they require at
                                     least 4 balls.

Boni

  • Wenn Ihre Antwort "Ziffern" mit bis zu 35 Buchstaben (10 = A, 11 = B, ...) verarbeiten kann, subtrahieren Sie diese 20 Zeichen ab . Sie können entscheiden, ob diese Buchstaben in Groß-, Klein- oder Kleinschreibung geschrieben werden sollen. (JugglingLab kann sie in Kleinbuchstaben verarbeiten, wenn Sie sich einige verrückte Muster ansehen möchten.)
  • Wenn Ihre Antwort alle gültigen Lösungen ausgibt , subtrahieren Sie 20 Zeichen .
Martin Ender
quelle

Antworten:

6

Python, 587 - 20 = 567 Zeichen

from itertools import *
E,J,L,R,X=enumerate,''.join,len,range,list
def f(x):
 [u,p]=str.split(x);n=int(u);a=[[[x],x][type(x)==X]for x in eval("["+J(c if c=="["else"-1,"if c=="_"else c+","for c in p)+"]")];l,w=L(a),[i for i,x in E(a)if x==[-1]]
 for j in product([[0]]+X(chain(*[combinations_with_replacement(R(1,10),i+1)for i in R(n+1)])),repeat=L(w)):
  for k,m in zip(w,j):a[k]=m
  b=[0]*l
  for k,x in E(a):
   for y in x:b[(k+y)%l]+=1
  if all(x==L(y)for x,y in zip(b,a))&((sum(map(sum,a))/l)==n):
   u=0;yield J([['['+J(map(str,x))+']',str(x[0])][L(x)==1]for x in a])
 if u:yield"!"
user1502040
quelle
Kennen Sie aus Neugier die zeitliche Komplexität Ihrer Lösung? Machen Sie sich (noch) keine Sorgen, den Algorithmus zu erklären, um anderen, die es vielleicht noch versuchen, den Spaß nicht zu verderben. ;)
Martin Ender
Ich denke, es ist so etwas wie L*n^(n*choose(n+11,n+2))wo ndie Anzahl der Platzhalter und Ldie Anzahl der Zeichen im Muster ist. Nicht gerade effizient.
user1502040
Ich habe gerade bemerkt, dass Sie in Fällen, in denen zyklische Permutationen zulässig sind (z. B. 3 __jedes Ergebnis zweimal mit vertauschten Beats), überzählen, aber ich nehme an, dass das eher meine Schuld ist, wenn ich das nicht spezifiziere. Ich werde allerdings eine Klausel hinzufügen, um das Weglassen dieser zu ermöglichen, wenn dies das Speichern von Bytes erleichtert.
Martin Ender
Nun, dann hab ein Kopfgeld! Es scheint, dass die Frage für alle anderen entweder zu langweilig oder zu entmutigend war. ;)
Martin Ender