ASCII Кривая Дракона

26

Введение

В кривой дракона является фрактальной кривой, в частности , появляется на название раздела страниц романа Парк Юрского периода.

Это можно очень просто описать как процесс сгибания бумажной полоски, как объясняется в статье в Википедии об этой кривой.

Первые несколько итераций генерации этой кривой выглядят следующим образом (благодарность за изображение в Википедии):

введите описание изображения здесь

Соревнование

Напишите программу или функцию, которая, учитывая целое число n в качестве входных данных, выводит n-ю итерацию кривой дракона как искусство ASCII, используя только символы _и|

  • Вы должны вывести фигуру , используя только |, _и пробелы. Вы не можете выводить кривую в виде графика или чего-либо еще.
  • Вы можете принять входные данные в качестве аргумента программы, в STDIN или в качестве параметра функции.
  • Входные данные всегда будут целыми числами> = 0. Ваша программа должна работать при приемлемых значениях входных данных, 12 из которых является самым высоким в предлагаемых тестовых примерах.
  • Первые итерации должны выглядеть так

    • Итерация 0

      _
      
    • Итерация 1

      _|
      
    • Итерация 2

      |_ 
       _|
      
  • Одна конечная строка в конце в порядке. Запрещены пробелы, кроме заполнения строки до самого правого символа в кривой

  • Как правило, не злоупотребление стандартными лазейками

Тестовые случаи

  • вход 0

Выход

_
  • вход 3

Выход

   _   
|_| |_ 
     _|
  • вход 5

Выход

     _   _   
    |_|_| |_ 
 _   _|    _|
|_|_|_       
  |_|_|      
    |_       
     _|      
  |_|        
  • вход 10

Выход

           _       _                                           
         _|_|    _|_|                                          
        |_|_   _|_|_   _                                       
         _|_|_| |_| |_|_|                                      
   _    |_|_|_        |_                                       
 _|_|    _| |_|        _|                                      
|_|_   _|_          |_|                                        
 _|_|_|_|_|_                                                   
|_| |_|_|_|_|_                                                 
     _|_|_| |_|                                                
    |_| |_                                                     
         _|_   _   _           _   _           _   _           
   _    |_|_|_|_|_|_|_        |_|_|_|_        |_|_|_|_         
 _|_|    _|_|_|_|_| |_|    _   _|_| |_|    _   _|_| |_|        
|_|_   _|_|_|_|_|_        |_|_|_|_        |_|_|_|_             
 _|_|_|_|_|_|_|_|_|_   _   _|_|_|_|_   _   _|_|_|_|_   _   _   
|_| |_|_|_| |_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_ 
     _|_|    _|_|    _|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|
    |_|     |_|     |_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_     
                         _|_|_|_|_|_|_|_|_|_|_| |_| |_|_|_|_   
                   _    |_|_|_|_|_|_|_|_|_|_|_        |_|_|_|_ 
                 _|_|    _|_|_|_|_|_|_|_|_| |_|    _   _|_| |_|
                |_|_   _|_|_|_|_|_|_|_|_|_        |_|_|_|_     
                 _|_|_|_|_|_|_|_|_|_|_|_|_|_        |_| |_|    
                |_| |_|_|_| |_|_|_| |_|_|_|_|_                 
                     _|_|    _|_|    _|_|_| |_|                
                    |_|     |_|     |_| |_                     
                                         _|_   _   _           
                                   _    |_|_|_|_|_|_|_         
                                 _|_|    _|_|_|_|_| |_|        
                                |_|_   _|_|_|_|_|_             
                                 _|_|_|_|_|_|_|_|_|_   _   _   
                                |_| |_|_|_|_|_|_|_|_|_|_|_|_|_ 
                                     _|_|_|_|_|_|_|_|_|_|_| |_|
                                    |_| |_|_|_|_|_|_|_|_|_     
               _   _                     _|_|_| |_| |_|_|_|_   
              |_|_| |_             _    |_|_|_        |_|_|_|_ 
           _   _|    _|          _|_|    _| |_|    _   _|_| |_|
          |_|_|_                |_|_   _|_        |_|_|_|_     
            |_|_|                _|_|_|_|_|_        |_| |_|    
              |_   _       _    |_|_|_|_|_|_|_                 
           _   _|_|_|    _|_|    _|_|_|_|_| |_|                
          |_|_|_|_|_   _|_|_   _|_|_|_|_|_                     
            |_| |_| |_|_|_|_|_| |_| |_|_|_|_                   
                      |_|_|_|_        |_|_|_|_                 
                   _   _|_| |_|    _   _|_| |_|                
                  |_|_|_|_        |_|_|_|_                     
                    |_| |_|         |_| |_|                    
  • вход 12

