Niedociążenie, 196 bajtów
()()(<svg width="99" height="147">)S(<g transform="translate):S((33,33)">)S((3,0)rotate)*a(*a(~*)*~("><path d="M0h3" stroke="#"/>)~*a(*)**:(-90)a~^~(90)a~^)*::*:**:*^S(</g>)(:*)::*:**:*^S(</svg>)S
Pomyślałem, że może być interesujące wypróbowanie tego wyzwania w esolangu o niskiej mocy; Niedociążenie radzi sobie całkiem dobrze w przypadku języka z tak małą liczbą poleceń.
Dane wyjściowe to plik SVG z bardzo mocno zagnieżdżonymi znacznikami i niektórymi skrótami golfowymi. Do tej pory nie znalazłem przeglądarki, która może go wyświetlić (Firefox zawiesza się przez kilka minut, próbując go załadować, a zarówno Firefox, jak i Chromium dają pusty ekran). Większość programów do przetwarzania obrazów też nie może go załadować (co utrudnia konwersję na inny format), ale udało mi się załadować go do przeglądarki Eye of Gnome (która jest częścią domyślnej instalacji na Ubuntu). Więc zrobiłem zrzut ekranu obrazu, abyś mógł go zobaczyć (rzeczywisty obraz ma przezroczyste tło, ale tak naprawdę nie możesz zrzut ekranu przezroczysty):
Musimy wyraźnie określić rozmiar obrazu. Wybranie odpowiedniej orientacji obrazu, narysowanie wszystkiego w minimalnym dozwolonym rozmiarze i wykonanie minimalnej liczby iteracji określonych przez wyzwanie, daje nam obraz, który po prostu mieści się w szerokości 99 pikseli, oszczędzając bajt. Fajnie jest, gdy sprawy się tak układają.
Ogólny algorytm używany do rysowania obrazu polega na utrzymywaniu dwóch zmiennych (Niedociążenie nie nazywa zmiennych, ale pomyślałem o nich jako x i y ), oba początkowo puste. Następnie wielokrotnie zamieniamy ( x , y ) na ( x , skręcamy w lewo i poruszamy się do przodu, y ) i ( x , skręcamy w prawo i poruszamy się do przodu, y ). Po dziesięciu iteracjach zarówno x , jak i y utrzymują dziewięciotaktową krzywą smoka.
Istnieje również kilka mikrooptymalizacji i sztuczek związanych z niedociążeniem. W celu uniknięcia zbyt dużo bawić z wierzchu stosu, każdej iteracji pętli, zaczynamy łącząc X i Y w funkcji „powrót ciąg utworzony przez złączenie: x , instrukcją kolei argument funkcji, a move- przekazywanie instrukcji i y . ” Funkcja ta zajmuje tylko jedno miejsce na stosie, więc możemy go powielać, nazywają go -90
jako argumentu, zamienić wartości zwracanej w ramach dwóch egzemplarzach, i nazywają go 90
jako argument, aby zdobyć nowych wartości dla X i Ybez konieczności dotykania więcej niż dwóch górnych elementów stosu (które są zdecydowanie najbardziej dostępne). Ta funkcja jest generowana w czasie wykonywania kodu. Generator jest również generowany w czasie wykonywania kodu, aby umożliwić mu ponowne użycie ciągu, <g transform="translate
który jest również używany do ustawienia początku obrazu. Najpierw generujemy wszystkie otwarte tagi, a następnie, ponieważ wszystkie tagi close są po prostu </g>
, możemy wygenerować 1024 tagi close, po prostu powtarzając ciąg, bez obawy o dopasowanie ich do tagów open. (Efektywne pisanie liczb w niedociążeniu jest samo w sobie interesującym problemem; (:*)::*:**:*
jest jednak prawdopodobnie najbardziej wydajnym sposobem zapisu 1024, co przekłada się na „2 do potęgi (1 + 2 × 2) × 2”.
Niedociążenie nie ma żadnych bibliotek graficznych, więc tworzę SVG, używając kombinacji rysowania linii w ustalonej pozycji i obracania obrazu wokół danego punktu; zamiast obracać długopis, odwracamy papier. Chodzi o to, że rysując linię, obracając cały obraz, rysując inną linię, obracając obraz ponownie itp., Możemy skutecznie symulować grafikę żółwia bez konieczności wykonywania arytmetyki lub korzystania z bibliotek graficznych, ponieważ wszystkie linie są rysowane w tej samej lokalizacji. Oczywiście oznacza to, że mamy bardzo mocno zagnieżdżone tagi rotate-the-image, co dezorientuje wiele przeglądarek SVG.
Stylowanie obrazu będzie się liczyć z liczbą bajtów, więc musiałem podać minimalną stylizację potrzebną do wyświetlenia obrazu. Okazuje się, że tak stroke="#"
, co mniej więcej tłumaczy się jako „linia musi mieć jakiś kolor”; wydaje się, że jest to rozszerzone na rysowanie go na czarno. (Zwykle kolor określa się jako powiedzmy „# 000”.) Domyślnie tło jest przezroczyste. Nie określamy szerokości obrysu, ale wybór wybrany przez Eye of Gnome pozostawia wszystko widoczne.
Wielu tłumaczy niedociążenia boryka się z tym programem, np. Ten w Try It Online ulega awarii, ponieważ generuje on bardzo duże ciągi wewnętrznie. Oryginalny internetowy interpreter niedociążenia działa jednak. (Co ciekawe, pierwszy tłumacz był online, więc język był dostępny online, zanim był dostępny offline).
Trochę mnie niepokoi to, że wydaje się, że jest tu tylko 1023 segmentów linii, a my spodziewalibyśmy się 1024. Możliwe, że jeden z segmentów na końcu nie jest rysowany za pomocą tego algorytmu (byłby to zamiast tego rysowana w następnej iteracji). Jeśli to dyskwalifikuje, może być możliwe dostosowanie programu, ale może skończyć się znacznie dłużej. (To nie tak, że to wyzwanie i tak wygra konkurs; jest już kilka krótszych zgłoszeń).