Żonglowanie liczbami

20

Twoim zadaniem jest wygenerowanie prawidłowego wzorca żonglerki poprzez wypełnienie danego szablonu. Najpierw jednak prawdopodobnie musisz wiedzieć, jak oznaczony jest taki wzór.

wprowadź opis zdjęcia tutaj

Wprowadzenie do Sitewap

Sitewap to ustalona notacja dotycząca wzorców żonglerki. Działa, dzieląc wzór na uderzenia. Za każdym uderzeniem lewa i prawa ręka naprzemiennie rzucają piłkę. Każdy rzut (tj. Każde uderzenie) jest oznaczony liczbą wskazującą, kiedy ta piłka zostanie rzucona jako następna - odpowiada to bezpośrednio wysokości rzutu.

Spójrzmy na kilka przykładów. Zobacz animacje wszystkich z nich tutaj .

Kaskada z 3 piłkami

Najprostszy wzór z 3 kulkami. Każda piłka jest rzucana co trzecie uderzenie (na przemian ręce). Zapisywanie uderzeń wygląda następująco (linie ASCII łączą dwa uderzenia, w które rzucana jest ta sama piłka):

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

Zwróć uwagę, jak każda piłka rzucana w jednym Luderzeniu jest rzucana w następnym Ruderzeniu. Wzory wymiany stron powtarzają się domyślnie, więc ten wzór jest zwykle oznaczony jako 333, chociaż po prostu 3byłby wystarczający.

441

Oto nieco bardziej skomplikowany przykład z mapą witryn 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
         │ │ └─┘ │ │
         └─┼─────┘ │
           └───────┘

Zwróć uwagę, jak rzuty parzyste trafiają do tej samej ręki, z której zostały rzucone, a rzuty nieparzyste przechodzą do drugiej ręki.

423

Czasami chcesz po prostu trzymać piłkę w takcie zamiast rzucać nią. Wszystko to oznacza, że ​​ta piłka zostanie rzucona następnym razem w turze tej ręki - tj. 2 uderzenia później. Więc trzymanie piłki jest równoważne 2z wzorem:

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 0oznacza, że ​​bieżąca ręka jest pusta w tym takcie, ponieważ ten wzór pokazuje:

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

Żonglerka multipleksowa

Ten problem byłby jednak nieco zbyt prosty w przypadku waniliowej zamiany witryn. Wprowadź wzory multipleksów! Żonglerka multipleksowa oznacza, że ​​rzucasz wieloma piłkami jednocześnie z jednej ręki. Na przykład, w powyższej kaskadzie 3-piłkowej, gdybyście mieli dwa rzuty dodatkową piłką przy co trzecim uderzeniu, wzór wyglądałby [33]33i wyglądałby tak:

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