Выход

                                                               _   _           _   _                                           _   _           _   _                                           
                                                              |_|_|_|_        |_|_|_|_                                        |_|_|_|_        |_|_|_|_                                         
                                                           _   _|_| |_|    _   _|_| |_|                                    _   _|_| |_|    _   _|_| |_|                                        
                                                          |_|_|_|_        |_|_|_|_                                        |_|_|_|_        |_|_|_|_                                             
                                                            |_|_|_|_   _   _|_|_|_|_   _   _                                |_|_|_|_   _   _|_|_|_|_   _   _                                   
                                                              |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_                                |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_                                 
                                                           _   _|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|                            _   _|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|                                
                                                          |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_                                |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_                                     
                                               _   _        |_|_|_|_|_|_|_|_|_| |_| |_|_|_|_                   _   _        |_|_|_|_|_|_|_|_|_| |_| |_|_|_|_                                   
                                              |_|_|_|_        |_|_|_|_|_|_|_|_        |_|_|_|_                |_|_|_|_        |_|_|_|_|_|_|_|_        |_|_|_|_                                 
                                           _   _|_| |_|    _   _|_|_|_|_|_| |_|    _   _|_| |_|            _   _|_| |_|    _   _|_|_|_|_|_| |_|    _   _|_| |_|                                
                                          |_|_|_|_        |_|_|_|_|_|_|_|_        |_|_|_|_                |_|_|_|_        |_|_|_|_|_|_|_|_        |_|_|_|_                                     
                                            |_|_|_|_   _   _|_|_|_|_|_|_|_|_        |_| |_|                 |_|_|_|_   _   _|_|_|_|_|_|_|_|_        |_| |_|                                    
                                              |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_                                |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_                                                 
                                           _   _|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|                            _   _|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|                                                
                                          |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_                                |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_                                                     
                                            |_| |_| |_|_|_|_|_|_|_|_|_|_|_|_   _   _           _   _        |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_   _   _           _   _           _   _           
                                                      |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_        |_|_|_|_        |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_        |_|_|_|_        |_|_|_|_         
                                                   _   _|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|    _   _|_| |_|    _   _|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|    _   _|_| |_|    _   _|_| |_|        
                                                  |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_        |_|_|_|_        |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_        |_|_|_|_        |_|_|_|_             
                                                    |_| |_| |_|_|_|_|_|_|_|_|_|_|_|_   _   _|_|_|_|_   _   _|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_   _   _|_|_|_|_   _   _|_|_|_|_   _   _   
                                                              |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_| |_|_|_|_|_|_|_|_|_|_|_| |_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_ 
                                                           _   _|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|    _|_|    _|_|_|_|_|_|_|_|_|_|    _|_|    _|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|
                                                          |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_    |_|     |_| |_|_|_|_|_|_|_|_    |_|     |_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_     
                                               _   _        |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|                _|_|_|_|_|_|_|_|                _|_|_|_|_|_|_|_|_|_|_| |_| |_|_|_|_   
                                              |_|_|_|_        |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_           _    |_|_|_|_|_| |_|_           _    |_|_|_|_|_|_|_|_|_|_|_        |_|_|_|_ 
                                           _   _|_| |_|    _   _|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|    _|_|        _|_|    _|_|_|_|    _|_|        _|_|    _|_|_|_|_|_|_|_|_| |_|    _   _|_| |_|
                                          |_|_|_|_        |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_    |_|         |_|_   _|_|_|_|_    |_|         |_|_   _|_|_|_|_|_|_|_|_|_        |_|_|_|_     
                                            |_|_|_|_   _   _|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|                _|_|_|_|_|_|_|_|                _|_|_|_|_|_|_|_|_|_|_|_|_|_        |_| |_|    
                                              |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_   _            |_| |_|_|_| |_|_                |_| |_|_|_| |_|_|_| |_|_|_|_|_                 
                                           _   _|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|                _|_|    _|_|                    _|_|    _|_|    _|_|_| |_|                
                                          |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_   _            |_|     |_|                     |_|     |_|     |_| |_                     
                                            |_| |_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|                                                                _|_   _   _           
                                                      |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_                                                           _    |_|_|_|_|_|_|_         
                                                   _   _|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|    _|_|                                                        _|_|    _|_|_|_|_| |_|        
                                                  |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_    |_|                                                         |_|_   _|_|_|_|_|_             
                                                    |_| |_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|                                                                _|_|_|_|_|_|_|_|_|_   _   _   
           _       _                                          |_|_|_|_|_|_| |_|_|_| |_|_|_|_|_|_   _                                                            |_| |_|_|_|_|_|_|_|_|_|_|_|_|_ 
         _|_|    _|_|                                      _   _|_|_|_|_|    _|_|    _|_|_|_|_|_|_|_|                                                                _|_|_|_|_|_|_|_|_|_|_| |_|
        |_|_   _|_|_   _                                  |_|_|_|_|_|_|_    |_|     |_| |_|_|_|_|_|_   _                                                            |_| |_|_|_|_|_|_|_|_|_     
         _|_|_| |_| |_|_|                      _   _        |_|_|_|_|_|_|                _|_|_|_|_|_|_|_|                                      _   _                     _|_|_| |_| |_|_|_|_   
   _    |_|_|_        |_                      |_|_|_|_        |_|_| |_|_           _    |_|_|_|_|_| |_|_                                      |_|_| |_             _    |_|_|_        |_|_|_|_ 
 _|_|    _| |_|        _|                  _   _|_| |_|    _   _|    _|_|        _|_|    _|_|_|_|    _|_|                                  _   _|    _|          _|_|    _| |_|    _   _|_| |_|
