To jest wersja ASCII tego wyzwania . Początkowy post został oddzielony na żądanie przez Martina Endera
Wprowadzenie
Podobnie jak Sekwencja Fibonacciego, Sekwencja Padovana ( OEIS A000931 ) jest sekwencją liczb, która jest wytwarzana przez dodanie poprzednich terminów w sekwencji. Wartości początkowe są zdefiniowane jako:
P(0) = P(1) = P(2) = 1
Warunki: 0, 1 i 2 są 1. Relacja powtarzalności jest podana poniżej:
P(n) = P(n - 2) + P(n - 3)
W ten sposób uzyskuje się następującą sekwencję:
1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, ...
Używanie tych liczb jako długości boków trójkątów równobocznych daje fajną spiralę, gdy umieścisz je wszystkie razem, podobnie jak Spirala Fibonacciego:
Zdjęcie dzięki uprzejmości Wikipedia
Zadanie
Twoim zadaniem jest napisanie programu, który odtworzy tę spiralę według sztuki ASCII, z danymi wejściowymi odpowiadającymi temu terminowi. Ponieważ trójkąta o długości boku 1 (1 znak) nie da się dobrze przedstawić w ASCII, długości boków zostały rozszerzone o współczynnik 2. Zatem trójkąt o długości boku 1 jest w rzeczywistości tak przedstawiony:
/\
/__\
Na przykład, jeśli dane wejściowe wynosiły 5 (5 termin), dane wyjściowe powinny wynosić:
/\
/ \
/ \
/______\
\ /\
\ /__\
\ /\ /
\/__\/
Pierwsze 5 wyrazów to 1, 1, 1, 2, 2, więc trójkąt miał długość boku 2, 2, 2, 4, 4 z powodu rozszerzenia. Kolejny przykład dla wejścia 8:
__________
/\ /\
/ \ / \
/ \ / \
/______\ / \
\ /\ / \
\ /__\/ \
\ /\ / \
\/__\/______________\
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\/
Zasady
- Musisz wydrukować wynik, a wejście musi być liczbą całkowitą odpowiadającą liczbie terminów
- Dopuszczalne są końcowe i wiodące znaki nowej linii, dozwolone są także końcowe spacje po wierszach
- Twoje zgłoszenie musi być w stanie obsłużyć co najmniej do 10. kadencji (9)
- Twoje zgłoszenie musi być pełnym programem lub funkcją, która pobiera dane wejściowe i drukuje wynik
- Dopuszczalne są obroty wyjścia, w wielokrotnościach 60 stopni, ale rozmiar trójkątów musi pozostać taki sam, wraz z reprezentacją
- Dozwolone jest również poruszanie się w lewo
- Standardowe luki są zabronione
Możesz założyć, że dane wejściowe będą> 0 i że podany zostanie prawidłowy format danych wejściowych.
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach. Szczęśliwego Nowego Roku wszystkim!
Odpowiedzi:
Befunge,
871836798 bajtówWypróbuj online!
Jak to często bywa w Befunge, sztuczka wymyśla algorytm, który pozwala nam renderować wzór od góry do dołu, ponieważ po prostu nie jest możliwe, aby najpierw zapisać go w pamięci przy ograniczonej dostępnej przestrzeni.
Działa to najpierw poprzez zbudowanie prostej struktury danych reprezentującej krawędzie potrzebne do narysowania spirali. Drugi etap następnie analizuje tę strukturę od góry do dołu, renderując fragmenty krawędzi wymagane dla każdej linii wyjścia.
Korzystając z tej techniki, możemy obsłużyć do n = 15 w implementacji referencyjnej, zanim zaczniemy mieć problem z przepełnieniem w 8-bitowych komórkach pamięci. Tłumacze o większym rozmiarze komórki powinni móc obsłużyć do n = 25 przed wyczerpaniem się pamięci.
źródło
idź, 768 bajtów
To oczywiście nie jest optymalne, ale nie jest to zły początek. Wiem, że jest to trochę proste jak na standardy gry w golfa, ale było fajnie i mam nadzieję, że nie przeszkadza mi, jeśli zostawię jakieś uwagi przyszłej jaźni.
Jak to działa
Zasadniczo symuluję „rysującego żółwia”, jak w LOGO, na siatce pikseli ASCII, ale żółw może wykonać tylko te trzy polecenia:
Teraz dla każdego trójkąta idę w ten sposób, gdzie P jest 2x n-ta liczba Padovana:
Czwarta „fd” oznacza, że śledzę pierwszą stronę każdego trójkąta. Pomaga to wrócić do dobrego punktu wyjścia do następnego trójkąta. Pół skrętu w prawo upewnia się, że następny trójkąt będzie we właściwej orientacji.
Aby zagrać w żółwia, przechowuję 5 zmiennych stanu w tablicy 态: x pozycja, y pozycja, x prędkość, y prędkość i „runa rysująca”. W każdej klatce animacji x + = x prędkość, y + = y prędkość, a runa jest rysowana.
Potem ustawiam tabelę 表, która mówi, jak wykonać turę. Kod kierunkowy jest trudny ze względu na sposób działania grafiki ASCII. Nie jest to prosty ruch jak na ekranie pikselowym. Kierunek żółwia, określony przez prędkość xiy, decyduje o zmianach koniecznych do uzyskania właściwego skrętu.
Aby obrócić, patrzy na bieżącą prędkość xiy i łączy je w indeks.
Ten indeks służy do wyszukiwania zestawu 5 wartości w tabeli 表. Te 5 wartości z tabeli 表 są następnie dodawane do każdej z 5 zmiennych w stanie 态. Żółw jest następnie skutecznie obracany i gotowy do następnego „fd”.
Po drugie, połowa skrętu w prawo, jest osobna sekcja tabeli 表. Jest to kompensowane przez 7 * 5 lub 35 wpisów z pierwszej tabeli w 表.
Na koniec wykonałem proste kodowanie liczb całkowitych tabeli na ciąg ascii.
Wiem, że mógłbym „zaoszczędzić bajty”, usuwając Hanzi, ale jak już powiedziałem, nie jest to optymalne i istnieje więcej możliwości gry w golfa ... Usunę je, gdy nie będzie żadnej innej możliwej optymalizacji. Ci Hanzi faktycznie mają luźne znaczenie w oparciu o ich rzeczywiste znaczenie i chociaż nie znam chińskiego, pomaga mi to myśleć o programie.
Aby przetestować kod, potrzebujesz pełnego pliku golang z tym nagłówkiem
i ta stopka
dzięki
źródło