Жонглювання цифрами


20

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

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

Вступ до веб-сайтів

Зміна сайтів - це усталене позначення для моделей жонглювання. Це працює, поділяючи візерунок на ритми. При кожному ударі ліва і права рука чергуються при киданні м'яча. Кожен кидок (тобто кожен удар) позначається числом, яке вказує, коли цей м'яч буде кинутий далі - це відповідає безпосередньо висоті кидка.

Давайте розглянемо кілька прикладів. Дивіться анімацію про все це тут .

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

Ось дещо складніший приклад із веб-сайтом 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 удари пізніше. Тож тримання м'яча еквівалентно 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

Це 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](жодна куля не припадає на мультиплексний такт, але два кулі приземлюються при обох двох ударах).

Змагання

Ви візьмете шаблон заміни сайтів, який містить подстановочні символи, і виведете дійсний шаблон із заповненням цих марок.

Візьміть за вхід (через stdin, аргумент командного рядка, параметр файла або функції) рядок формату

n s

Де nє ціле число, яке вказує кількість кульок, які будуть використовуватися, і sє шаблоном заміни сайтів ( без пробілів). Ви можете припустити, що це синтаксично правильно - всі квадратні дужки зібрані і не вкладені, і несподіваних символів немає. Усі кидки будуть одноцифровими ( 0- 9). Однак деякі удари можуть просто позначатися як a _, які слід заповнити одним або мультиплексним кидком на виході.

Примітка: що - щось на зразок [_3]буде НЕ бути частиною введення. Або весь такт відсутній, або весь такт.

Виведіть дійсний візерунок, який можна змішати з заданою кількістю куль і узгодити з вхідним малюнком у всіх заданих ударах. Якщо для заданих входів неможливий дійсний зразок, виведіть !. Вихід також буде через stdout, у файл або як повернене значення функції.

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

Примітка. Ви можете опустити шаблони, що є дублікатами під циклічною перестановкою. Напр. Для введення даних 3 __(зверніть увагу на два підмітні знаки), обидва 42і 24є дійсними відповідями (серед інших), але вони фактично описують ту саму схему. Ви можете вивести обидва або тільки один з них, але вам доведеться це робити послідовно.

Це кодовий гольф , виграє найкоротший код (залежно від бонусів, зазначених у нижній частині питання).

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

Приклади

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 = А, 11 = В, ...), відніміть 20 символів . Ви можете вирішити, чи повинні ці літери бути великими, малими та малими літерами. (JuggleLab може впоратися з ними в малих регістру, якщо ви хочете переглянути деякі шалені моделі.)
  • Якщо ваша відповідь виводить усі дійсні рішення, відніміть 20 символів .

Відповіді:


6

Пітона, 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.