([]<>){({}{}(({}[()])))}{}{({}()<(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>)>)}{}{}{({}<>)<>}<>
Wypróbuj online!
Drugie rozwiązanie, 96 bajtów
(([]<>)<{({}({})({}[()]))}{}>){({}(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>))}{}{}{({}<>)<>}<>
Wypróbuj online!
Wyjaśnienie
Tutaj wyjaśniam pierwsze rozwiązanie, oba mają tę samą długość, ale podoba mi się pierwsze, ponieważ jest fajniejsze i wykorzystuje kilka fajnych sztuczek.
Najważniejszą częścią kodu jest zmodyfikowana funkcja pierwiastka kwadratowego, którą napisałem jakiś czas temu. Pierwotna wersja była
{({}[({})({}())])}{}
I to działa, ale tak naprawdę chcemy dwóch kopii ujemnego pierwiastka kwadratowego. Czemu? Potrzebujemy dwóch kopii, ponieważ zapętlamy ciąg znaków na dwóch poziomach, jeden do tworzenia linii, a drugi do zliczania liczby linii. Chcemy, aby była ujemna, ponieważ pętla z negatywami jest tańsza.
Aby uczynić to negatywnym, poruszamy się [...]
tak, aby wyglądało tak
{({}({})({}[()]))}{}
Aby wykonać dwie kopie, zmieniamy się, gdy pojawiają się trzaski
{({}{}(({}[()])))}{}
Teraz, gdy mamy ten bit, możemy go połączyć z wysokością stosu, aby uzyskać pierwszą potrzebną część kodu.
([]<>){({}{}(({}[()])))}{}
Przechodzimy do offstacka, ponieważ nasza funkcja pierwiastka kwadratowego potrzebuje dwóch wolnych zer do obliczeń i ponieważ sprawia, że rzeczy są nieco tańsze w przyszłości pod względem przełączania stosu.
Teraz konstruujemy główną pętlę
{({}()<(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>)>)}{}{}
Jest to całkiem proste, za każdym razem n razy zapętlamy n przedmiotów i zamykamy je nową linią (ASCII 10).
Po zakończeniu pętli musimy odwrócić kolejność naszych wyników, więc po prostu wybieramy standardową konstrukcję odwróconą.
{({}<>)<>}<>