|_|_   _|_          |_|                   |_|_|_|_        |_|_|_    |_|         |_|_   _|_|_|_|_    |_|                                   |_|_|_                |_|_   _|_        |_|_|_|_     
 _|_|_|_|_|_                                |_|_|_|_   _   _|_|_|                _|_|_|_|_|_|_|_|                                           |_|_|                _|_|_|_|_|_        |_| |_|    
|_| |_|_|_|_|_                                |_|_|_|_|_|_|_|_|_   _            |_| |_|_|_| |_|_                                              |_   _       _    |_|_|_|_|_|_|_                 
     _|_|_| |_|                            _   _|_|_|_|_|_|_|_|_|_|_|                _|_|    _|_|                                          _   _|_|_|    _|_|    _|_|_|_|_| |_|                
    |_| |_                                |_|_|_|_|_|_|_|_|_|_|_|_|_   _            |_|     |_|                                           |_|_|_|_|_   _|_|_   _|_|_|_|_|_                     
         _|_   _   _           _   _        |_|_|_|_|_|_|_|_|_|_|_|_|_|_|                                                                   |_| |_| |_|_|_|_|_| |_| |_|_|_|_                   
   _    |_|_|_|_|_|_|_        |_|_|_|_        |_|_|_|_|_|_|_|_|_|_| |_|_                                                                              |_|_|_|_        |_|_|_|_                 
 _|_|    _|_|_|_|_| |_|    _   _|_| |_|    _   _|_|_|_|_|_|_|_|_|    _|_|                                                                          _   _|_| |_|    _   _|_| |_|                
