Ta konkurencja się skończyła. Dzięki za interesujące wpisy nie esolang i gratulacje dla Jakuje za jego zwycięskie zgłoszenie JavaScript.
W wielkiej tradycji ASCII Art Challenges na tej stronie, oto kolejna. Biorąc pod uwagę wkład, narysuj spiralę.
&>----v
||>--v|
|||>v||
|||@|||
||^-<||
|^---<|
^-----<
Proste, tak? Heh, heh, heh ... Tak ...
(Zainspirowany postem ASCII Dragons Curve i postami Optymalizatora ASCII Art of the Day )
Wkład
Dane wejściowe będą miały postać szeregu parametrów, zaczerpniętych ze zwykłego argumentu STDIN / function / itd., Niezależnie od języka, który składa się z czterech części. Częściami tymi mogą być cztery oddzielne argumenty, poczwórny, tablica wielkości 4 itd. Dla uproszczenia i spójności podczas wyzwania przedstawię dane wejściowe jako pojedyncze słowo.
- Liczba całkowita
2 ≤ x ≤ 20
określająca rozmiar spirali w kategoriach „kwadratów”, przy czym każdy drukowany znak reprezentuje jeden „kwadrat”. Teoretycznie może to być ogromny zasięg, ale biorąc pod uwagę, że rysujemy grafikę ASCII, bezpiecznym górnym limitem będzie 20, aby pasowała dość przyzwoicie na ekranie. - Pojedyncza litera
d u r
lubl
, wskazująca początkowy ruch od początkowego „kwadratu” (w dół, w górę, w prawo, w lewo). - Opcjonalny
c
, oznaczający „przeciwnie do ruchu wskazówek zegara”. Jeślic
pominięto, załóż, że spirala obraca się zgodnie z ruchem wskazówek zegara. - Końcowa liczba całkowita,
1 ≤ y ≤ 10
która określa liczbę powtórzeń rysunku spirali, wykorzystując wykończenie „kwadratu” poprzedniej spirali jako „kwadrat” początkowy nowej. Wybieram górną granicę 10, ponieważ chcę, aby rysunek zakończył się w pewnym momencie. - Kilka przykładowych danych wejściowych:
20lc5
13d2
2rc1
Co ciekawe, należy pamiętać, że nieparzyste wartości dla wielkości wejściowej powodują, że @
zawsze będzie to dokładny środek spirali, ale nawet wartości mogą mieć początkowe przesunięcie „kwadratowe” w dowolnym z czterech przekątnych kierunków, w zależności od kierunku początkowego podróżować. Może to skutkować ... interesującymi ... wzorami. Zobacz dwa parzyste przykłady poniżej.
Dane wejściowe, które nie są zgodne ze specyfikacją wejściową (np. 11q#s
), Są niezdefiniowane i w pełni oczekuję, że program odpowiednio odczyta kod. :)
Wydajność
Dane wyjściowe to dane wyjściowe do wydruku w formacie ASCII za pośrednictwem STDOUT odpowiadającego językowi, z następującymi specyfikacjami:
- Początkowy „kwadrat” (każdej rekurencji) musi być oznaczony znakiem at
@
. - Końcowy „kwadrat” musi być oznaczony znakiem ampersand
&
. W przypadku wielokrotnych rekurencji należy zaznaczyć tylko ostatni „kwadrat”&
. - Rogi spiralnej ścieżki muszą „wskazywać” w kierunku jazdy, używając
< > v ^
. - Przesuw pionowy należy narysować za pomocą rur
|
. - Podróż w poziomie musi być rysowana za pomocą myślników
-
. - „Kwadraty”, które zostaną zastąpione późniejszymi rekurencjami, powinny wyświetlać najnowszy kierunek podróży. Spowoduje to, że „nowsze” rekurencje będą się nakładać na „starsze” rekurencje. Zobacz
4rc3
przykład poniżej. - Końcowa nowa linia jest OK, początkowe spacje mogą być koniecznością i dlatego są dozwolone, ale końcowe spacje nie są dozwolone.
- Nie zadokuję cię, jeśli użyjesz sekwencji ucieczki, aby narysować sztukę ASCII zmierzającą do STDOUT, ale będę cię cicho rozczarowany. (Nadal będziesz uprawniony do nagrody, jeśli z nich skorzystasz)
Przykłady
2d4
= średnica 2, zaczyna się od zejścia w dół, zgodnie z ruchem wskazówek zegara, 4 rekurencje
&@@@@
^<<<<
W tym przykładzie rysunek zaczyna się w prawym górnym rogu @
, idzie w dół o jeden, w lewo, o jeden w górę. W tym momencie zakończyliśmy 2d
część, więc zacznij drugą rekurencję, więc mamy następną @
, niższą, lewą, wyższą; następnie 3. rekursja; potem czwarty i wreszcie nasz &
.
4rc3
= średnica 4, zaczyna się w prawo, w lewo, 3 rekurencje
&--<
v-<|
|@^|<
>--^|
|@^|<
>--^|
|@^|
>--^
W tym przykładzie rysunek zaczyna się od dołu @
, idzie w prawo, w górę, kręci się wokół, aż osiąga środek @
i kończy 4rc
część. To następnie powtarza się jeszcze dwa razy, aby uzyskać pełne 3 żądane rekurencje. Zauważ, że 4rc1
byłby to tylko lewy górny blok 4x4 w tym przykładzie.
7u1
= średnica 7, zaczyna się od przejścia w górę, zgodnie z ruchem wskazówek zegara, 1 rekurencja (zwróć uwagę, że to samo co wprowadzenie)
&>----v
||>--v|
|||>v||
|||@|||
||^-<||
|^---<|
^-----<
Zwycięstwo i ograniczenia
To jest Code Golf, więc najmniejsza odpowiedź w bajtach wygrywa. Zgłoszenia powinny mieć zwykłą formę programu / funkcji / bloku kodu CJam / itp. Obowiązują standardowe ograniczenia dotyczące luk. Profesjonalny kierowca na zamkniętym kursie. Jeśli podrażnienie nie ustępuje, przerwij stosowanie i skonsultuj się z lekarzem.
Odpowiedzi:
JavaScript,
578,575,553,478, 377 bajtówPo pobiciu Lua zmieniłem język na bardziej zwarty i przeniosłem konkurencję na Javascript:
Algorytm jest taki sam, ale napisany w bardziej zwartym języku, więc udało mi się pokonać złe Lisp :)
Edycja: Potrzebne były pewne zmiany strukturalne, aby ponownie sięgnąć pod Lisp i wyeliminować końcowe białe spacje. Ale znów tu jesteśmy.
Edycja2: Niektóre abstrakcje wzięto pod uwagę, aby uzyskać mniej niż 500. Mam nadzieję, że to wystarczy :)
Edit3: Dzięki @Timwi, kod jest o 100 znaków cieńszy. Nie zaktualizowałem jeszcze wyjaśnienia.
Testy ( wersja online , testowana w Chrome):
I szczerze mówiąc, istnieje uczciwe wyjaśnienie:
źródło
&optional
słowo kluczowe (i spację), aby zaoszczędzić 10 bajtów, co daje 576 ... zły śmiech (cóż, powiedziałeś, że możesz trochę zagrać w golfa, więc to nie powinno być trudne do pokonania; dopóki ktoś nie napisze 60-bajtowej odpowiedzi w Pyth, oczywiście).i=M/2;j=i;G=i;H=i;I=i;J=i;
i=j=G=H=I=J=M/2;
m=1;l=1;
m=l=1;
Common Lisp,
649617605586576565554527518Wszystkie testy wciąż przechodzą. Ulepszona funkcja również została zaktualizowana, aby odzwierciedlić zmiany, podobnie jak komentarze. W końcu pozbyłem się
remove-duplicates
, aby skrócić kod, ale teraz nie wiem, gdzie znaleźć więcej bajtów. Dobra robota Jakuje.Przykłady
Zobacz także
20lc10
(pastebin).Nie golfił
Nie ma tu żadnej rekurencji, tylko podstawowe podejście graficzne Turtle z pętlami:
(x y char)
potrójne na stosie.y
ix
źródło
Lua 5.2, 740 bajtów
Pomyślałem, że fajnie byłoby spróbować zaimplementować jakiś algorytm, aby pokonać Lisp, ale Lua prawdopodobnie nie jest najlepszą opcją. Spędzam za dużo czasu, przerobiłem niektóre części, aby skończyć z tym brzydkim, ale działającym rozwiązaniem. Prawdopodobnie spróbuję później innego języka, aby pokonać Lisp, ponieważ istnieje około 90 znaków, których nie mogę usunąć z tego algorytmu.
Testowanie wyników:
źródło
PHP, 524 bajtów
Przyjechałem późno na to przyjęcie. Moje rozwiązanie PHP nie jest ani najmniejsze, ani najmądrzejsze. To po prostu działa.
Jak to uruchomić:
Szczegółową wersję z testami, objaśnieniami i innymi dodatkami można znaleźć na github .
źródło