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


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

Просто из любопытства вы случайно не знаете сложность своего решения во времени? Не беспокойтесь об объяснении алгоритма (пока), чтобы не испортить удовольствие тем, кто все еще пытается это сделать. ;)
Мартин Эндер

Я думаю, что это что-то вроде L*n^(n*choose(n+11,n+2))где nчисло подстановочных знаков и Lколичество символов в шаблоне. Не совсем эффективно.
user1502040

Я только что заметил, что вы переоцениваете случаи, которые допускают циклические перестановки (например, 3 __имеет каждый результат дважды, с заменой тактов), но я полагаю, что это скорее моя вина, что я не указал это. Я добавлю предложение, чтобы пропустить его, если это поможет сохранить байты.
Мартин Эндер

Ну, тогда щедрость! Кажется, вопрос был слишком скучным или слишком пугающим для всех остальных. ;)
Мартин Эндер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.