|_|_   _|_|_|_|_|_        |_|_|_|_        |_|_|_|_|_|_|_|_|_|_|_    |_|                                                                           |_|_|_|_        |_|_|_|_                     
 _|_|_|_|_|_|_|_|_|_   _   _|_|_|_|_   _   _|_|_|_|_|_|_|_|_|_|_|                                                                                   |_| |_|         |_| |_|                    
|_| |_|_|_| |_|_|_| |_|_|_|_|_|_|_|_|_|_|_| |_|_|_| |_|_|_|_|_|_   _                                                                                                                           
     _|_|    _|_|    _|_|_|_|_|_|_|_|_|_|    _|_|    _|_|_|_|_|_|_|_|                                                                                                                          
    |_|     |_|     |_| |_|_|_|_|_|_|_|_    |_|     |_| |_|_|_|_|_|_   _                                                                                                                       
                         _|_|_|_|_|_|_|_|                _|_|_|_|_|_|_|_|                                                                                                                      
                   _    |_|_|_|_|_| |_|_           _    |_|_|_|_|_| |_|_                                                                                                                       
                 _|_|    _|_|_|_|    _|_|        _|_|    _|_|_|_|    _|_|                                                                                                                      
                |_|_   _|_|_|_|_    |_|         |_|_   _|_|_|_|_    |_|                                                                                                                        
                 _|_|_|_|_|_|_|_|                _|_|_|_|_|_|_|_|                                                                                                                              
                |_| |_|_|_| |_|_                |_| |_|_|_| |_|_                                                                                                                               
                     _|_|    _|_|                    _|_|    _|_|                                                                                                                              
                    |_|     |_|                     |_|     |_|                                                                                                                                

счет

Это , поэтому выигрывает самая короткая программа в байтах.

Fatalize
источник
Я уверен, что кто-то будет жаловаться на неопределенность «огромного количества пробелов», так как насчет асимптотической границы?
feersum
1
@feersum Ну, я вообще запретил пробелы, так что теперь никто не будет жаловаться!
Фатализировать
2
Я жалуюсь ... теперь ты нацист!
feersum
@feersum, а вы горизонтальный многонациональный нацист!
Оптимизатор
Это лучший фрактальный вопрос, надеюсь, у меня будет время для участия! Можно ли повернуть кривую на 90 180 270 градусов или она должна отображаться в примерах?
Уровень Река St

Ответы:

9

Рубин, 239 201 байт

Это лямбда-функция, которая должна вызываться так же, как и в негольфированной версии.

Улучшения игры в гольф включают: назначение 8<<n/2переменной для повторного использования; uptoпетля вместо eachпетли; троичный оператор вместо if..else..end; использовать [y,y+=d].maxдля расчета, где распечатать |; использование ?_и ?|вместо эквивалента '|'и '_'; и устранение лишних %4(спасибо Sp3000.)

->n{a=Array.new(m=8<<n/2){" "*m}
p=q=1+x=y=m/2
r=3
1.upto(1<<n){|i|d=(r&2)-1
r%2>0?(a[y][x+=d]=?_
x+=d):(a[[y,y+=d].max][x]=?|
p=x<p ?x:p
q=x>q ?x:q)
r+=i/(i&-i)}
a.delete(a[0])
puts a.map{|e|e[p..q]}}

Он опирается на следующую формулу из Википедии:

Во-первых, выразите n в форме k * (2 ^ m), где k - нечетное число. Направление n-го поворота определяется k mod 4, т. Е. Остаток остается, когда k делится на 4. Если k mod 4 равно 1, то n-й ход равен R; если k mod 4 равно 3, то n-й ход равен L.

