Mieszkasz w terminalu o szerokości 80 znaków. Jesteś znudzony, więc decydujesz się na grę w domino. Nie, nie nudny rodzaj, który wygląda jak Scrabble, zabawny rodzaj, w którym spędzasz godzinę, ustawiając je, aby patrzyły, jak upadają w sekundę.
Domina w terminalach wyglądają tak:
| upright domino
\ left-tilted domino
/ right-tilted domino
__ fallen domino
Jak wszyscy wiemy, jeśli przechylone domino dotknie pionowego, drugie domino również zostanie przechylone. Jedynym wyjątkiem jest sytuacja, gdy dotkną go dwa przechylone domino:
|\ --> \\ /| --> // /|\ --> /|\
Dostosuj stałą grawitacyjną terminala, aby przejście to trwało 100 ms.
Jeśli przechylone domino jest obsługiwane przez inne domino lub ściany terminala, jego podróż się kończy.
Żadne z przechylonych domino w
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
Przesuną się (80 znaków), ponieważ dwa skrajnie nachylone domino są obsługiwane przez ściany terminala, a wszystkie inne są obsługiwane przez inne domino.
Jeśli jednak przestrzeń w kierunku przechylania jest pusta, domino spada:
| \\ --> |__\ // | --> /__|
Terminal. Stała grawitacyjna. Dostajesz punkt…
Wreszcie, po lewej stronie jest lekki wiatr, więc domina przechylone w prawo spadają szybciej niż domina pochylone:
|/ \| --> |__\|
Zadanie
Napisz program / funkcję, która pokazuje animację gry w domino w terminalu.
Twój kod powinien wykonać następujące czynności:
Odczytaj ciąg wejściowy reprezentujący początkowy stan domina.
Ciąg ten będzie zawierał nie więcej niż 80 znaków i będzie składał się wyłącznie z domino opisanych powyżej i pustych spacji.
Wydrukuj stan i poczekaj 100 ms.
Przekształć stan, jak wyjaśniono powyżej.
Jeśli stan się zmienił, wróć do 2.
Dodatkowe zasady
Długość ciągu wejściowego nie wpływa na szerokość terminala; nawet jeśli ciąg znaków jest krótszy niż 80 znaków, ściany terminala wciąż są od siebie oddalone o 80 znaków.
Za każdym razem, gdy wykonywany jest krok 2, stan powinien zostać wydrukowany w tej samej lokalizacji, zastępując poprzedni stan.
Ponieważ niektóre języki nie są w stanie czekać dokładnie 100 ms, możesz poczekać dowolną ilość między 50 a 1000 ms.
Obowiązują standardowe zasady gry w golfa .
Przykłady
Dla stanu początkowego
||\/||
wydrukuj następujące (jeden na drugim):
||\/|| |\\//| \\\/// __\\//__
Dla stanu początkowego
/||||\
wydrukuj następujące
/||||\ //||\\ ///\\\
Dla stanu początkowego
/|||\
wydrukuj następujące
/|||\ //|\\
Dla stanu początkowego
|/ \|/ \|/ \|/ \|
wydrukuj następujące:
|__\|__\|__\|__\|
Dla stanu początkowego (80 znaków)
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
wydrukuj następujące
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
/
lub,/|
a zobaczysz, że kafelek nie spada całkowicie tak, jak powinien.\033
literalnym bajtem ESC, oszczędzając 3 bajty.Perl 5,
154146Musiał użyć postaci tymczasowej, aby utrzymać stan między 2 wyrażeniami regularnymi.
Aby poradzić sobie z ryzykiem, że coś takiego / | | | \ skończyłby jako / / / \ \ zamiast / / | \ \.
Test
źródło
s, \\|/ ,__,g
Zamiasts/ \\|\/ /__/g
.ES6 ,
220218195 bajtówZminimalizowane
Bardziej czytelny
źródło
() = > {
i}()
można po prostu usunąć z kodu. 2. Nie sądzę, aby pola alertów były akceptowalnym formatem wyjściowym animacji. Możesz albo osadzić JS w HTML, albo wprowadzić wymaganą zmianę, aby działała z wiersza poleceń. 3. W obu przypadkach kod musi czekać ok. 100 ms między drukowaniem jednego stanu a drugim.console.log("^[c"+d)
zamiast tego, gdzie^[
jest znak ESC (jeden bajt)..replace
na[R='replace']
, a następnie każdy następny na[R]
, spowoduje to znaczne zmniejszenie. Możesz również zapisać kilka bajtów, używającsetTimeout(f,100,d)
zamiast bieżącej konfiguracji.C #, 335 bajtów
Niezły wybór języka.
Nadużyłem dozwolonego opóźnienia między 50 a 1000, aby wybrać dwucyfrową liczbę.
Dodano nowe linie i wcięcia dla przejrzystości:
źródło
PHP, 175 bajtów
Nie zminimalizowane:
Zasadniczo regex golf. Najpierw spłaszcza spadające domino, które mają miejsce (a ze względu na kolejność dopasowywania od lewej do prawej, wieje „wiatr”). Potem pojawia się brzydka część (przeklnij cię!)
/|\
, a następnie pomiń.(/)|
i zamień na//
|(\)
i zamień na\\
To powoduje, że domina spadają. Na koniec poczekaj 100 ms na następny krok.
Użycie
()
ograniczników w wyrażeniu regularnym oznacza, że/
nie trzeba uciekać, co pomaga minimalnie!źródło
Powłoka POSIX + sed, 144
Jest to w dwóch częściach. Główną pracą polegającą na obaleniu domina jest standardowe
sed
zastępowanie wzorów, gromadzenie linii w przestrzeni ładunkowej. Tymczasowo się odwracamy/|\
się,/:\
aby go chronić, odzyskując na końcu.Ponieważ
sed
nie ma żadnego sposobu wstawiania opóźnień (szukałem terminfo / termcap, ale nie mogłem znaleźć żadnego standardowego sposobu), zawijam każdą linię,printf "...\r"; sleep .1
aby drukować linię co 100 ms. Robię to najpierw, gdy mamy tylko jedną linię, ponieważ znaki w poleceniu nie zostaną dotknięte żadną z podstawień toppingu.Wszystkie testowane przy użyciu
dash
i GNUcoreutils
, zPOSIXLY_CORRECT
ustawieniem w środowisku.źródło