Жонглирование числами

20

Ваша задача - создать правильный шаблон жонглирования, заполнив данный шаблон. Но сначала вам, вероятно, нужно знать, как обозначается такой шаблон.

введите описание изображения здесь

Введение в Siteswap

Siteswap - установленная нотация для схем жонглирования. Это работает, разделяя образец в ударах. При каждом ударе ваша левая и правая рука чередуются при броске мяча. Каждый бросок (т. Е. Каждый удар) обозначается числом, которое указывает, когда этот мяч будет брошен следующим - это напрямую соответствует высоте броска.

Давайте посмотрим на некоторые примеры. Смотрите анимацию всего этого здесь .

3-шаровой каскад

Самый простой 3-мя шариками. Каждый мяч бросается при каждом третьем ударе (чередование рук). Запись ударов выглядит следующим образом (линии ASCII соединяют два удара, в которые бросается один и тот же шар):

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

Обратите внимание, как каждый шар, брошенный в Lтакт, бросается следующим в Rтакте. Паттерны смены сайтов повторяются неявно, поэтому этот паттерн обычно обозначается как 333, хотя просто 3также будет достаточно.

441

Вот немного более сложный пример с 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
         │ │ └─┘ │ │
         └─┼─────┘ │
           └───────┘

Обратите внимание, как броски с четными номерами идут в ту же руку, из которой они были брошены, в то время как броски с нечетными номерами переходят в другую руку.

423

Иногда вы просто хотите провести мяч, а не бросать его. Все это означает, что этот мяч бросается в следующий раз, когда наступает его ход, то есть через 2 удара. Таким образом, удержание мяча эквивалентно a 2в шаблоне:

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означает , что текущая рука пуста в том такте, так как это показывает шаблон:

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

Мультиплекс жонглирование

Эта проблема была бы слишком проста с использованием ванильных сайтов. Введите мультиплексные шаблоны! Мультиплексное жонглирование означает, что вы бросаете несколько шаров из одной руки одновременно. Например, в приведенном выше каскаде из 3 шаров, если бы вам было по два, бросайте дополнительный шар при каждом третьем ударе, паттерн [33]33получился бы следующим образом:

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

Вот еще один пример, где бросок мультиплекса имеет две разные высоты / длины. Это может быть обозначено как [34]11или [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
          ││  └─┴──┘│  │
          │└────────┘  │
          └────────────┘

(Обратите внимание, что бросок 1в ударе 2приземляется в ударе 3и сразу же бросается снова (как другой 1), чтобы приземлиться в ударе 4и стать частью второго мультиплексного броска.)

Смена мест для анимации в начале этого поста была [53]15121 .

Закономерность

Для того, чтобы шаблон был семантически действительным, количество шаров в руке должно всегда соответствовать количеству бросков, указанному в этом такте. Это означает, что не должно быть шаров, приземляющихся в такт с ударом 0, должен быть только один мяч, приземляющийся в такт с любой другой одной цифрой, и должно быть n шаров, приземляющихся в многократном ударе, где n - количество цифр в этом мультиплексном броске. Шаблон также должен иметь возможность повторяться без проблем.

Примерами недопустимых паттернов являются 543(все шары будут приземляться в одном и том же такте), 240(тот 2будет приземляться в 0такте) или 33[24](ни один шар не приземлится в мультиплексном такте, но два шара приземляются в обоих из двух других ударов).

Соревнование

Вы возьмете шаблон sitewap, который содержит символы подстановки, и выведете правильный шаблон с заполненными подстановочными знаками.

Принимать в качестве входных данных (через стандартный ввод, аргумент командной строки, файл или параметр функции) строку формата

n s

Где n- целое число, обозначающее количество используемых шариков, и sшаблон изменения мест ( без пробелов). Вы можете предположить, что это синтаксически правильно - все квадратные скобки совпадают и не являются вложенными, и в них нет неожиданных символов. Все броски будут однозначными ( 0- 9). Тем не менее , некоторые доли могут быть обозначены как a _, который должен быть заполнен одним или мультиплексным броском в выходных данных.

Примечание: что - то вроде [_3]будет не быть частью ввода. Или весь удар отсутствует, или весь удар дан.

Выведите действительный паттерн, который можно манипулировать с заданным количеством шаров и согласует с входным паттерном во всех указанных битах. Если с данными входами невозможен допустимый шаблон, выведите !. Вывод также будет через стандартный вывод, в файл или как возвращаемое значение функции.

Примечание: выходные данные не должны содержать ненужных квадратных скобок или нулей в мультиплексных бросках. Поэтому выходные данные, содержащие [3]или [03]не принятые, вы должны 3вместо этого выводить . Порядок цифр в броске мультиплекса не имеет значения.

Примечание: Вы можете опустить шаблоны, которые являются дубликатами при циклических перестановках. Например, для ввода 3 __(обратите внимание на два подстановочных знака), оба 42и 24являются допустимыми ответами (среди прочих), но на самом деле они описывают один и тот же шаблон. Вы можете выводить оба или только один из них, но вам придется делать это последовательно.

Это код гольф , выигрывает самый короткий код (с учетом бонусов, указанных в нижней части вопроса).

Вы можете использовать JugglingLab, чтобы поиграть с шаблонами, чтобы увидеть, являются ли они действительными и как они выглядят.

Примеры

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.

Бонусы

  • Если ваш ответ может обрабатывать «цифры» до 35, обозначенные буквами (10 = A, 11 = B, ...), вычтите 20 символов . Вы можете решить, должны ли эти буквы быть прописными, строчными или регистронезависимыми. (JugglingLab может обрабатывать их в нижнем регистре, если вы хотите посмотреть на некоторые безумные шаблоны.)
  • Если ваш ответ выводит все правильные решения, вычтите 20 символов .
Мартин Эндер
источник

Ответы:

6

Python, 587 - 20 = 567 символов

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
источник
Просто из любопытства вы случайно не знаете сложность своего решения во времени? Не беспокойтесь об объяснении алгоритма (пока), чтобы не испортить удовольствие тем, кто все еще пытается это сделать. ;)
Мартин Эндер
Я думаю, что это что-то вроде L*n^(n*choose(n+11,n+2))где nчисло подстановочных знаков и Lколичество символов в шаблоне. Не совсем эффективно.
user1502040
Я только что заметил, что вы переоцениваете случаи, которые допускают циклические перестановки (например, 3 __имеет каждый результат дважды, с заменой тактов), но я полагаю, что это скорее моя вина, что я не указал это. Я добавлю предложение, чтобы пропустить его, если это поможет сохранить байты.
Мартин Эндер
Ну, тогда щедрость! Кажется, вопрос был слишком скучным или слишком пугающим для всех остальных. ;)
Мартин Эндер