([]<>){({}{}(({}[()])))}{}{({}()<(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>)>)}{}{}{({}<>)<>}<>
Попробуйте онлайн!
Второй раствор, 96 байт
(([]<>)<{({}({})({}[()]))}{}>){({}(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>))}{}{}{({}<>)<>}<>
Попробуйте онлайн!
объяснение
Здесь я объясняю первое решение, оба имеют одинаковую длину, но мне нравится первое, потому что оно круче и использует несколько приятных трюков.
Самая важная часть кода - это модифицированная функция квадратного корня, которую я написал некоторое время назад. Оригинальная версия была
{({}[({})({}())])}{}
И это работает, но мы на самом деле хотим две копии отрицательного квадратного корня. Зачем? Нам нужны две копии, потому что мы перебираем строку на двух уровнях: один для создания строк и один для подсчета количества строк. Мы хотим, чтобы оно было отрицательным, поскольку циклы с отрицательными значениями дешевле.
Чтобы сделать это негативным, мы перемещаемся [...]
так, чтобы это выглядело так
{({}({})({}[()]))}{}
Чтобы сделать две копии, мы меняемся при появлении попсов
{({}{}(({}[()])))}{}
Теперь, когда у нас есть этот бит, мы можем собрать его вместе с высотой стека, чтобы получить первый кусок кода, который нам нужен.
([]<>){({}{}(({}[()])))}{}
Мы переходим в стэк, потому что нашей функции квадратного корня требуются два свободных нуля для вычислений, и потому что она делает вещи немного дешевле в будущем с точки зрения переключения стеков.
Теперь мы строим основной цикл
{({}()<(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>)>)}{}{}
Это довольно просто, мы зацикливаемся n раз каждый раз, перемещая n элементов и закрывая их новой строкой (ASCII 10).
Как только цикл завершен, нам нужно изменить порядок вывода, поэтому мы просто добавим стандартную обратную конструкцию.
{({}<>)<>}<>