Oto kolejny przykład, w którym rzut multipleks ma dwie różne wysokości / długości. To może być oznaczona jako albo [34]11albo [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
          ││  └─┴──┘│  │
          │└────────┘  │
          └────────────┘

(Zwróć uwagę, że 1wyrzucony w takcie 2ląduje w takcie 3i natychmiast jest ponownie rzucany (jako inny 1), aby wylądować w takcie 4i być częścią drugiego rzutu multipleksowego.)

Mapa strony dla animacji na początku tego postu była [53]15121 .

Ważność wzoru

Aby wzorzec był semantycznie ważny, liczba piłek w ręce musi zawsze odpowiadać liczbie rzutów wskazanej przy tym uderzeniu. Oznacza to, że nie może być żadnej piłki lądującej w rytmie za pomocą 0, musi być tylko jedna piłka lądującej w takcie z dowolną inną pojedynczą cyfrą, i musi być n piłek lądujących w rytmie multipleksowym, gdzie n jest liczbą cyfr w tym rzucie multipleksowym. Wzór musi być również w stanie płynnie się powtarzać.

Przykładami nieprawidłowych wzorów są 543(wszystkie piłki wylądowałyby w tym samym uderzeniu), 240( 2wylądowałyby w 0takcie) lub 33[24]((żadna piłka nie wylądowałaby w takcie multipleksowym, ale dwie piłki wylądowały w obu pozostałych dwóch uderzeniach).

Wyzwanie

Weźmiesz wzorzec zamiany witryn, który zawiera symbole wieloznaczne i wyśle ​​prawidłowy wzorzec, z wypełnionymi tymi symbolami wieloznacznymi.

Weź jako dane wejściowe (przez stdin, argument wiersza poleceń, parametr pliku lub funkcji) ciąg formatu

n s

Gdzie njest liczbą całkowitą wskazującą liczbę piłek do użycia, i sjest wzorem zamiany stron ( bez białych znaków). Możesz założyć, że jest poprawna pod względem składniowym - wszystkie nawiasy kwadratowe są dopasowane, a nie zagnieżdżone, i nie ma nieoczekiwanych znaków. Wszystkie rzuty będą rzutami jednocyfrowymi ( 0- 9). Jednak niektóre uderzenia można po prostu oznaczyć jako a _, które ma być wypełnione rzutem pojedynczym lub multipleksowym na wyjściu.

Uwaga: coś [_3]będzie nie być częścią wejścia. Brakuje całego rytmu lub cały bit jest podany.

Wyprowadza prawidłowy wzorzec, który można żonglować z podaną liczbą piłek i jest zgodny ze wzorcem wejściowym we wszystkich określonych uderzeniach. Jeśli dla podanych danych wejściowych nie jest możliwy prawidłowy wzorzec, wyjście !. Dane wyjściowe będą również przesyłane przez stdout, do pliku lub jako wartość zwracana przez funkcję.

Uwaga: Dane wyjściowe nie mogą zawierać niepotrzebnych nawiasów kwadratowych ani zer w rzutach multipleksowych. Więc dane wyjściowe zawierające [3]lub [03]nie są akceptowane, musisz 3zamiast tego wygenerować. Kolejność cyfr w rzucie multipleksowym nie ma znaczenia.

Uwaga: Ty może pominąć wzory, które są duplikaty pod permutacje cykliczne. Np dla wejścia 3 __(uwaga dwa symbole wieloznaczne), oba 42i 24są poprawne odpowiedzi (między innymi), ale faktycznie opisują ten sam wzór. Możesz wydrukować oba lub tylko jeden z nich, ale musisz to robić konsekwentnie.

To jest kod golfowy , wygrywa najkrótszy kod (z zastrzeżeniem bonusów wymienionych na dole pytania).

Możesz użyć JugglingLab do zabawy z wzorami, aby sprawdzić, czy są one prawidłowe i jak wyglądają.

Przykłady

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.

Bonusy

  • Jeśli Twoja odpowiedź może obsłużyć „cyfry” do 35, oznaczone literami (10 = A, 11 = B, ...), odejmij 20 znaków . Możesz zdecydować, czy te litery powinny być duże, małe czy niewrażliwe na wielkość liter. (JugglingLab może obsługiwać je małymi literami, jeśli chcesz przyjrzeć się szalonym wzorom).
  • Jeśli Twoja odpowiedź zawiera wszystkie prawidłowe rozwiązania, odejmij 20 znaków .
Martin Ender
źródło

Odpowiedzi:

6

Python, 587-20 = 567 znaków

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"!"
użytkownik1502040
źródło
Czy z ciekawości znasz złożoność czasową swojego rozwiązania? Nie martw się jednak wyjaśnieniem algorytmu (jeszcze), aby nie zepsuć zabawy innym, którzy mogą próbować. ;)
Martin Ender
Myślę, że jest to coś w rodzaju, L*n^(n*choose(n+11,n+2))gdzie njest liczba symboli wieloznacznych i Lliczba znaków we wzorze. Niezupełnie wydajny.
user1502040
Właśnie zauważyłem, że przeliczysz się w przypadkach, które pozwalają na cykliczne permutacje (np. 3 __Każdy wynik ma dwa razy, z zamienionymi bitami), ale przypuszczam, że to raczej moja wina, że ​​nie sprecyzowałem tego. Dodam jednak klauzulę, aby pozwolić na ich pominięcie, jeśli pomoże to zaoszczędzić bajty.
Martin Ender,
Cóż, więc zdobądź nagrodę! Wygląda na to, że pytanie było zbyt nudne lub zniechęcające dla wszystkich innych. ;)
Martin Ender