Нарисуйте диагональные линии текста


46

Учитывая ввод списка слов, выведите слова с их буквами, расположенными по диагонали:

p
 r
  o
p  g
 u  r
  z  a
a  z  m
 n  l  m
  d  e  i
c     s  n
 o        g
  d
g  e
 o
  l
   f

(Выше должно быть выход для ввода programming puzzles and code golf.)

Чтобы быть точным, каждое слово начинается с первого столбца и на три строки ниже предыдущего слова, а каждая последующая буква перемещается на один столбец вправо и на одну строку вниз.

Входные данные могут быть представлены либо в виде одной строки слов, разделенных ровно одним пробелом, либо в виде списка / массива слов. Слова будут состоять только из строчных букв a-zи всегда будут длиной не менее одного символа.

Вывод может быть одной строкой, массивом строк или массивом символов. Пробелы в начале или конце не допускаются, за исключением одного завершающего символа новой строки.

Дальнейшие тестовые случаи:

a bcd efgh i j

a


b
 c
  d
e
 f
  g
i  h


j

x

x

verylongword short

v
 e
  r
s  y
 h  l
  o  o
   r  n
    t  g
        w
         o
          r
           d

Поскольку это , победит самый короткий код в байтах!


Я чувствую, что смогу создать программу на Python для этого за 5 минут, но, похоже, она всегда терпит неудачу ...; _;
HyperNeutrino

Ух ты, похоже, есть много испытаний, казалось бы, предназначенных для Turtlèd
Destructible Lemon

Разрешены ли коды выхода терминала? :)
Chromium

Ответы:


17

Vim, 85, 76, 66 , 52 нажатия клавиш / байт

Когда я впервые посмотрел на этот вызов, я подумал: «Это идеально подходит для VIM!» А потом, когда я попробовал, все пошло не так. Вот оно, во всей его грязной хакерской славе:

:se ve=all|s/ /\r\r\r/g
qqGo<esc>?\<.\S
lDjP@qq@qG?.
jdG

Попробуйте онлайн, благодаря (в основном) обратно совместимому V-интерпретатору.

Объяснение:

Сначала я думал, что смогу сделать эту красивую простую 37-байтовую версию:

:se ve=all
qq:g/\S\S/norm ^lDjP
@qq@q

К сожалению, не все так просто. Давайте рассмотрим это построчно:

:se ve=all

Это включает функцию под названием «виртуальное редактирование». Это позволяет курсору перемещаться в столбцы, которые еще не существуют. Этот ответ был бы в принципе невозможен без него.

Теперь нам нужно разделить слова на разные строки. Таким образом, мы заменим каждый пробел 3 новыми строками. Так как это ex-команда, мы можем запустить ее одновременно с нашей последней ex-командой :se ve=all, разделив их двумя чертой.

|s/ /\r\r\r/g

Теперь буфер выглядит так:

Programming


Puzzles


and


code-golf

Здесь начинается самое интересное. Мы устанавливаем традиционный рекурсивный макрос с:, qqа затем вызываем это:

G               " Move to the last line
 o<esc>         " Append an extra newline

?               " Search backwards for
 \<.            " Any character at the beginning of a word
    \S          " Followed by a non-space character
l               " Move one character to the right
 D              " Delete eveything until the end of this line
  j             " Move down one line
   P            " Paste what we just deleted

Затем мы заканчиваем рекурсивный макрос с @qq@q. На данный момент у нас есть все диагонали, нам просто нужно немного почистить.

G                   " Move to the last line
 ?.                 " Search backwards for any character
j                   " Move down one line
 dG                 " Delete until the end of the buffer

Вау, JavaScript (в настоящее время) короче, чем Vim. Это довольно редкий случай в эти дни ...
ETHproductions

@ETHproductions Больше нет. :)
DJMcMayhem

6

Turtlèd , 28 26 байт

О боже, я, кажется, бью язык, специально разработанный для игры в гольф. это отличный день

!_4[*.[ rd+.]ul[ ul]r;_+]_

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

объяснение

(запись означает запись в ячейку на сетке, точечный символ означает символ на входе, на который указывает указатель строки)

