Esolang-Комментарий-Template-генератор


42

Многие люди на этом сайте используют эзотерические языки , и, поскольку эти языки необычны и трудны для понимания, они часто пишут объяснения в определенном формате. Например, если код

abcdefghijklmnop

И эти языки используют #для комментариев, они написали бы объяснение так:

a                #Explanation of what 'a' does
 bc              #Bc
   d             #d
    e            #Explanation of e
     fgh         #foobar
        ij       #hello world
          k      #etc.
           l     #so on
            mn   #and
              op #so forth

Я тоже часто это делаю, но каждый раз, когда я делаю это, я чувствую, что создание макета текста действительно неприятно и отнимает много времени. Поэтому я хочу, чтобы вы создали для меня «Esolang-Comment-Template-Generator». Например, если мы игнорируем комментарии, предыдущий код имеет этот шаблон:

a                #
 bc              #
   d             #
    e            #
     fgh         #
        ij       #
          k      #
           l     #
            mn   #
              op #

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

Вы должны написать программу или функцию, которая принимает в качестве входных данных две строки и выводит этот «Esolang-Comment-Template». Первым вводом будет код, но со штрихами ( |), вставленными туда, куда идут новые строки. Второй вход - то, что мы будем использовать для комментариев. Так что наш последний пример будет иметь это для ввода:

"a|bc|d|e|fgh|ij|k|l|mn|op", "#"

К сожалению, это исключает использование баров как часть ввода кода, но это нормально. Вы можете предположить, что ввод комментария будет одним символом. Ради простоты, символ комментария не будет панелью. Введенный код будет содержать только печатный ASCII и не будет содержать никаких новых строк.

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

Вы должны разделить ввод кода на «секции кода» на каждой панели. Затем каждая часть кода выводится в отдельной строке и дополняется слева до длины всего предыдущего кода (не считая столбцов). Затем каждая строка дополняется справа пробелами, чтобы последние два символа в каждой строке были «Один дополнительный пробел» + «Символ комментария».

Один завершающий перевод строки разрешен.

Вот еще один пример. Для ввода

"Hello|World", "/"

Первый раздел кода является «Hello» , а второй «Мир». Таким образом, он должен дать вывод:

Hello      /
     World /

Вот еще несколько примеров:

Input:
"a|b|c|d|e|f|g", ","

Output:
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

Input:
"abcdefg", ":"

Output:
abcdefg :

Input:
"4|8|15|16|23|42", "%"

Output:
4          %
 8         %
  15       %
    16     %
      23   %
        42 %

Input:
"E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!", "!"

Output:
E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

Input:
"This|Code|has||empty||sections", "@"

Output:
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

Правила:

Вы можете использовать эти входы и выходы в любом разумном формате. Например, чтение / запись файла, STDIN / STOUT, аргументы функции / возвращаемое значение и т. Д. Как обычно, это , поэтому постарайтесь сделать свой код максимально коротким, и вы выиграете, если сможете найти самое короткое решение на вашем языке! Я также выберу самое короткое решение в качестве победителя. Стандартные лазейки запрещены.



Разрешены ли конечные пробелы?
Тит

30
Следующий шаг: 3D-представление для 2D-языков
Аарон

3
Бонус, если вам удастся сделать это без использования |персонажа, был бы
неплох

Может ли символ комментария быть панелью ( |)?
Тон Хоспель

Ответы:



9

Сетчатка , 35 34 байта

Число байтов предполагает кодировку ISO 8859-1.

