Być może widziałeś drabinę Jakuba w muzeach nauki dla dzieci. Jeśli nie znasz ich wyglądu, na Wikimedia Commons znajduje się kilka zdjęć i przykładów wideo . Dzisiejsze wyzwanie polega na stworzeniu animowanej wersji gadżetu elektrycznego ASCII. Ostatecznie powinien wyglądać mniej więcej tak:
Konstrukcja drabiny
Oto podstawowy kształt drabiny o wysokości ( H ) 6:
6 \ /
5 \ /
4 \ /
3 \ /
2 \ /
1 \ /
0 ¯¯
Liczby po lewej wskazują po prostu numer wiersza dla tego przykładu i nie powinny być uwzględniane w danych wyjściowych. Odniesiemy się do danego wiersza po jego numerze ( R ). Wiersz 0 jest na dole ¯¯
. Każdy rząd od 1 do H składa się z czterech części:
- Spacja
(U + 0020) powtórzona ( H - R ) razy
\
Cięcie z tyłu (U + 005C)- Spacja
(U + 0020) powtórzona (2 * R ) razy
/
Cięcie do przodu (U + 002F)
Wiersz 0 jest identyczny, z wyjątkiem tego, że oba ukośniki zostały zastąpione makronem ¯
(U + 00AF). Końcowe białe znaki na końcu każdej linii lub pod drabiną są w porządku. Wiodące białe znaki nie są.
Konstrukcja łuku
Po zbudowaniu drabiny możesz tworzyć łuki między lewą i prawą stroną. Jeden łuk znajduje się całkowicie w rzędzie i zastępuje odstępy między prowadzącym \
a końcowym /
. Dlatego rząd 2 będzie miał 4 znaki w swoim łuku, rząd 3 będzie miał 6 i tak dalej. Każdy łuk składa się według następujących zasad:
- Jedynymi dozwolonymi znakami są
_/¯\
(U + 005F, U + 002F, U + 00AF, U + 005C) - Aby zapewnić gładki wygląd, po którymkolwiek
¯
lub/
musi następować¯
lub\
- Aby zapewnić gładki wygląd, po którymkolwiek
_
lub\
musi następować_
lub/
- Dwie powyższe zasady dotyczą również krawędzi drabiny
- Trzy powyższe zasady skutecznie oznaczają, że pierwszy znak na łuku musi być
_
lub,/
a ostatni znak musi być_
lub\
(\¯\_//
jest nieprawidłowy na obu końcach, ale\_/¯\/
jest OK) - Musi istnieć niezerowa szansa, aby każda dopuszczalna postać pojawiła się w danym punkcie
- Każdy łuk jest niezależny od każdego innego
Animacja
Żywotność pojedynczego łuku jest tworzona przez rozpoczęcie go w pierwszym rzędzie i „przesunięcie” go w górę o jeden rząd na raz, aż osiągnie szczyt. IE, najpierw wygeneruj łuk w rzędzie 1, następnie ustaw go z powrotem w spacje i wygeneruj łuk w rzędzie 2 i tak dalej. Biorąc pod uwagę liczbę łuków do pokazania ( N ), pokaż pełne życie wielu łuków pojedynczo, stosując następujące wytyczne:
- Tylko jeden łuk powinien być jednocześnie „żywy”. Następny łuk nie może rozpocząć się, dopóki bieżący nie osiągnie szczytu, a następnie nie zgaśnie.
- Każdy rząd okresu łuku powinien być pokazany dla dokładnie jednej klatki
- Przed rozpoczęciem nowego łuku powinna być jedna rama tylko podstawowej drabiny (bez łuków) (opcjonalnie przed pierwszym łukiem)
- Animacja powinna pokazywać pełne życie N łuków. Jeśli N = 0, powinien animować losowe łuki na zawsze, aż do zatrzymania.
- Jeśli N > 0, możesz nadal zapętlać animację na zawsze, ale musi to być pętla tych samych łuków w kółko. (Przykładowy GIF na górze tego postu ma H = 6 i N = 3, ale zapętla się na zawsze.)
- Animacja powinna odbywać się w miejscu. Oznacza to, że każda ramka powinna całkowicie zastąpić następną ramkę i znajdować się w tym samym miejscu.
- Długość każdej klatki może być dowolna, ale umożliwia oglądanie jej przez człowieka (IE, należy kierować się zdrowym rozsądkiem: niedopuszczalne są zarówno 0,01 s / ramka, jak i 30 s / ramka).
Wejście wyjście
- Dane wejściowe i wyjściowe mogą być w dowolnym standardowym formacie
- Możesz wyeksportować plik GIF, napisać tekst na ekranie, wydrukować pojedynczy plik dla każdej klatki lub w inny rozsądny sposób
- Standardowe luki są zabronione
- Wysokość drabiny H będzie dodatnią liczbą całkowitą
- Liczba łuków pokazujących N będzie nieujemną liczbą całkowitą
- Zarówno H, jak i N są przyjmowane jako dane wejściowe w dowolnej kolejności, którą wybierzesz (w odpowiedzi podaj kolejność)
Warunki wygranej
To jest golf golfowy, więc wygrywa najkrótszy kod.
the first character in the arc must be _ or / and the last character must be _ or \
i There must be a non-zero chance for each allowable character to occur at a given point
. Aby być symetrycznym, zarówno pierwsza, jak i ostatnia postać musiałyby być za _
każdym razem, co oznacza, że nie ma żadnej szansy na wystąpienie ani jednego, /
ani „\”.