Википедия дает следующий код:

Существует простой однострочный нерекурсивный метод реализации описанного выше метода k mod 4 для определения направления поворота в коде. Рассматривая ход n как двоичное число, вычислите следующее логическое значение: bool turn = (((n & −n) << 1) & n) != 0

Я улучшил этот i/(i&-i)%4метод, в котором используется та же методика использования выражения i&-iдля поиска наименее значимой цифры, но мое выражение дает 1 (для левого поворота) или 3 (для правого поворота) напрямую, что удобно, когда я отслеживаю направление как число 0..3(в заказывать север, запад, юг, восток по причинам, связанным с гольфом.)

Разгруженный оригинал в тестовой программе

f=->n{
  a=Array.new(8<<n/2){" "*(8<<n/2)}  #Make an array of strings of spaces of appropriate size 
  p=q=1+x=y=4<<n/2                   #set x&y to the middle of the array, p&q to the place where the underscore for n=0 will be printed.                             
  r=3                                #direction pointer, headed East
  (1..1<<n).each{|i|                 #all elements, starting at 1
    d=(r&2)-1                          #d is +1 for East and South, -1 for West and North
    if r%2>0                           #if horizontal
      a[y][x+=d]='_'                     #move cursor 1 position in direction d, print underscore,
      x+=d                               #and move again.
    else                               #else vertical
      a[(y+([d,0].max))][x]='|'          #draw | on the same line if d negative, line below if d positive
      y+=d                               #move cursor
      p=x<p ?x:p                         #update minimum and maximum x values for whitespace truncation later
      q=x>q ?x:q                         #(must be done for vertical bars, to avoid unnecesary space in n=0 case)
    end
    r=(r+i/(i&-i))%4                   #update direction
  }
  a.delete(a[0])                     #first line of a is blank. delete all blank lines.
  puts a.map!{|e|e[p..q]}                 #use p and q to truncate all strings to avoid unnecessary whitespace to left and right.
}


f.call(0)
f.call(2)
f.call(3)
f.call(11)
Уровень реки St
источник
@Fatalize обе функции (в настоящее время) идентичны (за исключением комментариев и пробелов). Я добавил печать в стандартный вывод вместо возврата значения (+5 байт) и удалил f=в начале, так как это обычно не считается анонимным определение функции (-2 байта.) Больше игры в гольф завтра. Обратите внимание, что вам все равно придется выполнить функцию golfed, присвоив ее переменной f=->n{.....}и вызвав ее, f.call(n)как в примере программы тестирования.
Уровень реки St
1
@Fatalize Кстати, я думаю, что фрактал выглядит совершенно потрясающе в моей консоли. Спасибо за вызов.
Уровень Река St
@ Sp3000 действительно %4не является необходимым, так как rиспользуется только в выражениях r%2и r&2. Спасибо за совет. Я сейчас до 202.
Уровень Река St
8

Python 2, 270 222 байта

y=X=Y=0
i=m=x=1
D={}
k=2**input()
while~k+i:j=Y+(y>0);s={2*X+x};D[j]=D.get(j,s)|s;m=min(m,*s);Y+=y;X+=x;exec i/(i&-i)*"x,y=y,-x;";i+=1
for r in sorted(D):print"".join(" | _"[(n in D[r])+n%2*2]for n in range(m,max(D[r])+1))

Теперь используем формулу для n-го хода. Я видел (((n & −n) << 1) & n)формулу в Википедии, но не понимал, насколько она полезна, пока не увидел ее в ответе @ steveverrill . Я на самом деле тоже отбрасываю %4, так что происходит много поворотов, поэтому для больших входов требуется некоторое время.


Дополнительное замечание: это не графический вывод, а вот код гольфовой черепашки:

from turtle import*
for i in range(1,2**input()+1):fd(5);lt(i/(i&-i)*90)
Sp3000
источник
До тех пор, пока я не бегаю час, я в порядке
Fatalize
Если я правильно понимаю, ваш второй код может быть немного изменен, чтобы стать ответом на этот вызов .
Недла2004
3