!                         Take string input into variable
 _                        Normally conditional, with >1 input (there will be), write ' '
  4                       set register to 4
   [*                   ] until the current cell is *
     .                    Write pointed char, initially first char
      [     ]             Until space is written on cell
        rd+.              move right, down, string pointer++, write pointed char
             ul[ ul]      Move back up to the top of the word
                    r;    Move right, down 4 (because this is register value)
                      _+  write * if end of input, else ' ', increment string pointer
                        _ will always write ' ', since it will always point at start char

обратите внимание на конечный пробел.

Вход также нуждается в конце. видя, как python может взять список, это очень похоже на создание списка в Turtlèd


5

MATL , 28 байт

c!t&n:q3_*ts_b+5M4$XdZ!cZ{Zv

Input - это массив ячеек с запятыми в качестве необязательных разделителей:

{'programming' 'puzzles' 'and' 'code' 'golf'}

или же

{'programming', 'puzzles', 'and', 'code', 'golf'}

Попробуйте онлайн! Или проверьте все тестовые случаи: 1 , 2 , 3 , 4 .

объяснение

Рассмотрим следующий вход в качестве примера:

{'aaaa' 'bb' 'ccc'}

Вы можете просмотреть частичные результаты (содержимое стека), вставив символ комментария %в любой точке кода. Например, просмотрите содержимое стека после четвертой функции ( &n).

c        % Input cell array of strings implicitly. Convert to 2D char array,
         % right-padding with spaces
         % STACK: ['aaaa'; 'bb  '; 'ccc']
!        % Transpose
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  ']
t        % Duplicate
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '],
                  ['abc'
                   'abc'
                   'a c'
                   'a  '],
&n       % Number of rows and of columns
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, 3
:q       % Range, subtract 1
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 1 2]
3_*      % Multiply by -3
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 -3 -6]
ts_      % Duplicate, sum, negate
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 -3 -6], 9
b        % Bubble up in stack
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 9, 4
+        % Add
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 13
5M       % Push second input of last function again
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 13, 4
4$Xd     % Buld numerical sparse matrix from the above four arguments. The
         % columns of the first input argument will be the diagonals of the
         % result, with indices given bu the second input (negative is below
         % main diagonal). The matrix size is the third and fourth arguments
         % STACK: [97  0  0  0
                    0 97  0  0
                    0  0 97  0
                   98  0  0 97
                    0 98  0  0
                    0  0 32  0
                   99  0  0 32
                    0 99  0  0
                    0  0 99  0
                    0  0  0 32
                    0  0  0  0
                    0  0  0  0
                    0  0  0  0]
Z!c      % Convert from sparse to full, and then to char. Character 0 is
         % displayed as space
         % STACK: ['a   '
                   ' a  '
                   '  a '
                   'b  a'
                   ' b  '
                   '    '
                   'c   '
                   ' c  '
                   '  c '
                   '    '
                   '    '
                   '    '
                   '    ']