\|
·$'¶$`±
T0-2`·±|p`___ `.+±.|·.+

Две входные строки разделены пробелом (что однозначно, так как мы знаем, что разделитель комментариев всегда является одним символом).

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


1
Зачем вам нужен пробел для разграничения строк? Поскольку это один символ, он может быть последним.
Адам

1
@ Adám Я использую его в качестве разделителя пробелов в конечном выводе.
Мартин Эндер

9

Java 10, 189 159 байт

s->c->{var r="";int p=0,i;for(var a:s.split("\\|")){for(i=p;i-->0;r+=" ");r+=a;for(p+=a.length();i++<s.replace("|","").length()-p;r+=" ");r+=c+"\n";}return r;}

-30 байт для преобразования Java 7 в Java 10 и оптимизации циклов.

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

Объяснение:

s->c->{                     // Method with String & char parameters and String return-type
  var r="";                 //  Result-String, starting empty
  int p=0,                  //  Position-integer, starting at 0
      i;                    //  Index integer
  for(var a:s.split("\\|")){//  Loop over the parts split by "|"
    for(i=p;i-->0;r+=" ");  //   Add `p` amount of spaces to the result-String
    r+=a;                   //   Add the current part to the result-String
    for(p+=a.length();      //   Add the length of the current part to the position-integer
        i++<s.replace("|","").length()-p;r+=" ");
                            //   Add the row's trailing spaces to the result-String
    r+=c+"\n";}             //   Add the character and a new-line to the result-String
  return r;}                //  Return the result-String


4

JavaScript (ES6), 92 байта

f=
(s,c)=>s.split`|`.map((_,i,a)=>a.map((e,j)=>i-j?e.replace(/./g,` `):e).join``+` `+c).join`
`
;
<div oninput=o.textContent=f(s.value,c.value)><input id=s placeholder=Code><input id=c size=1 maxlength=1 value=#><pre id=o>


4

GNU sed (85 + 1 для -r) 86

:s;h;:;s,\|( *)[^ \|](.),|\1 \2,;t;s,\|,,g
p;g;:l;s,^( *)[^ \|],\1 ,;tl;s,\|,,;/\S/bs

Входные данные представляют собой строки, разделенные пробелом.

Тесты:
input.txt:

a|b|c|d|e|f|g ,
abcdefg :
4|8|15|16|23|42 %
E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last! !
This|Code|has||empty||sections @

Выход:

$ cat input.txt | sed -rf template
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

abcdefg :

4          %
 8         %
  15       %
    16     %
      23   %
        42 %

E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

Безымянный ярлык :- это особенность / ошибка GNU sed, и \Sя думаю, что это расширение, так что, возможно, заголовок должен быть GNU sed. Кроме этого, отличный код.
Сешумара

@seshoumara Спасибо!
Райли

3

Haskell, 139 135 байтов

s#p=j$foldl g("",0)s where g(a,n)c|c=='|'=(j(a,n)++"\n"++q n,n)|1>0=(a++[c],n+1);q m=' '<$[1..m];j(a,n)=a++q(sum[1|c<-s,c/='|']-n+1)++p

Сохранено 4 байта путем вставки определения.

Ungolfed:

template :: String -> String -> String
template code comment = format $ foldl g ("", 0) code
    where g (acc, n) c
            | c == '|' = (format (acc, n) ++ "\n" ++ spaces n, n)
            | otherwise = (acc ++ [c], n+1)
          l = length $ filter (/= '|') code
          spaces n = replicate n ' '
          format (acc, n) = acc ++ spaces (l-n+1) ++ comment

3

Groovy, 120 113 111 байт

def m(s,c){s.split(/\|/).inject(0,{e,t->println((' '*e+t).padRight(s.replace('|','').size()+1)+c);e+t.size()})}

ungolfed *

def m(s,c){
  s.split(/\|/).inject(0, { e, t ->
    println((' '*e+t).padRight(s.replace('|','').size())+' '+c)
    e+t.size()
  })
}

(Первый проект с 120 байтами)

def m(s,c){def l=0;s.split(/\|/).collect{l+=it.size();it.padLeft(l).padRight(s.replace('|','').size())+' '+c}.join('\n')}

ungolfed *

def m(s,c){
  def l=0 // minimized version needs a semicolon here
  s.split(/\|/).collect{
    l+=it.size() // minimized version needs a semicolon here
    it.padLeft(l).padRight(s.replace('|','').size())+' '+c
  }.join('\n')
}

тесты

%> m('a|bc|d|e|fgh|ij|k|l|mn|op', '#')
a                #
 bc              #
   d             #
    e            #
     fgh         #
        ij       #
          k      #
           l     #
            mn   #
              op #

%> m('Hello|World', '/')
Hello      /
     World /

%> m('a|b|c|d|e|f|g', ',')
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

%> m('abcdefg', ':')
abcdefg :

%> m('4|8|15|16|23|42', '%')
4          %
 8         %
  15       %
    16     %
      23   %
        42 %

%> m('E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!', '!')
E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

%> m('This|Code|has||empty||sections', '@')
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

Как насчет.padRight(s.replace('|','').size()+1)+c)
AmazingDreams

отличная идея! Спасибо! сохранил еще 2 символа!
Норганос

3

Python 2, 125 124 132 байта

-1 байт благодаря @TuukkaX (не хватало места для игры в гольф i, v)

def g(s,c):x=s.split('|');print((' '+c+'\n').join(' '*len(''.join(x[:i]))+v+' '*len(''.join(x[i+1:]))for i,v in enumerate(x))+' '+c)

Все тестовые случаи на ideone


1
Вы должны использовать cв качестве комментария символ, а не #.
Оливер Ни

@OliverNi - это был хит для кода в его нынешнем виде.
Джонатан Аллан

3

Python 2, 107 105 102 99 байт

Протестировано со всеми тестовыми примерами выше

РЕДАКТИРОВАТЬ Отбросил 2 байта, изменив d = a.split ("|"); i = 0 на d, i = a.split ("|"), 0 Не уверен, как я пропустил этот. Спасибо @ Оливер Ни

Еще 3 байта прошло. Еще раз спасибо.

Предложение от @Jonathan на самом деле экономит 3 байта и сводит его к волшебству 99. Спасибо.

def c(a,b):
 d,i=a.split("|"),0
 for e in d:j=i+len(e);print" "*i+e+" "*(len("".join(d))-j+1)+b;i=j

1
Гольфил это вниз еще один байт
Оливер Ni

3
Эй @OliverNi, предоставляя советы для игры в гольф вещи вниз ценится, но для редактирования кода на самом деле не ассигновать на этом сайте ( источник ), поэтому я откатить ваши изменения. Не стесняйтесь размещать эти советы в качестве комментария, хотя! Я уверен, что ОП был бы признателен за это, но они должны проверить его и решить, хотят ли они его использовать.
DJMcMayhem

1
Спасибо вам обоим. Во-первых, @Oliver за проявленный интерес и время, чтобы улучшить мои скромные усилия, и, во-вторых, DJMcMayhem за разъяснение того, что я считаю, но у меня не было возможности прокомментировать. Оливер - еще раз спасибо и, пожалуйста, не стесняйтесь публиковать изменения в качестве комментариев, чтобы я мог учиться на вашем опыте игры в гольф.
ElPedro

1
Вы можете убрать круглые скобки, " "*iчтобы получить 2 байта
Оливер Ни

1
Вы можете также установить переменную len(e)хотел for e in d:z=len(e)....сохранить байт , поскольку он используется дважды
Оливер Ni

3

05AB1E , 29 38 31 29 байт

'|„ǝʒ:'ǝ¡'ʒмεD®>úsg®+©s}.Bεð²J,

Можно определенно играть в гольф, но, по крайней мере, сейчас он работает ..
+9 байт, потому что ¡(split) автоматически удаляет пустые элементы, поэтому мне пришлось добавить '|„ǝʒ:'ǝ¡'ʒм..
-2 байта благодаря @MagicOctopusUrn , изменив '|„ǝʒ:'ǝ¡'ʒмна '|¶:.BεðÜ}(текущее решение не работает на элементы с конечными пробелами, но я предположил, что это разрешено в соответствии с тестовыми примерами).

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

Объяснение:

'|¶:           # Take the first input, and replace every "|" with "¶"
               #  i.e. "abc|d|e||fg" → "abc¶d¶e¶¶fg" (¶ are new-lines in 05AB1E)
    .B         # Box all the items (appending trailing whitespace to make it a rectangle)
               #  i.e. "abc¶d¶e¶¶fg" → ['abc','d  ','e  ','   ','fg ']
      εðÜ}     # Remove all trailing spaces from each item
               #  i.e. ['abc','d  ','e  ','   ','fg '] → ['abc','d,'e','','fg']
               #  NOTE: `'|¡` would have resulted in ['abc','d','e','fd'], hence the use of
               #        Box which implicitly splits on new-lines to keep empty items
