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.
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 L
batida são lançadas a seguir em uma R
batida. Os padrões de deslocamento do site repetem-se implicitamente; portanto, esse padrão é geralmente indicado como 333
, embora simplesmente 3
també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 2
no 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 0
significa 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]33
assim:
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]11
ou [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 1
arremesso na batida é 2
acertado na batida 3
e é imediatamente jogado novamente (como outro 1
) para acertar a batida 4
e 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 2
pousaria na 0
batida) 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 42
e 24
sã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 .