Z{       % Split into cell array, with each row in a cell
         % STACK: {'a   ', ' a  ', '  a ', 'b  a', ' b  ', '    ', 'c   ', ' c  ', '  c ', '   ', '   ', '   ', '   '}
Zv       % Deblank: remove trailing space from each string. Implicitly display,
         % each string on a different line. Empty strings do not generate
         % a newline
         % STACK: {'a   ', ' a', '  a', 'b  a', ' b', '', 'c', ' c', '  c', '', '', '', ''}

4

JavaScript (ES6), 118 109 84 байта

Принимает ввод как массив слов. Возвращает массив массивов символов.

s=>s.map((w,y)=>[...w].map((c,x)=>(a[p=y*3+x]=a[p]||Array(x).fill(' '))[x]=c),a=[])&&a

Альтернативная версия, 109 байт

Возвращает строку.


2

Common Lisp, 673 668 597 байт

Ужасное решение, я знаю. Я вероятно отредактирую это больше после некоторого сна.

(defun f(&rest z)(let((l)(a 0)(s)(o)(b)(c 0))(loop(setf b(length l))(setf l"")(loop for w in z for i from 0 do(if(>(+(length w)(* i 3))c)(setf c(+(length w)(* i 3))))(setf s(+(* i -3)a))(when(and(>= s 0)(< s(length w)))(setf o(format nil"~v@{~a~:*~}"s" "))(if(and(>=(- s 3)0)(not(equal i(-(length z)1))))(setf o(subseq o(- s 2))))(setf l(concatenate'string o(string(char w s))l)))(when(>= s(length w))(setf l(concatenate'string"   "l))))(if(<=(length l)b)(setf l(concatenate'string(format nil"~v@{~a~:*~}"(- b(length l)-1)" ")l)))(print(string-right-trim" "l))(if(>= b c)(return))(setf a(1+ a)))))

Использование:

* (f "ppcg" "is" "pretty" "ok")

"p" 
" p" 
"  c" 
"i  g" 
" s" 
"" 
"p" 
" r" 
"  e" 
"o  t" 
" k  t" 
"     y" 
""
NIL

Это перебирает каждое слово в предоставленном списке и добавляет соответствующие символы в текущую строку. Соответствующее дополнение обеспечивается моим использованием format.

Примечание: я новичок в Common Lisp, но знаю достаточно, чтобы понять, что в этом может быть много улучшений.


2
> :( "ppcg ... ok" !?
Разрушаемый лимон

2

C #, 336 байт:

Golfed:

string D(string[]s){int x=0,y=0,r=0,q=2*(s.Max().Length+s.Length)+1;var a=new char[q, q];for(int i=0;i<s.Length;i++){y=r;for(int j=0;j<s[i].Length;j++){a[y,x]=s[i][j];x+=1;y+=1;}x=0;r+=3;}var o="";for(x=0;x<q;x++){var t="";for(y=0;y<q;y++)t+=a[x,y];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\r\n");}return o;}

Ungolfed:

public string D(string[] s)
{
  int x = 0, y = 0, r = 0, q = 2 * (s.Max().Length + s.Length) + 1;
  var a = new char[q, q];
  for (int i = 0; i < s.Length; i++)
  {
    y = r;
    for (int j = 0; j < s[i].Length; j++)
    {
      a[y, x] = s[i][j];
      x += 1;
      y += 1;
    }
    x = 0;
    r +=3;
  }
  var o = "";
  for (x = 0; x < q; x++)
  {
    var t = "";
    for (y = 0; y < q; y++)
      t += a[x, y];
    o += t == string.Join("", Enumerable.Repeat('\0', q)) ? "" : (t.TrimEnd('\0') + "\r\n");
  }
  return o;
}

Тестирование:

  var codeGolf = new DrawDiagonalLinesOfText();
  Console.WriteLine(codeGolf.E(new string[] { "programming", "puzzles", "and", "code", "golf" }));
  Console.WriteLine(codeGolf.E(new string[] { "a", "bcd", "efgh", "i", "j" }));
  Console.WriteLine(codeGolf.E(new string[] { "verylongword", "short" }));

p
 r
  o
p  g
 u  r
  z  a
a  z  m
 n  l  m
  d  e  i
c     s  n
 o        g
  d
g  e
 o
  l
   f


a
b
 c
  d
e
 f
  g
i  h
j


v
 e
  r
s  y
 h  l
  o  o
   r  n
    t  g
        w
         o
          r
           d

Похоже, что это выводит пробелы в конце строк, что не допускается в спецификации вызова. Кроме того, требование строки пробелов для разделения слов во входном массиве не является допустимым форматом ввода.
Дверная ручка

@ Doorknob К сожалению, извините ... Исправлено, только стоило мне 2 байта :)
Пит Арден

1
Скомпилируйте в a Func<string[], string>и внесите другие изменения для 297 байтов, s=>{int i=0,x=0,y=0,r=0,l=s.Length,q=2*(s.Max().Length+l)+1,j;var a=new char[q,q];for(;i<l;i++){y=r;for(j=0;j<s[i].Length;)a[y++,x++]=s[i][j++];x=0;r+=3;}var o="";for(;x<q;x++){var t="";for(y=0;y<q;)t+=a[x,y++];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\n");}return o;};однако вам нужно добавить 18 байтов дляusing System.Linq;
TheLethalCoder

@TheLethalCoder Спасибо, но я не хочу принимать все ваше решение :)
Пит Арден

Это не мое, а ваше. Я просто отыграл некоторые вещи, то есть переместил thwe iи jк объявлению int вверху и переместил некоторые из ++них, чтобы они использовались при последнем использовании переменной
TheLethalCoder

2

Python 2, 146 байт

s=input()
k=max(map(len,s))
a=[k*[' ']for x in range(k+len(s)*3+3)]
for x in range(len(s)):
 for y in range(len(s[x])):a[x*3+y][y]=s[x][y]
print a

Примечание: отступы для последних двух строк - это <space>и <tab>, что сохраняет один байт, поскольку мне не нужно делать двойной отступ.

Ввод должен быть введен в виде массива строк, например: ["hello", "world"]или ['hello', 'world']. Вывод представляет собой массив массивов символов.

Вероятно, есть лучший способ сделать это ...

РЕДАКТИРОВАТЬ Спасибо Doorknob за указание на отсутствующую квадратную скобку. Я поместил его перед *k...третьей строкой.


Синтаксическая ошибка в вашем коде в третьей строке; есть две открытые скобки, но только одна закрывающая скобка. Однако я исправляю это (добавляя дополнительную закрывающую скобку или удаляя дополнительную открывающую скобку), программа выдает ошибку при запуске.
Дверная ручка

Похоже, теперь это выводит конечные пробелы в конце строк и в конце вывода, что не допускается в спецификации вызова.
Дверная ручка


@LeakyNun Спасибо. Вы просто играете в гольф и отвечаете на все мои ответы? : P
HyperNeutrino

1

Mathematica, 146 байт

P=PadRight;T=Transpose;R=Riffle;Select[Rest@T@P@MapIndexed[""~Table~#2~Join~#1&,T@P@R[Characters/@#~R~{},{},3]]//.{0->"",{x__,""}->{x}},#!={""}&]&

Я разочарован этим счетом, ну да ладно.

Определяет анонимную функцию, которая принимает список слов (например {"this","that","these"}) и возвращает двумерный массив символов. Чтобы просмотреть в виде сетки, добавьте //Gridв конце.

Преобразует строки в массив, добавляет дополнительные строки, транспонирует массив, добавляет необходимые сдвиги, затем снова транспонирует.

Пример результата (отформатированный как сетка): Пример результата


1

Желе , 24 байта

z⁶j€⁾  µJ’⁶ẋ;"z⁶œr€⁶Yœr⁷

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

Как?

z⁶j€⁾  µJ’⁶ẋ;"z⁶œr€⁶Yœr⁷ - Main link: a list of strings
z                        - transpose with filler...
 ⁶                       -     space character
  j€                     - join €ach with
    ⁾                    -     two spaces
       µ                 - monadic chain separation, call the result x
        J                - range(length(x)) [1,2,...,x]
         ’               - decrement (vectorises) [0,1,...x-1]
           ẋ             - repeat (vectorises)
          ⁶              - a space ['', ' ',...,'x spaces']
             "           - zip with
            ;            - concatenation (prefixes with the space strings)
              z          - transpose with filler...
               ⁶         -     space character
                œr€⁶     - trim spaces from the right of €ach
                    Y    - join with line feeds
                     œr⁷ - trim line feeds from the right
                         - implicit print

1

Python 2, 182 байта

def f(s):
 M=max(map(len,s));p=' '*M;L=[p]+s+M*[p];r='';k=0
 while k/M<len(s)*3+M:
  i=k%M;w=k/M-i+1;r+=(L[(w/3+1)*(w%3==1)]+p)[i];k+=1
  if i==M-1:r=r.rstrip()+'\n'
 return r.strip()

Немного длинный, но с положительной стороны, он возвращает строку без завершающего пробела в каждой строке и без конечного пробела или возврата в конце; ограничения, что некоторые другие записи не подчиняются.

Список слов передается в функцию; некоторые «пробелы» добавляются в этот список, а затем алгоритм отображает строку, пару столбцов в wordNumber, characterNumber в расширенном списке. (Это немного противоположно обычной стратегии, наблюдаемой в других решениях).

Если мы разрешаем использовать пробелы во всех строках, кроме последней, мы можем сделать немного лучше (163 байта):

def f(s):
 M=max(map(len,s));p=' '*M;L=[p]+s+M*[p];r='';k=0
 while k/M<len(s)*3+M:i=k%M;w=k/M-i+1;r+=(L[(w/3+1)*(w%3==1)]+p)[i]+'\n'*(i==M-1);k+=1
 return r.strip()

1

q / kdb +, 130 109 94 90 86 84 байта

Решение:

f:{-1(+)a rtrim(til(#)E){raze(x#" "),y,\:"  "}'E:(+)(a:{(max(#:)each x)$x})" "vs x;}

Примеры:

q)f "programming puzzles and code golf"
p          
 r         
  o        
p  g       
 u  r      
  z  a     
a  z  m    
 n  l  m   
  d  e  i  
c     s  n 
 o        g
  d        
g  e       
 o         
  l        
   f 
q)f "a bcd efgh i j"
a   


b   
 c  
  d 
e   
 f  
  g 
i  h


j  
q)f (),"x"
x
q)f "verylongword short"
v           
 e          
  r         
s  y        
 h  l       
  o  o      
   r  n     
    t  g    
        w   
         o  
          r 
           d

Объяснение (без присмотра):

Основная идея состоит в том, чтобы создать связку строк равной длины из входной строки, перевернуть (повернуть) их, затем добавить соответствующие пробелы, чтобы получить нечто похожее на это:

"p  p  a  c  g   "
" r  u  n  o  o  "
"  o  z  d  d  l "
"   g  z     e  f"
"    r  l        "
"     a  e       "
"      m  s      "
"       m        "
"        i       "
"         n      "
"          g     "

который переворачивается снова и выводится на стандартный вывод.

Вот строка за строкой концепции:

A:"programming puzzles and code golf"; // original input
B:" " vs A;                            // split on " "
C:max count each B;                    // find length of the longest string
D:C$B;                                 // pad each string to this length
E:flip D;                              // flip (rotate) string
F:{raze(x#" "),y,\:"  "};              // appends each char with "  " and prepends an increasing number of " "
G:(til count E)F'E;                    // execute function F with each pair of 0..n and item in list E
H:max count each rtrim G;              // find longest string (ignoring right whitespace)
I:H$G;                                 // pad each of the strings to this length
J:flip I;                              // flip to get result
-1 J;                                  // print to stdout, swallow return value

Примечания:

Несколько способов избавиться от (11) простых байтов, если мы действительно хотим:

  • Может сэкономить 2 байта, удалив f:и оставив как анонимную функцию
  • Не могли бы сохранить 3 байта, понижая -1и ;и возвращает список строк , а не печать на стандартный вывод
  • Может сэкономить 6 байт, если мы передадим список строк, а не разделенную пробелами строку

Редактирование:

  • -11 байт, используйте, rtrimчтобы найти максимальную длину для заполнения, устранена необходимость хранения Cпеременной
  • -15 байт, выключая max count eachлямбда-функцию, aкоторая создается один раз и используется дважды
  • -4 байта, перемещая razeв лямбда-функцию, чтобы сохранитьraze each
  • -4 байта, упрощена базовая лямбда-функция, которая добавляет пробел
  • -2 байта, используйте (+)как сокращение дляflip

1

Древесный уголь , 16 9 байт

WS«P↘ιM³↓

Мой первый угольный ответ. Спасибо @DLosc за предложение и вместо использования и (Перейти), чтобы вернуться к началу строки (и три вниз).

Попробуйте онлайн (подробно) или Попробуйте онлайн (чисто) .

Объяснение:

Цикл пока еще есть следующая строка ввода:

While(InputString()){ ... }
WS« ...

Напечатайте эту строку, не перемещая курсор вниз-вправо:

Multiprint(:DownRight, i);
P↘ι

А затем переместите три позиции вниз для следующей итерации:

Move(3, :Down);
M³↓

Когда для вызова требуется один вход, состоящий из массива, Charcoal завершается ошибкой, поскольку он разбивает входную строку, принимая каждое отдельное слово в качестве отдельного ввода. Но в Charcoal θпеременная представляет собой первый ввод, поэтому я просто назначаю тестовый ввод этой переменной в заголовке, а затем записываю оставшуюся часть кода, чтобы вы могли избавиться от αпеременной и перебрать разделенные элементы θ. Попробуйте онлайн! (Не конкурирует из-за лидирующих мест.)
Чарли

По крайней мере, никто не жаловался, когда я использовал этот трюк здесь . :-)
Чарли

@CarlosAlejo Я действительно сталкивался с вашим ответом, когда искал вдохновение в существующих ответах на древесный уголь. :)
Кевин Круйссен

IDK, метод, который я обычно использую, это просто строки + пустая строка в конце, если они многострочные, то ввод в виде массива python
только для ASCII

@CarlosAlejo Это было давно, но я просто использовал несколько строк с пустой строкой, чтобы прервать время (и забил 7 байтов одновременно). Видел, как он используется в одном из ответов Нейла , и теперь я вижу, что ASCII-только предлагал то же самое (как-то пропустил этот комментарий).
Кевин Круйссен

1

Japt -Rx, 17 16 13 байт

Принимает ввод как массив слов. Если бы разрешенные пробелы в каждой строке были разрешены, то последние 4 символа можно было бы удалить, чтобы связать с решением с древесным углем.

yÈmú3)iYçÃmx1

Попробуйте или запустите все тесты


объяснение

y                 :Transpose
 È                :Map each word at 0-based index Y
  m               :  Map each character
   ú3             :    Right pad with spaces to length 3
     )            :  End mapping
      i           :  Prepend
       Yç         :   Space repeated Y times
         Ã        :End mapping and transpose
          m       :Map
           x1     :  Trim right
                  :Implicitly join with newlines, trim and output

1

К4 , 58 байт

Решение:

+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:

Примеры:

q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:("programming";"puzzles";"and";"code";"golf")
"p          "
" r         "
"  o        "
"p  g       "
" u  r      "
"  z  a     "
"a  z  m    "
" n  l  m   "
"  d  e  i  "
"c     s  n "
" o        g"
"  d        "
"g  e       "
" o         "
"  l        "
"   f       "
q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:(,"a";"bcd";"efgh";,"i";,"j")
"a   "
"    "
"    "
"b   "
" c  "
"  d "
"e   "
" f  "
"  g "
"i  h"
"    "
"    "
"j   "
q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:("verylongword";"short")
"v           "
" e          "
"  r         "
"s  y        "
" h  l       "
"  o  o      "
"   r  n     "
"    t  g    "
"        w   "
"         o  "
"          r "
"           d"

Объяснение:

Строки правой панели, так что они имеют одинаковую длину, транспонируют, соединяют с " "левой панелью, чтобы сгенерировать диагонали, затем правой клавишей, чтобы исправить длину и транспонировать обратно Принимает список строк и возвращает список строк. Вероятно, пригодный для игры в гольф, но все еще короче, чем мое решение q / kdb +.

+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:
                                                        x:      / save as variable x
                                                       $        / pad
                                             (        )         / do this together
                                                  #:'x          / count (#:) each (') x
                                                |/              / max
                                              c:                / save as variable c
                                            +                   / flip / transpose
                                           $                    / string ($)
                                    "  "/:'                     / join each with "  "
                                   $                            / pad
                      (           )                             / do this together
                                #x                              / count (#) x
                              3*                                / multiply by 3
                             +                                  / add to
                         (  )                                   / do this together
                          !c                                    / range 0..c
                       2-                                       / subtract from 2
                    x:                                          / save as x:
                   $                                            / pad
 (                )                                             / do all this together
    {         }@'x                                              / apply (@) lambda {} to each x
            ^x                                                  / null (^) x (" " is considered null)
           ~                                                    / not
          |                                                     / reverse
        |\                                                      / max (|) scan (\), maxs
     0+/                                                        / sum (+) over (/) starting with 0
  |/                                                            / max (|) over (/), max
+                                                               / transpose


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.