ε              # For-each:
 D             #  Duplicate the current item
  ®>ú          #  Prepend global_variable + 1 amount of spaces
               #  (+1 because the global_variable is -1 by default)
               #   i.e. "e" and 3+1 → "    e"
 sg            #  Swap so the duplicated item is at the top, and take its length
   ®+          #  Sum it with the global_variable
               #   i.e. "e" (→ 1) and 4 → 5
     ©         #  And store it as new global_variable
      s        #  Then swap so the space appended item is at the end again
       }       # And end the for-each loop
.B             # Box all the items (appending the appropriate amount of spaces)
               #  i.e. ['abc','   d','    e','     ','     fg']
               #   → ['abc    ','   d   ','    e  ','       ','     fg']
ε              # For-each again:
 ð             #  A space character
  I            #  The second input-character
   J           #  Join both together with the current item
    ,          #  And print the current row with trailing new-line

Это неверно, если код должен был содержать ǝʒ. '|¶:.Bможет работать
Волшебная Урна Осьминога

@MagicOctopusUrn В описании задачи говорится: « Ввод кода будет содержать только печатную версию ASCII и не будет содержать новых строк. » Кроме того, какую часть кода следует заменить '|¶:.B?
Кевин Круйссен

Я думал, что это будет более короткий сплит, но он не сработает с вашим текущим кодом, просто добавив его, вам придется сократить лишнее. ИЛИ просто игнорируйте лишнее и .Bвторой раз после добавления в предшествующие пробелы.
Волшебная Осьминог Урна

