To wyzwanie jest inspirowane tą odpowiedzią na Ask Ubuntu Stack Exchange.
Wprowadzenie
Pamiętasz wygaszacz ekranu Windows ME z potokami ? Czas przywrócić nostalgię!
Wyzwanie
Powinieneś napisać program lub funkcję, która wyświetli reprezentację wygaszacza ekranu ASCII. W wygaszaczu ekranu powinna znajdować się pojedyncza rura, która będzie rosła w pół losowych kierunkach.
Początek rury zostanie losowo umieszczony na dowolnej krawędzi ekranu, a element rury powinien być prostopadły do granicy (pierwsze narożne rury mogą być poziome lub pionowe). Przy każdym kleszczu rura będzie rosła w kierunku, w którym jest skierowana (poziomo / pionowo), przy 80%
okazji lub rzutu rożnego przy 20%
okazji.
Reprezentacja rur
Do utworzenia potoku zostanie użytych 6 znaków Unicode
─ \u2500 horizontal pipe
│ \u2502 vertical pipe
┌ \u250C upper left corner pipe
┐ \u2510 upper right corner pipe
└ \u2514 lower left corner pipe
┘ \u2518 lower right corner pipe
Wejście
Program / funkcja pobierze 3 wartości wejściowe, które można zebrać na podstawie parametrów funkcji lub zapytać użytkownika.
- Ilość kleszczy
- Szerokość ekranu
- Wysokość ekranu
Ilość kleszczy
Dla każdego tiku do ekranu zostanie dodany kawałek rury. Rury zastąpią stare elementy rur, jeśli odradzają się w tej samej pozycji.
Na przykład weź ekran o rozmiarze 3x3
ticks == 3
─┐
┘
ticks == 4
─┐
└┘
ticks == 5
│┐
└┘
Za każdym razem, gdy rura wychodzi z ekranu, jak w ostatnim przykładzie z 5 tyknięciami, nowa rura odradza się na losowej granicy. Na przykład:
ticks == 6
│┐
└┘
─
Nowa rura powinna mieć 50% szansy, że będzie pozioma lub pionowa.
Szerokość / wysokość ekranu
Szerokość i wysokość ekranu można połączyć w jedną wartość, jeśli jest to preferowane w wybranym języku. Szerokość i wysokość ekranu zawsze będą miały minimalną wartość 1 i maksymalną wartość 255. Jeśli wybrany język obsługuje ekran konsoli lub wyjścia, który jest mniejszy niż siatka znaków 255 x 255, możesz założyć, że szerokość i wysokość będą nigdy nie przekraczaj granic konsoli. (Przykład: okno systemu Windows 80x25 cmd)
Wynik
Dane wyjściowe programu / funkcji powinny zostać wydrukowane na ekranie lub zwrócone z funkcji. Dla każdego uruchomienia programu należy wygenerować inny zestaw potoków.
Przypadki testowe
Poniższe przypadki testowe są przypadkowymi przykładami prawidłowych wyników
f(4, 3, 3)
│
─┘
│
f(5, 3, 3)
│
─┘┌
│
f(6, 3, 3)
─│
─┘┌
│
f(7, 3, 3)
──
─┘┌
│
Oczywiście, im więcej tyknięć miało miejsce, tym trudniej jest udowodnić ważność twojego programu. Dlatego preferowane będzie opublikowanie gif z uruchomionym wyjściem. Jeśli nie jest to możliwe, proszę opublikować wersję kodu, która obejmuje wydruk danych wyjściowych. Oczywiście nie będzie to wliczane do twojego wyniku.
Zasady
- To jest golf golfowy , wygrywa najmniejsza ilość bajtów
- Obowiązują standardowe luki
- Jeśli użyjesz znaków potoku Unicode w kodzie źródłowym, możesz je policzyć jako jeden bajt
Jest to dość trudne wyzwanie, które można rozwiązać na wiele kreatywnych sposobów, zachęcamy do napisania odpowiedzi w bardziej szczegółowym języku, nawet jeśli odpowiedzi są już w krótkich esolangach. Spowoduje to utworzenie katalogu najkrótszych odpowiedzi dla każdego języka. Dodatkowe głosy za fantazyjne kolorowe gify;)
Miłej gry w golfa!
Uwaga: Zdaję sobie sprawę, że znaki Unicode nie są ASCII, ale ze względu na brak lepszej nazwy po prostu nazywam to sztuką ASCII. Sugestie są mile widziane :)
ascii-art
zamiastgraphical-output
- referencjaOdpowiedzi:
JavaScript (ES6), 264
266 274 281Liczenie znaków rysunkowych w Unicode jako 1 bajt każdy. (Jak określono przez OP)
Mniej golfa
Animowany test
Uwaga: starając się utrzymać czas animacji poniżej 30 sekund, więcej zagajników przyspiesza tempo animacji
źródło
Nic nie mówi o nostalgii tak jak ...
QBasic, 332 bajty
QBasic jest właściwym językiem dla tego zadania, ponieważ:
LOCATE
pozwala drukować w dowolnym miejscu na ekranie, zastępując to, co było wcześniejSpecyfika
To jest gra w golfa QBasic, napisana i przetestowana na QB64 z wyłączonym autoformatowaniem. Jeśli wpiszesz / wkleisz do rzeczywistego IDE QBasic, doda kilka spacji i rozszerzy
?
sięPRINT
, ale powinno działać dokładnie tak samo.Program wprowadza trzy wartości oddzielone przecinkami: tiki, szerokość i wysokość. Następnie prosi o ziarno o losowej liczbie. (Jeśli to zachowanie jest nie do przyjęcia, zmień drugą linię
RANDOMIZE TIMER
na +6 bajtów.) Na koniec rysuje rury na ekranie.Maksymalne wymiary, które można wprowadzić, to 80 (szerokość) na 25 (wysokość). Podanie wysokości 25 spowoduje odcięcie dolnego rzędu, gdy QBasic powie „Naciśnij dowolny klawisz, aby kontynuować”.
W jaki sposób?
TL; DR: Dużo matematyki.
Bieżącym wierszem i kolumną są
r
ic
; obecny kierunek tod
i poprzedni kierunek tob
. Wartości kierunku 0-3 są w dół, w prawo, w górę, w lewo. Arytmetyka przekłada te wartości na poprawne wartości kroku dlar
orazc
, a także na prawidłowe współrzędne krawędzi na początku.Znaki rysujące ramki
│┐└─┘┌
to punkty kodowe 179, 191, 192, 196, 217 i 218 w QBasic. Wydają się dość losowe, ale nadal używało mniej znaków do generowania liczb z pewną matematyką (dość skomplikowaną, nie jestem pewien, a nawet rozumiem) niż do wykonywania szeregu instrukcji warunkowych.Kod zmiany kierunku generuje liczbę losową z przedziału od -0,125 do 1,125 i zabiera głos. To daje
-1
10% czasu,0
80% czasu i1
10% czasu. Następnie dodajemy to do bieżącej wartościd
mod 4. Dodanie 0 utrzymuje bieżący kierunek; dodanie +/- 1 powoduje zwrot.Jeśli chodzi o przepływ kontrolny,
WHILE t ... WEND
jest to główna pętla; sekcja przed nim, zaczynająca się od numeru linii1
(1b=INT(RND*4)
), ponownie uruchamia potok na losowej krawędzi. Ilekroćr
ic
są poza okno, myGOTO 1
.Pokaż mi GIF!
Proszę bardzo:
Zostało to wygenerowane przez nieco nie golfową wersję z animacją, kolorem i automatycznym losowym ziarnem:
źródło
Python 2.7,
624616569548552 bajtówPierwszy parametr to ziarno, te same nasiona wygenerują tę samą moc wyjściową, drukując każdy krok z opóźnieniem 500 ms.
zastąp to
Przykładowy przebieg
wyjdzie
pełna wersja
źródło
if x*y<0 or
.0.5
można zredukować do.5
.import *
może byćimport*
.''.join(k) for
ma bezużyteczne białe znaki. Powinieneś także mieć możliwość przechowywaniadict
zmiennej i wywoływania jej za każdym razem, gdy z niej korzystasz. Nie testowałem, ile to oszczędza, ale zapisującdict(zip(a,b))
lambda, która wykonuje pracę dla dwóch łańcuchów (a, b), powinno trochę posiekać. +1.C (GCC / linux),
402353352302300298296288 bajtówPodziękowania dla edc65 za zapisanie kierunku w jednym 4-bitowym numerze.
Odczytuje szerokość / wysokość na stdin przed zapętleniem wygaszacza ekranu na zawsze. Na przykład:
Lub dla wygaszacza ekranu na pełnym ekranie:
Dla czytelności dodałem nowe linie. Wymaga maszyny linux z terminalem respektującym kody ANSI. Ma kolory! Usunięcie obsługi kolorów kosztuje 17 bajtów mniej.
źródło
Rubinowy,
413403396 bajtówFunkcja, która pobiera liczbę tyknięć i szerokość jako dane wejściowe i zwraca ostatni ekran jako ciąg znaków. Bez wątpienia można grać w golfa więcej.
Zobacz na repl.it: https://repl.it/Db5h/4
Aby zobaczyć to w akcji, wstaw następujący wiersz po linii, która się zaczyna
b[n*w+n+m]=
:... następnie przypisz lambda do zmiennej np.
pipes=->...
i nazwij ją takpipes[100,20]
(dla 100 tyknięć i ekranu 20x20).Nie golf i wyjaśnienia
źródło