Malabares por números

20

Su tarea es generar un patrón de malabarismo válido completando una plantilla determinada. Pero primero, probablemente necesite saber cómo se denota ese patrón.

ingrese la descripción de la imagen aquí

Introducción a Siteswap

Siteswap es la notación establecida para los patrones de malabares Funciona dividiendo el patrón en ritmos. En cada latido, su mano izquierda y derecha se alternan para lanzar una pelota. Cada lanzamiento (es decir, cada latido) se denota con un número que indica cuándo se lanza esa bola a continuación, esto corresponde directamente a la altura del lanzamiento.

Veamos algunos ejemplos. Vea animaciones de todo esto aquí .

Cascada de 3 bolas

El patrón más simple de 3 bolas. Cada bola se lanza en cada tercer tiempo (manos alternas). Al escribir los latidos, esto se ve a continuación (las líneas ASCII conectan dos latidos a los que se lanza la misma bola):

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

Observe cómo cada bola lanzada en un Llatido, se lanza luego en un Rlatido. Los patrones de intercambio de sitios se repiten implícitamente, por lo que este patrón generalmente se denota como 333, aunque simplemente 3también sería suficiente.

441

Aquí hay un ejemplo un poco más complicado con el sitewap 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
         │ │ └─┘ │ │
         └─┼─────┘ │
           └───────┘

Observe cómo los lanzamientos pares van a la misma mano desde la que fueron lanzados, mientras que los lanzamientos impares van a la otra mano.

423

A veces solo quieres sostener una pelota durante un tiempo en lugar de lanzarla. Todo eso significa que esta bola se lanza la próxima vez que sea el turno de esta mano, es decir, 2 golpes más tarde. Entonces, sostener una pelota es equivalente a a 2en el patrón:

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 0significa que la mano actual está vacía en ese ritmo, como muestra este patrón:

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

Malabares multiplex

Sin embargo, este problema sería un poco demasiado simple con vanilla siteswap. ¡Ingrese patrones multiplex! El malabarismo múltiple significa que lanzas múltiples bolas de una mano al mismo tiempo. Por ejemplo, en la cascada de 3 bolas anterior, si fueran dos lanzan una bola adicional en cada tercer golpe, el patrón se volvería [33]33y se vería así:

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

Aquí hay otro ejemplo, donde el tiro multiplex tiene dos alturas / longitudes diferentes. Se podría denotar como [34]11o [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
          ││  └─┴──┘│  │
          │└────────┘  │
          └────────────┘

(Tenga en cuenta que el 1lanzamiento al compás 2aterriza al compás 3e inmediatamente se lanza nuevamente (como otro 1) para aterrizar al compás 4y ser parte del segundo lanzamiento múltiple).

El intercambio de sitios para la animación al comienzo de esta publicación fue [53]15121 .

Validez del patrón

Para que un patrón sea semánticamente válido, el número de bolas en una mano debe corresponder siempre al número de lanzamientos indicados en ese tiempo. Esto significa que no debe haber bolas que caigan a un ritmo con un 0, debe haber solo una bola que caiga a un ritmo con cualquier otro dígito, y debe haber n bolas que caigan a un ritmo múltiple, donde n es el número de dígitos en ese tiro multiplex. El patrón también debe poder repetirse sin problemas.

Ejemplos de patrones inválidos son 543(todas las bolas aterrizarían en el mismo tiempo), 240(la 2tierra aterrizaría en el 0tiempo) o 33[24](ninguna bola cae en el tiempo multiplex, pero dos bolas caen en los otros dos tiempos).

El reto

Tomará un patrón de intercambio de sitios que contiene comodines y generará un patrón válido, con esos comodines rellenados.

Tome como entrada (a través de stdin, argumento de línea de comando, archivo o parámetro de función) una cadena del formato

n s

Donde nes un número entero que indica el número de bolas que se utilizarán, y ses un patrón de intercambio de sitios ( sin espacios en blanco). Puede suponer que es sintácticamente correcto: todos los corchetes coinciden y no están anidados, y no hay caracteres inesperados. Todos los lanzamientos serán de un solo dígito ( 0- 9). Sin embargo , algunos ritmos solo se pueden denotar como a _, que se debe completar con un solo o un lanzamiento múltiple en la salida.

Nota: algo así como [_3]lo que no sea parte de la entrada. O falta todo el tiempo o se da el tiempo completo.

Produce un patrón válido, que puede ser malabarizado con el número dado de bolas y concuerda con el patrón de entrada en todos los tiempos especificados. Si no es posible un patrón válido con las entradas dadas, salida !. La salida también se realizará a través de stdout, a un archivo o como un valor de retorno de función.

Nota: La salida no debe contener corchetes o ceros innecesarios en tiros multiplex. Por lo tanto, las salidas que contienen [3]o [03]no son aceptadas, debe generarlas en su 3lugar. El orden de los dígitos en un lanzamiento múltiple no es relevante.

Nota: Usted puede omitir patrones que son duplicados bajo permutaciones cíclicas. Por ejemplo, para la entrada 3 __(tenga en cuenta los dos comodines), ambos 42y 24son respuestas válidas (entre otros), pero que en realidad describen el mismo patrón. Puede generar ambos o solo uno de ellos, pero tendrá que hacerlo de manera consistente.

Este es el código de golf , el código más corto gana (sujeto a los bonos enumerados al final de la pregunta).

Puede usar JugglingLab para jugar con patrones para ver si son válidos y cómo se ven.

Ejemplos

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.

Bonos

  • Si su respuesta puede manejar "dígitos" hasta 35, denotados por letras (10 = A, 11 = B, ...), reste 20 caracteres . Puede decidir si esas letras deben ser mayúsculas, minúsculas o mayúsculas y minúsculas. (JugglingLab puede manejarlos en minúsculas si desea ver algunos patrones locos).
  • Si su respuesta genera todas las soluciones válidas, reste 20 caracteres .
Martin Ender
fuente

Respuestas:

6

Python, 587-20 = 567 caracteres

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
fuente
Solo por curiosidad, ¿conoces la complejidad temporal de tu solución? Sin embargo, no se preocupe por explicar el algoritmo (todavía), para no estropear la diversión de otros que aún podrían estar intentándolo. ;)
Martin Ender
Creo que es algo así como L*n^(n*choose(n+11,n+2))dónde nestá la cantidad de comodines y Lla cantidad de caracteres en el patrón. No exactamente eficiente.
user1502040
Acabo de notar que estás contando en exceso en los casos que permiten permutaciones cíclicas (por ejemplo, 3 __tiene cada resultado dos veces, con los latidos intercambiados), pero supongo que es mi culpa por no especificar eso. Sin embargo, agregaré una cláusula para permitir omitirlos si eso ayuda a guardar bytes.
Martin Ender
Bueno, ¡ten una recompensa entonces! Parece que la pregunta era demasiado aburrida o desalentadora para todos los demás. ;)
Martin Ender