@MagicOctopusUrn Это действительно может сэкономить несколько байтов, так как мой текущий обходной путь довольно длинный, но будет сложнее вычислить количество предшествующих пробелов с пробелами после .Bуже существующего.
Кевин Круйссен

1
'|¶:.BεðÜ}εD®>úsg®+©s}.BεðIJ,? 29 байт. Вернемся к итерации 1 :). .Bразбивает на новые строки, это особенность, о которой мало кто знает. Это единственный способ сохранить пустые элементы. Я бы попросил это как особенность. должно означать разделение, но держать пустые элементы ..
Волшебная урна осьминога

2

PowerShell v2 +, 103 99 байт

param($a,$b)$a-split'\|'|%{" "*$l+$_+" "*(($a-replace'\|').length+1-$_.length-$l)+$b;$l+=$_.Length}

Принимает входные данные в виде двух строк, -splits первой в буквальном канале (поскольку split использует синтаксис regex), и передает элементы в цикл |%{...}.

На каждой итерации мы создаем строку как число пробелов, определенных как $lсцепленные с текущим элементом. Для первого цикла $lинициализируется значением $null, которое здесь оценивается как 0.

Эта строка далее объединяется с другим количеством пробелов (определяемых тем, как долго $aбудет, если мы будем делать -replaceкаждый канал пустым, плюс 1для дополнительного заполнения между кодом и комментариями, минус .lengthтекущий элемент, минус $lчисло пробелов, которое мы дополнили оставил на этой итерации), соединенный с нашим комментарием персонажа $b. Это осталось на конвейере.

Затем мы обновляем $lдля следующей итерации.

Результирующие строки все остаются в конвейере, и вывод через неявный Write-Outputпроисходит при выполнении программы, с новой строкой между ними по умолчанию.

Примеры

PS C:\Tools\Scripts\golfing> .\esolang-comment-template-generator.ps1 "This|Code|has||empty||sections" "@"
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

PS C:\Tools\Scripts\golfing> .\esolang-comment-template-generator.ps1 "a|bc|def|ghi|h" "|"
a          |
 bc        |
   def     |
      ghi  |
         h |

2

Vim, 39 38 нажатий клавиш

-1 байт благодаря DJMcMayhem

Ожидается в качестве входных данных буфер (например, файл), первым символом которого является разделитель комментариев, за которым следует код, например #foo|bar|baz.

"cxqaf|m`Yp<Ctrl+o>v$r jv0r x@aq@a$p<Ctrl+v>gg$C <Ctrl+r>c<Esc>

объяснение

_» обозначает буквальное пространство.)

