Jongler avec des chiffres

20

Votre tâche consiste à générer un modèle de jonglage valide en remplissant un modèle donné. Mais d'abord, vous devez probablement savoir comment un tel modèle est indiqué.

entrez la description de l'image ici

Introduction à Siteswap

Siteswap est la notation établie pour les modèles de jonglage. Il fonctionne en divisant le motif en battements. A chaque battement, votre main gauche et votre main droite alternent pour lancer une balle. Chaque lancer (c'est-à-dire chaque battement) est indiqué par un nombre qui indique quand cette balle est lancée ensuite - cela correspond directement à la hauteur du lancer.

Regardons quelques exemples. Voir les animations de tous ces éléments ici .

Cascade à 3 balles

Le motif à 3 balles le plus simple. Chaque balle est lancée à chaque troisième battement (mains alternées). L'écriture des temps ressemble à ceci (les lignes ASCII relient deux temps auxquels la même balle est lancée):

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
         └─┼─┼─┘ │ │
           └─┼───┘ │
             └─────┘

Notez comment chaque balle lancée à un Lrythme, est jeté à côté à un des Rmotifs beat.Siteswap répéter implicitement, de sorte que ce modèle est généralement notée 333, mais simplement 3serait également suffisante.

441

Voici un exemple un peu plus compliqué avec le 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
         │ │ └─┘ │ │
         └─┼─────┘ │
           └───────┘

Notez comment les lancers pairs vont dans la même main qu'ils ont été lancés, tandis que les lancers impairs vont dans l'autre main.

423

Parfois, vous voulez simplement tenir une balle à travers un battement au lieu de la lancer. Cela signifie que cette balle est lancée la prochaine fois que c'est le tour de cette main, c'est-à-dire 2 temps plus tard. Donc, tenir une balle équivaut à un 2dans le motif:

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 0signifie que la main actuelle est vide à ce rythme, comme le montre ce schéma:

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
         └───┼───┼─┘   │
             └───┼─────┘
                 └───────>

Jonglage multiplex

Ce problème serait cependant un peu trop simple avec siteswap vanilla. Entrez les modèles multiplex! Le jonglage multiplex signifie que vous lancez plusieurs balles d'une main en même temps. Par exemple, dans la cascade de 3 balles ci-dessus, si vous étiez deux à lancer une balle supplémentaire à chaque troisième battement, le motif deviendrait [33]33et ressemblerait à ceci:

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
          └┴──┼─┼──┴┘  │ │
              └─┼──────┘ │
                └────────┘

Voici un autre exemple, où le jet multiplex a deux hauteurs / longueurs différentes. Il pourrait être désigné comme étant soit [34]11ou [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
          ││  └─┴──┘│  │
          │└────────┘  │
          └────────────┘

(Notez que le 1jeté au battement 2atterrit au battement 3et est immédiatement lancé à nouveau (comme un autre 1) pour atterrir au battement 4et faire partie du deuxième lancer multiplex.)

Le sitewap pour l'animation au début de ce post était [53]15121 .

Validité du modèle

Pour qu'un modèle soit sémantiquement valide, le nombre de balles dans une main doit toujours correspondre au nombre de lancers indiqué à ce temps. Cela signifie qu'il ne doit pas y avoir de balles atterrissant sur un battement avec un 0, qu'il ne doit y avoir qu'une seule balle atterrissant sur un battement avec un autre chiffre unique, et qu'il doit y avoir n balles atterrissant sur un battement multiplex, où n est le nombre de chiffres dans ce lancer multiplex. Le motif doit également pouvoir se répéter de manière transparente.

Des exemples de motifs invalides sont 543(toutes les balles atterriraient au même temps), 240(les 2atterriraient au 0rythme) ou 33[24](aucune balle ne se poserait au battement multiplex, mais deux balles atterriraient aux deux autres temps).

Le défi

Vous prendrez un modèle siteswap qui contient des caractères génériques et produirez un modèle valide, avec ces caractères génériques remplis.

Prendre en entrée (via stdin, argument de ligne de commande, fichier ou paramètre de fonction) une chaîne au format

n s

nest un entier indiquant le nombre de boules à utiliser, et sest un modèle de siteswap ( sans espace). Vous pouvez supposer que c'est syntaxiquement correct - tous les crochets sont appariés et non imbriqués, et il n'y a pas de caractères inattendus. Tous les lancers seront des lancers à un chiffre ( 0- 9). Cependant , certains temps peuvent simplement être désignés par un _, qui doit être rempli avec une sortie simple ou multiplex dans la sortie.

Remarque: quelque chose comme ça ne[_3] fera pas partie de l'entrée. Soit le temps entier est manquant, soit le temps entier est donné.

Sortez un modèle valide, qui peut être jonglé avec le nombre de balles donné et est d'accord avec le modèle d'entrée dans tous les temps spécifiés. Si aucun modèle valide n'est possible avec les entrées données, sortez !. La sortie sera également via stdout, vers un fichier ou comme valeur de retour de fonction.

Remarque: La sortie ne doit pas contenir de crochets ou de zéros inutiles dans les lancers multiplex. Donc, les sorties contenant [3]ou [03]ne sont pas acceptées, vous devez produire à la 3place. L'ordre des chiffres dans une projection multiplex n'est pas pertinent.

Remarque: Vous pouvez omettre des modèles qui sont des doublons sous permutations cycliques. Par exemple, pour la saisie 3 __(notez les deux caractères génériques), les deux 42et 24sont des réponses valides (entre autres), mais elles décrivent en fait le même modèle. Vous pouvez soit sortir les deux soit juste l'un d'eux, mais vous devrez le faire de manière cohérente.

C'est le code golf , le code le plus court gagne (sous réserve des bonus listés en bas de la question).

Vous pouvez utiliser JugglingLab pour jouer avec les motifs pour voir s'ils sont valides et à quoi ils ressemblent.

Exemples

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.

Bonus

  • Si votre réponse peut gérer des "chiffres" jusqu'à 35, indiqués par des lettres (10 = A, 11 = B, ...), soustrayez 20 caractères . Vous pouvez décider si ces lettres doivent être majuscules, minuscules ou insensibles à la casse. (JugglingLab peut les gérer en minuscules si vous souhaitez consulter certains modèles insensés.)
  • Si votre réponse génère toutes les solutions valides, soustrayez 20 caractères .
Martin Ender
la source

Réponses:

6

Python, 587-20 = 567 caractères

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
la source
Par simple curiosité, connaissez-vous la complexité temporelle de votre solution? Cependant, ne vous inquiétez pas d'expliquer l'algorithme, afin de ne pas gâcher le plaisir pour ceux qui pourraient encore essayer. ;)
Martin Ender
Je pense que c'est quelque chose comme L*n^(n*choose(n+11,n+2))nest le nombre de caractères génériques et Lle nombre de caractères dans le motif. Pas vraiment efficace.
user1502040
Je viens de remarquer que vous surestimez dans les cas qui autorisent les permutations cycliques (par exemple, 3 __chaque résultat est deux fois, avec les battements échangés), mais je suppose que c'est plutôt ma faute de ne pas le spécifier. J'ajouterai cependant une clause pour permettre de les omettre si cela aide à économiser des octets.
Martin Ender
Eh bien, ayez une prime alors! Il semble que la question soit trop ennuyeuse ou trop intimidante pour tout le monde. ;)
Martin Ender