([]<>){({}{}(({}[()])))}{}{({}()<(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>)>)}{}{}{({}<>)<>}<>
Спробуйте в Інтернеті!
Другий розчин, 96 байт
(([]<>)<{({}({})({}[()]))}{}>){({}(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>))}{}{}{({}<>)<>}<>
Спробуйте в Інтернеті!
Пояснення
Тут я пояснюю перше рішення, обидва мають однакову довжину, але мені подобається перше, оскільки воно крутіше і використовує деякі приємні хитрощі.
Найважливіша частина коду - це змінена функція квадратного кореня, про яку я писав деякий час тому. Оригінальна версія була
{({}[({})({}())])}{}
І це працює, але ми насправді хочемо дві копії негативного квадратного кореня. Чому? Нам потрібні дві копії, оскільки ми пробираємося через рядок на двох рівнях, один для створення рядків і один для підрахунку кількості рядків. Ми хочемо, щоб це було негативним, оскільки циклічне використання негативів дешевше.
Щоб зробити цей негатив, ми рухаємось [...]
так, щоб це виглядало так
{({}({})({}[()]))}{}
Щоб зробити дві копії, ми змінюємось, коли трапляються попси
{({}{}(({}[()])))}{}
Тепер, коли у нас є цей біт, ми можемо скласти його разом з висотою стека, щоб отримати перший фрагмент коду, який нам потрібен.
([]<>){({}{}(({}[()])))}{}
Ми переходимо до офсетної ставки, тому що для нашої функції квадратного кореня потрібні дві вільні нулі для обчислення, і тому, що це робить дещо дешевше в майбутньому з точки зору переключення стеків.
Тепер будуємо основну петлю
{({}()<(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>)>)}{}{}
Це досить прямо вперед, ми обводимо n разів кожен раз, пересуваючи n елементів, і обмежуємо їх новим рядком (ASCII 10).
Після того, як цикл виконаний, нам потрібно змінити порядок нашого виводу, щоб ми просто застосували стандартну зворотну конструкцію.
{({}<>)<>}<>