"cx          " Delete the first character (the comment delimiter) and store in register 'c'
qa           " Start recording macro 'a'
f|m`         " Advance to the first '|' on the line and set mark
Yp<Ctrl+o>   " Duplicate this line and return to mark
v$r_         " Replace everything after the cursor on this line (inclusive) with spaces
jv0r_x       " Go down a line and replace everything before the cursor on this line (inclusive) with
             "   spaces, then delete one space
@a           " Call macro recursively
q@a          " Stop recording and immediately call the macro
$p           " Paste the deleted space at the end of the last line
<Ctrl+v>gg$       " Highlight the column where the comment delimiters will go and all trailing spaces
C_<Ctrl+r>c<Esc>  " Replace the highlighted text on each line with a space and the contents of
                  "   register 'c' (the comment delimiter)

1
: D Я всегда приветствую Vim! Я думаю, что вы могли бы снять один байт, если вы измените mmна, m`а затем измените `mна<C-o>
DJMcMayhem

@DJMcMayhem Спасибо! Я люблю играть в гольф в Vim, потому что я всегда узнаю кое-что об инструменте, которым пользуюсь каждый день.
Иордания

2

Флорид - 94 байта

Ah(a,b):c=a.fn("|");z(" "+b+"\n".y(' '*Z("".y(c[:j]))+l+" "*Z("".y(c[j+1:]))Kj,lIai(c))+' '+b)

Использует подход, аналогичный решению @ JonathanAllan 's Python.

Testcases

Call: h("a|bc|d|e|fgh|ij|k|l|mn|op", "#")
Output: 
a                #
 bc              #
   d             #
    e            #
     fgh         #
        ij       #
          k      #
           l     #
            mn   #
              op #

2

C # 176 167 154 байта

string f(string s,char x){var c=s.Split('|');var d="";int i=0;foreach(var b in c)d+=b.PadLeft(i+=b.Length).PadRight(s.Length+2-c.Length)+x+"\n";return d;}

UnGolfed

string f(string s, char x)
{
    var c = s.Split('|');
    var d = "";
    int i = 0;
    foreach (var b in c)
        d += b.PadLeft(i += b.Length).PadRight(s.Length + 2 - c.Length) + x + "\n";
    return d;
}

Решение LINQ было бы 146, но требовалось using System.Linq;довести его до 164:

string f(string s,char x){var c=s.Split('|');int i=0;return c.Aggregate("",(g,b)=>g+b.PadLeft(i+=b.Length).PadRight(s.Length+2-c.Length)+x+"\n");}

Старые решения:

167 байт:

string f(string s,char x){var c=s.Split('|');var d="";int i=0;foreach(var b in c){d+=b.PadLeft(i+b.Length).PadRight(s.Length+2-c.Length)+x+"\n";i+=b.Length;}return d;}

176 байт с использованием интерполяции строк

string f(string s,char x){var c=s.Split('|');var d="";int i=0;foreach(var b in c){d+=string.Format($"{{1,{i}}}{{0,-{s.Length+2-c.Length-i}}}{x}\n",b,"");i+=b.Length;}return d;}

1

PHP, 120 117 116 110 109 байт

foreach($a=split('\|',$argv[1])as$i=>$t){$c=preg_replace('#.#',' ',$a);$c[$i]=$t;echo join($c)," $argv[2]
";}

или

foreach($a=split('\|',$argv[1])as$t){$c=preg_replace('#.#',' ',$a);$c[$i++|0]=$t;echo join($c)," $argv[2]
";}

1

MATL , 33 31 байт

'\|'0'|'hYXo8M&YbY:&YdtaZ)0ihYc

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

объяснение

Встроенная функция Yd( blkdiag), которая строит блочно-диагональную матрицу из своих входов, выполняет большую часть работы. Значения заполнения в матрице равны 0, а char 0 рассматривается как пробел для отображения. Код просто делится на части |, строит матрицу из получающихся блоков, преобразует в char и добавляет два столбца с пробелом и символом комментария.

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

Чтобы решить эту проблему, мы вводим символ 0 перед каждым |, поэтому ни один блок не будет пустым; и затем в полученной матрице символов мы удаляем столбцы, которые образованы только символом 0. Непустой раздел кода будет иметь некоторый печатный символ ASCII, и, следовательно, столбцы, которые он охватывает, сохранятся. Пустой раздел добавит строку, но не добавит дополнительный столбец.

'\|'    % Push this string: source for regexp matching. It's just | escaped
0'|'h   % Push a string formed by char 0 followed by | (no escaping needed)
YX      % Input string implicitly. Replace first of the above string by the second
o       % Convert from chars to code points. Gives a numeric vector
8M      % Push '|' again
&Yb     % Split numeric vector at occurences of | (the latter is automatically
        % converted  to its code point). This gives a cell array of numeric vectors
Y:      % Unbox cell array: pushes the numeric vectors it contains
&Yd     % Form a block-diagonal matrix from those vectors
ta      % Duplicate. Compute vector that equals true for columns that have some
        % nonzero value
Z)      % Used that as a logical index (mask) for the columns of the matrix.
        % This removes columns that contain only zeros
0ih     % Input comment symbol and prepend char 0 (which will be displayed as space)
Yc      % Append that to each row of the matrix. The matrix is automatically 
        % converted from code points to chars
        % Display implicitly

1
Я смутно разочарован тем, что вы не поместили свое объяснение в формате, упомянутом ОП
Random832

1
@ Random832 Я не часто использую этот формат. Он занимает много места, оставляя мало места для объяснений
Луис Мендо

Зачем нужен побег в первой строке?
Конор О'Брайен

@ ConorO'Brien Хороший вопрос. Я никогда не знаю, какие / когда специальные символы нужно экранировать, а какие / когда нет. В этом случае |( соответствует подвыражению до или после| ) это действительно нужно, по крайней мере, в движке регулярных выражений Matlab / Octave
Луис Мендо

1

Pyth, 30 байт

VJcE\|s[*ZdN*h--lsJZlNdQ)=+ZlN

или

jm+dQ.t.t+MC,.u*l+NYdJc+Ed\|kJ

Обе полные программы, которые принимают на STDIN ввод строки комментария, а затем строку программы, разделенную символом новой строки.

Попробуйте первую версию онлайн

Попробуйте вторую версию онлайн

Как они работают

VJcE\|s[*ZdN*h--lsJZlNdQ)=+ZlN  Program. Inputs: E, Q
  cE\|                          Split E on "|"
 J                              Assign to J
                                Implicit Z=0
V                               For N in that:
       [                )        Create a list with elements:
        *Zd                       Z spaces
           N                      N
               -lsJZ              len(concatenate(J))-Z
              -     lN             -len(N)
             h                     +1
            *         d            spaces
                       Q          Q
      s                          Concatenate the list
                                 Implicitly print
                        =+ZlN    Z=Z+len(N)

jm+dQ.t.t+MC,.u*l+NYdJc+Ed\|kJ  Program. Inputs: E, Q
                       +Ed      Add a trailing space to E
                      c   \|    Split that on "|"
                     J          Assign to J
             .u                 Cumulatively reduce J with:
                            k    starting value empty string and
                                 function N, Y ->
                l+NY              len(N+Y)
               *    d             spaces
            ,                J  Two-element list of that and J
           C                    Transpose
         +M                     Map concatenation over that
       .t                       Transpose, padding with spaces
     .t                         Transpose again
 m+dQ                           Map concatenation with Q over that
j                               Join on newlines
                                Implicitly print

1

Dyalog APL 16,0 (неконкурентный), 43 37 байт

Запрашивает комментарий, затем код.

↑(↓↑((-(⍸'|'∘=),≢)↑¨'|'∘≠⊆⊢)⍞),¨⊂¯2↑⍞

Не конкурирует, потому что версия 16.0 новее этой проблемы.


Как Dyalog APL не конкурирует до сих пор? Это все еще в dev?
DJMcMayhem

@DJMcMayhem Да. Я работаю на Dyalog и имел доступ к 16.0 еще до выхода 15.0. Выпуск 16.0 запланирован на 2017 год.
Адам

Как это работает?
Конор О'Брайен

1

Perl, 63 байта

Включает +5 для -Xpi

Запустить с вводом на STDIN и символом комментария после -i:

perl -Xpi% esolang.pl <<< "Ab|Cd||ef"

esolang.pl:

s/
/|/;s%(.*?)\|%$"x$`=~y/|//c.$1.$"x$'=~y/|//c." $^I
"%eg