C #, 337 байт

Здесь есть немного нарушений правил. Там нет ограничений на ведущие места. К сожалению, холст конечен, поэтому существует верхний предел для n .

Отступы для ясности:

using C=System.Console;
class P{
    static void Main(string[]a){
        int n=int.Parse(a[0]),d=2,x=250,y=500;
        var f="0D";
        while(n-->0)
            f=f.Replace("D","d3t03").Replace("T","10d1t").ToUpper();
        C.SetBufferSize(999,999);
        foreach(var c in f){
            n=c&7;
            d=(d+n)%4;
            if(n<1){
                var b=d%2<1;
                x+=n=b?1-d:0;
                y+=b?0:2-d;
                C.SetCursorPosition(x*2-n,y+d/3);
                C.Write(b?'_':'|');
            }
        }
    }
}
Hand-E-Food
источник
1

JavaScript (ES6), 220

Использование формулы Википедии для левого и правого поворотов.

n=>(d=>{for(i=x=y=d;i<1<<n;d+=++i/(i&-i))z=d&2,(w=d&1)?y+=z/2:x+=1-z,g=x<0?g.map(r=>[,,...r],x=1):g,g=y<0?[y=0,...g]:g,r=g[y]=g[y]||[],r[x]='_|'[w],w?y-=!z:x+=1-z})(0,g=[])||g.map(r=>[...r].map(c=>c||' ').join``).join`
`

Меньше гольфа

n=>{
  g=[];
  for(i=x=y=d=0;i<1<<n;d+=++i/(i&-i))
    z=d&2,
    (w=d&1)?y+=z/2:x+=1-z,
    g=x<0?g.map(r=>[,,...r],x=1):g,
    g=y<0?[y=0,...g]:g,
    r=g[y]=g[y]||[],
    r[x]='_|'[w],
    w?y-=!z:x+=1-z
  return g.map(r=>[...r].map(c=>c||' ').join``).join`\n`
}

F=
n=>(d=>{for(i=x=y=d;i<1<<n;d+=++i/(i&-i))z=d&2,(w=d&1)?y+=z/2:x+=1-z,g=x<0?g.map(r=>[,,...r],x=1):g,g=y<0?[y=0,...g]:g,r=g[y]=g[y]||[],r[x]='_|'[w],w?y-=!z:x+=1-z})(0,g=[])||g.map(r=>[...r].map(c=>c||' ').join``).join`
`

function update() {
  var n=+I.value
  O.textContent=F(n)
}

update()
pre { font-size: 8px }
<input id=I value=5 type=number oninput='update()'><pre id=O></pre>

edc65
источник
1

APL (Dyalog Unicode) , 65 64 байта SBCS

('_|'⍴⍨≢a)@a⍴∘''1+⌈/a←(⊢-⌊/)⌈2+/÷∘¯2 1¨11 9∘○¨+\0,(⊢,0j1×⌽)⍣⎕,1

Попробуйте онлайн!

(⊢,0j1×⌽)⍣⎕,1генерирует список шагов в виде комплексных чисел. Он начинается с 1и многократно добавляет ( ,) перевернутую ( ) копию списка, умноженную на 0j1= sqrt (-1).

+\0, предварять 0 и вычислять суммы префиксов

11 9∘○¨ разложить комплекс на (реальные; мнимые) пары

÷∘¯2 1¨ разделите реальные части на -2

2+/ суммы смежных пар

потолок

(⊢-⌊/) вычесть минимумы из всех, так что координаты неотрицательны

a← назначить на a

⍴∘''⊃1+⌈/ создайте пустую матрицу символов так, чтобы максимальные координаты могли соответствовать

('_|'⍴⍨≢a)@aпоставить поочередно _и |в координатах отa

СПП
источник