Malabarismo por números


20

Sua tarefa é gerar um padrão de malabarismo válido, preenchendo um determinado modelo. Mas primeiro, você provavelmente precisa saber como esse padrão é indicado.

insira a descrição da imagem aqui

Introdução ao Siteswap

Siteswap é a notação estabelecida para padrões de malabarismo. Ele funciona dividindo o padrão em batidas. A cada batida, sua mão esquerda e direita se alternam ao arremessar uma bola. Cada arremesso (ou seja, cada arremesso) é indicado por um número que indica quando a bola é lançada em seguida - isso corresponde diretamente à altura do arremesso.

Vejamos alguns exemplos. Veja animações de tudo isso aqui .

Cascata de 3 bolas

O padrão mais simples de 3 bolas. Cada bola é lançada a cada terceiro tempo (mãos alternadas). Escrevendo as batidas, é o seguinte (as linhas ASCII conectam duas batidas nas quais a mesma bola é lançada):

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 como todas as bolas lançadas em uma Lbatida são lançadas a seguir em uma Rbatida. Os padrões de deslocamento do site repetem-se implicitamente; portanto, esse padrão é geralmente indicado como 333, embora simplesmente 3também seja suficiente.

441

Aqui está um exemplo um pouco mais complicado com o 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
         │ │ └─┘ │ │
         └─┼─────┘ │
           └───────┘

Observe como os lances com números pares vão para a mesma mão da qual foram lançados, enquanto os lances com números ímpares vão para a outra mão.

423

Às vezes, você só quer segurar uma bola em uma batida em vez de jogá-la. Tudo isso significa que esta bola é lançada na próxima vez que for a vez dessa mão - ou seja, 2 batidas depois. Então, segurar uma bola é equivalente a a 2no padrão:

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 a mão atual está vazia nesse momento, pois esse padrão mostra:

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

Malabarismo Multiplex

Esse problema seria um pouco simples demais com o vanilla siteswap. Digite padrões multiplex! Malabarismo multiplex significa que você joga várias bolas de uma mão ao mesmo tempo. Por exemplo, na cascata de 3 bolas acima, se você jogasse uma bola adicional a cada terceira batida, o padrão se tornaria [33]33assim:

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

Aqui está outro exemplo, onde o lance multiplex tem duas alturas / comprimentos diferentes. Pode ser indicado como [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
          ││  └─┴──┘│  │
          │└────────┘  │
          └────────────┘

(Observe que o 1arremesso na batida é 2acertado na batida 3e é imediatamente jogado novamente (como outro 1) para acertar a batida 4e fazer parte do segundo arremesso multiplex.)

O sitewap para a animação no início desta postagem foi [53]15121 .

Validade do Padrão

Para que um padrão seja semanticamente válido, o número de bolas em uma mão deve sempre corresponder ao número de jogadas indicado nesse tempo. Isso significa que não deve haver bolas pousando em uma batida com a 0, deve haver apenas uma bola pousando em uma batida com qualquer outro dígito único e deve haver n bolas pousando em uma batida multiplex, onde n é o número de dígitos nesse lance multiplex. O padrão também deve poder repetir sem problemas.

Exemplos de padrões inválidos são 543(todas as bolas pousariam na mesma batida), 240(a bola 2pousaria na 0batida) ou 33[24](nenhuma bola caíra na batida multiplex, mas duas bolas batiam nas duas outras batidas).

O desafio

Você adotará um padrão de siteswap que contém curingas e emitirá um padrão válido, com os curingas preenchidos.

Tome como entrada (via stdin, argumento da linha de comando, arquivo ou parâmetro de função) uma string do formato

n s

Onde né um número inteiro indicando o número de bolas a serem usadas e sé um padrão de siteswap ( sem espaço em branco). Você pode assumir que está sintaticamente correto - todos os colchetes são correspondidos e não aninhados e não há caracteres inesperados. Todos os lançamentos serão de um dígito ( 0- 9). No entanto , algumas batidas podem ser apenas indicadas como a _, que devem ser preenchidas com uma única ou multiplexada na saída.

Nota: algo como não[_3] fará parte da entrada. A batida inteira está faltando ou a batida inteira é dada.

Emita um padrão válido, que pode ser manipulado com o número especificado de bolas e concorda com o padrão de entrada em todas as batidas especificadas. Se nenhum padrão válido for possível com as entradas fornecidas, produza !. A saída também será via stdout, para um arquivo ou como um valor de retorno da função.

Nota: A saída não deve conter colchetes ou zeros desnecessários em jogadas multiplex. Portanto, as saídas que contêm [3]ou [03]não são aceitas, você precisa produzir 3. A ordem dos dígitos em um lançamento multiplex não é relevante.

Nota: Você pode omitir padrões duplicados sob permutações cíclicas. Por exemplo, para entrada 3 __(observe os dois caracteres curinga), ambos 42e 24são respostas válidas (entre outros), mas eles realmente descrevem o mesmo padrão. Você pode produzir ambos ou apenas um deles, mas precisará fazê-lo de forma consistente.

Este é o código de golfe , o código mais curto vence (sujeito aos bônus listados na parte inferior da pergunta).

Você pode usar o JugglingLab para brincar com os padrões e verificar se eles são válidos e como são.

Exemplos

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.

Bónus

  • Se sua resposta puder manipular "dígitos" até 35, denotada por letras (10 = A, 11 = B, ...), subtraia 20 caracteres . Você pode decidir se essas letras devem ser maiúsculas, minúsculas ou sem distinção entre maiúsculas e minúsculas. (O JugglingLab pode manipulá-los em letras minúsculas se você quiser ver alguns padrões insanos.)
  • Se sua resposta gerar todas as soluções válidas, subtraia 20 caracteres .

Respostas:


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"!"

Por curiosidade, você conhece a complexidade do tempo da sua solução? Não se preocupe em explicar o algoritmo (ainda), para não estragar a diversão para outras pessoas que ainda possam estar tentando. ;)
Martin Enders

Eu acho que é algo como L*n^(n*choose(n+11,n+2))onde nestá o número de curingas e Lo número de caracteres no padrão. Não é exatamente eficiente.
precisa saber é o seguinte

Acabei de notar que você está contando demais nos casos que permitem permutações cíclicas (por exemplo, 3 __tem todos os resultados duas vezes, com as batidas trocadas), mas suponho que isso seja minha culpa por não especificar isso. Vou adicionar uma cláusula para permitir omiti-las, se isso ajudar a salvar bytes.
Martin Ender

Bem, tenha uma recompensa então! Parece que a pergunta era muito chata ou assustadora para todos os outros. ;)
Martin Ender
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.