Совершенно скучное простое решение


1

Turtlèd , 35 байт (неконкурентный)

Требуется один ввод, последний символ - символ комментария. Не работает с символом комментария как пробел, но я предполагаю, что в этом нет необходимости.

!' [*.+(|' dl)r_]' r[*+.(|u)_][ .d]

Объяснение:

!                                  take input into string variable
 '                                 write space over current cell
   [*           ]                  while cell is not *
     .+                            write pointed char of string, stringpointer+1 (starts 0)
       (|    )                     if current cell is |
         ' dl                      write space (over |), move down, left
              r_                   move right, write * if pointed char is
                                   last char, else space

                 ' r               write space, move right
                    [*       ]     while cell is not *
                      +.           increment pointer and write pointed char
                        (|u)       if cell is |, move up
                            _      write * if the pointed char is the last char

                              [   ] while cell is not space
                                .d  write the pointed char from string, move down 


0

Scala, 123 байта

def?(i:String,c:String)={var b=0
i.split('|').map{s=>println(" "*b+s+" "*(i.replace("|","").size-b-s.size+1)+c)
b+=s.size}}

Тестовый код + Выход:

?("a|b|c|d|e|f|g", ",")
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

?("abcdefg", ":")
abcdefg :

?("4|8|15|16|23|42", "%")
4          %
 8         %
  15       %
    16     %
      23   %
        42 %

