Wprowadzenie
To jest bardzo proste. Będziemy rysować węża w ascii. Inspiracją była stara gra w węża, w której musisz zbierać owoce i stale się rozwijać.
Definicja
Biorąc pod uwagę dodatnią liczbę całkowitą N reprezentującą długość węża, narysuj węża tak, aby miał ciało n plus głowę i ogon.
Części:
- głowa:
<, >, ^, v
- ogon:
@
- pionowy:
|
- horyzontalny:
-
Wszystkie rogi powinny być spełnione odpowiednio \
lub /
. Chyba że głowa kończy się na rogu, w którym to przypadku głowa <, >, ^, v
ma priorytet w kierunku, w którym wąż jest zwinięty. tzn. dla przykładu o długości 1 jest on obracany przeciwnie do ruchu wskazówek zegara, a zatem głowica jest obracana w ten sposób. W przypadku rozwiązania zgodnego z ruchem wskazówek zegara byłoby to po prawej stronie >
.
Wąż musi zaczynać ogonem od środka, ale może wychodzić na zewnątrz w dowolnym kierunku, zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara. Musi także ściśle przylegać do siebie, ponieważ rozszerza się na zewnątrz w kółko.
Przykład
/--\
|/\|
||@|
|\-/
\--->
Gdzie @
jest ogon i pozycja początkowa. Jak widać powyżej, ogon zaczyna się w środku, idzie w górę w lewo w kierunku przeciwnym do ruchu wskazówek zegara na zewnątrz.
Tutaj długość 19
plus ogon i głowa.
Jako kolejny przykład podajemy długość 1
:
<\
@
Zwycięski
To jest golf golfowy, więc wygrywa odpowiedź przesłana z najmniejszą liczbą bajtów, z czasem do wykorzystania jako remis.
Baw się dobrze!
@---->
. Prawdopodobnie zamierzasz zaostrzyć warunki dotyczące kształtu węża. Wyjaśnij również, ile białych znaków jest dozwolone, a które nie.@
jest środek (możliwe, aby dodać spacje, aby tak było), zadeklaruj „w prawo”, aby być kierunkiem i skieruj tylko głowę w dół i zadeklaruj zgodnie z ruchem wskazówek zegara. Twoje warunki mogą wydawać się jasne, ale w rzeczywistości są niejednoznaczne. Zdaję sobie sprawę, że prawdopodobnie chodzi ci o jak najściślej zwiniętego węża, ale powinieneś to wyjaśnićOdpowiedzi:
MATL ,
8583 bajtówPomyślałem, że posiadanie
spiral
wbudowanego kodu byłoby krótkim kodem ...Wypróbuj online!
Wyjaśnienie
Niech N oznacza wejście. Stworzymy wektor długości
ceil(sqrt(N+2))^2
, czyli najmniejszy idealny kwadrat, który jest równy lub przekracza N + 2. Ten wektor zostanie wypełniony wartościami liczbowymi, zwinięty w spiralę (dlatego jego długość musi być idealnym kwadratem), a następnie wartości liczbowe zostaną zastąpione znakami.Niech n oznacza każdy krok, zaczynając od 1 w środku spirali. Kroki, w których wąż się obraca, są podane przez n 2 +1 (to znaczy: 2, 5, 10, ...) dla
\
symboli oraz n 2 + n +1 (to znaczy: 3, 7, 13, ...) dla/
. Kroki między a\
i a/
powinny być-
, a te między/
a a\
powinny być|
.Wektor jest tworzony w taki sposób, że zawiera
1
punkty zwrotne (2,3,5,7,10,13 ...) i0
resztę. Parzystość skumulowanej sumy mówi, czy każdy wpis powinien być a-
czy|
. Dodając 1 do tego wyniku, otrzymujemy wektor zawierający1
(for|
) lub2
(for-
). Ale to sprawia, że same punkty zwrotne stają się1
lub2
też. Punkty zwrotne, których pozycje znamy, są nadpisywane: pozycje n 2 +1 są wypełnione,3
a pozycje n 2 + n +1 są wypełnione4
. Ogon i głowa są również szczególnymi przypadkami: pierwszy element wektora (ogon) jest ustawiony na5
, a element o indeksie N+2 (głowa) jest ustawione na6
. Wreszcie, elementy o indeksach przekraczających N +2 są ustawione na0
.Przyjmując przykładowo N = 19, mamy teraz wektor o długości 25:
Musimy zwinąć ten wektor w spiralę. W tym celu używamy wbudowanej funkcji, która generuje macierz spiralną, po której następuje odbicie i transpozycja w celu uzyskania:
Indeksowanie wektora za pomocą macierzy daje
gdzie
0
odpowiada przestrzeni,1
odpowiada|
,2
do-
,3
do\
,4
do/
,5
do@
, i6
do głowy.Aby dowiedzieć się, który z czterech znaków
^
,<
,v
, lub>
głowa powinna mieć używamy skumulowaną sumę punktów zwrotnych, które poprzednio obliczonego. W szczególności, ostatnia ostatnia wartość tej skumulowanej sumy (tj. N + 1-ta wartość) modulo 4 mówi nam, jaki znak należy zastosować dla głowy. Bierzemy wartość przedostatnią skumulowanego sumy, nie ostatni, ze względu na wymóg „jeśli końce głowę na rogu głową<
,>
,^
,v
ma pierwszeństwo w kierunku wąż jest zakręcony”. Dla przykładu N = 19 głową jest>
.Teraz możemy zbudować ciąg zawierający wszystkie znaki wąż, w tym odpowiedniego znaku na głowie na szóstej pozycji:
'|-\/@> '
. Następnie indeksujemy ten ciąg za pomocą powyższej macierzy (indeksowanie jest oparte na 1 i modułowe, więc miejsce zajmuje ostatnie miejsce), co dajeźródło
Python 2,
250233191 bajtówrepl.it
Narysuj węża, obracając całego węża o 90º w kierunku zgodnym z ruchem wskazówek zegara i dodając dolny segment, w ten sposób wąż będzie zawsze w kierunku przeciwnym do ruchu wskazówek zegara.
Nowy segment zawsze zacznie się od
\
i będzie miał-
ciało równe i/
-
nieparzyste. Segmenty rozmiary (bez rogów) są0
,1
,1
,2
,2
,3
... co jestfloor(side/2)
.Jeśli segment jest ostatni, usuwa nadmiar znaków, dodaje głowę i uzupełnia spacjami.
źródło
'\/'[m]
,'-|'[m]
i'>v'[m]
print
i''.join
JavaScript (ES6), 193
201 203 215 220 224Edycja zapisany 4 bajty thx @Arnauld
Edit2 zmienił logika, a nie przechowywania bieżące przyrosty dla X i Y, po prostu je z obecnego kierunku
Edit3 uratowanie kilka bajtów, postanowiłam wykorzystać je do lepszego zarządzania pustego miejsca
Edit4 8 zapisane bajty nie podążają dokładnie za przykładami dotyczącymi kierunku głowy - podobnie jak inne odpowiedzi
Obecna wersja działa z Chrome, Firefox i MS Edge
Ta odpowiedź daje spację końcową i wiodącą (i puste linie).Nieco mniej golfa
źródło
(' ')
ze` `
i('@')
ze`@`
[ Array[1], Array[1] ]
, whileArray(2).fill(' ')
==>[' ',' ']
JavaScript (ES7), 200 bajtów
Wersja ES6 dla łatwości testowania:
źródło
Perl,
111110 bajtówObejmuje +1 dla
-p
Podaj rozmiar na STDIN
snake.pl
:źródło
Partia, 563 bajty
Objaśnienie: Przypadki specjalne 1, ponieważ reszta kodu wymaga szerokości węża co najmniej dwóch. Następnie oblicza największą ćwiartkę kwadratu (dokładny kwadrat lub prostokąt 1 szerszy niż jest wysoki), którego powierzchnia jest mniejsza niż długość węża. Wąż zostanie zwinięty w ten prostokąt, zaczynając od lewego dolnego rogu i kończąc ogonem w środku, a pozostała długość będzie przebiegać pod dolną częścią prostokąta. Prostokąt jest faktycznie generowany z prostych zamian ciągów; przez większość czasu każda linia jest generowana z poprzedniej linii przez przesunięcie przekątnych o 1 krok, ale oczywiście trzeba również poradzić sobie z ogonem i istnieją niewielkie różnice w zależności od tego, czy wysokość prostokąta jest parzysta czy nieparzysta.
źródło
Python 2.7, A WIĘCEJ 1230 bajtów
Jestem nowy w Pythonie i golfie golfowym, ale czułem, że muszę odpowiedzieć na własne pytanie i dążyć ze wstydem po tym fakcie. Dużo zabawy przy tym!
https://repl.it/Dpoy
źródło