Twoim zadaniem jest wygenerowanie prawidłowego wzorca żonglerki poprzez wypełnienie danego szablonu. Najpierw jednak prawdopodobnie musisz wiedzieć, jak oznaczony jest taki wzór.
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 L
uderzeniu jest rzucana w następnym R
uderzeniu. Wzory wymiany stron powtarzają się domyślnie, więc ten wzór jest zwykle oznaczony jako 333
, chociaż po prostu 3
był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 2
z 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 0
oznacza, ż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]33
i 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]11
albo [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 1
wyrzucony w takcie 2
ląduje w takcie 3
i natychmiast jest ponownie rzucany (jako inny 1
), aby wylądować w takcie 4
i 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
( 2
wylądowałyby w 0
takcie) 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 n
jest liczbą całkowitą wskazującą liczbę piłek do użycia, i s
jest 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 3
zamiast 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 42
i 24
są 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 .
L*n^(n*choose(n+11,n+2))
gdzien
jest liczba symboli wieloznacznych iL
liczba znaków we wzorze. Niezupełnie wydajny.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.