?("E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!", "!")
E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

?("This|Code|has||empty||sections", "@")
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

0

Рубин, 96 80 байт

->s,c{s.gsub(/(^|\|)([^|]*)/){" "*$`.count(t="^|")+$2+" "*(1+$'.count(t))+c+$/}}

Смотрите это на eval.in: https://eval.in/639012

Я действительно должен просто изучить Retina.


0

Желе , 41 байт

Похоже, что это имеет много раз, и, вероятно, слишком много ссылок ...

ṫø⁹‘‘µFL‘⁶ẋ
‘ị
ḣFL⁶ẋ$;ç@;1ŀ
J’ç@€
ṣ”|Ç;€Y

Проверьте это в TryItOnline

Как?

ṫø⁹‘‘µFL‘⁶ẋ  - link 1: get the spaces for after the code, dyadic(split string, index)
 ø           - next chain as a nilad
  ⁹‘‘        - right argument incremented twice (the index we actually want)
ṫ            - tail (get the rest of the split string)
     µ       - next chain as a monad
      FL‘    - flatten, get its length and increment
         ⁶   - a space character " "
          ẋ  - repeat the space character that many times

‘ị           - Link 2: get the code for a line dyadic(index, split string)
‘            - increment the index
 ị           - retrieve the string at that index

ḣFL⁶ẋ$;ç@;1ŀ - Link 3: get the code and join with spaces, dyadic (index, split string)
ḣ            - head: split string[index:]
 FL          - flatten and get its length
     $       - previous two atoms as a monad
   ⁶         - a space character, " "
    ẋ        - repeat the space that many times
      ;      - concatenate with
       ç@    - the result of the previous link (the code) - reverse inputs
         ;   - concatenate with
          1ŀ - the result of Link 1 (the spaces after the code)

J’ç@€        - Link 3: a for loop, monadic(split string)
J’           - [0,...,Len(split string)-1]
  ç@€        - the result of the previous link, with revered inputs, for each

ṣ”|Ç;€Y      - Main Link: dyadic(code string, comment character)
ṣ”|          - split on "|"
   Ç         - the result of the previous link
    ;€       - concatenate each with the comment character
      Y      - join with line feeds
             - implicit print

0

CJam, 32 байта

l'|/_s,)L@{1$,S*\+}%@f{Se]}lN+f+

объяснение

l                                  get code string
 '|/                               split into code parts
    _s,)                           length of all the parts +1
        L@{1$,S*\+}%               left pad spaces to every part for the length of the previous parts
                    @f{Se]}        right pad spaces
                           lN+f+   add comment character and newline

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


0

GolfScript, 85 байт

{(;);}:r;", "%(r\(r n+:c;;.,\'|'%.,@\-)):l;0:m;{.,0>}{" "m*\(.,m+:m l\-" "\*+c@}while

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

Обновление 2017 - GolfScript - 71 байт

', '/~~:c;~1/.,\.{'|'=},,@\-):l;['|']/0:i;{.,i+:i l i-' '*c+\' '*"
"\}/

объяснение

', '/~~:c;~1/        # Parses input
.,\.{'|'=},,@\-):l;  # Computes string length without '|'
['|']/               # Splits the array
0:i;                 # Counter
{.,                  # Length of the substring
i+:i                 # Counter update
l i-' '*c+\          # Adds spaces after the substring 
' '*"\n"\            # Adds spaces before the next substring
}/                   # ...For each substring

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