Esolang评论模板生成器


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”,第二部分是“ World”。所以它应该给出输出:

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,函数参数/返回值等。通常,这是,因此,请尝试使代码尽可能短,如果可以得到最短的解决方案,则可以获胜。用你的语言!我还将选择最短的解决方案作为总冠军。禁止出现标准漏洞



是否允许尾随空格?
泰特斯(Titus)

30
下一步:用于2D语言3D表示
亚伦

3
如果您在不使用|角色的情况下成功做到了,那就会很不错,所以您可以自己解释一下
WorldSEnder

注释字符可以是竖线(|)吗?
Ton Hospel '16

Answers:



9

视网膜35 34字节

字节数假定为ISO 8859-1编码。

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

两个输入字符串之间用空格分隔(这是明确的,因为我们知道注释定界符始终是单个字符)。

在线尝试!


1
为什么需要空格来分隔字符串?由于它是单个字符,因此可能只是最后一个字符。
–Adám16年

1
@Adám我将其用作最终输出中的空格分隔符。
Martin Ender

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 for -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

@seshoumara谢谢!
莱利

3

Haskell,139135字节

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个字节。

取消高尔夫:

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()})}

不打高尔夫球*

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')}

不打高尔夫球*

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

好主意!谢谢!保存了另外两个字符!
norganos '16

3

Python 2,125 124 132字节

感谢@TuukkaX -1个字节(缺少从打高尔夫球的空间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-嗯,这对当前形式的代码很受欢迎。
乔纳森·艾伦,2013年

3

Python 2,107 105 102 99字节

经过以上所有测试案例的测试

编辑通过将d = a.split(“ |”); i = 0更改为d,i = a.split(“ |”),0,获得了2个字节。不知道我如何错过那个字节。谢谢@Oliver Ni

另外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
击倒另一个字节
Oliver Ni

3
嘿@OliverNi,提供了有关打高尔夫球的技巧的提示,我们很感激,但是在此站点上()确实不适合编辑代码,因此,我已撤消了您的编辑。请随意发布这些提示作为评论!我敢肯定OP会很感激的,但是应该由他们来测试它并选择是否要使用它。
DJMcMayhem

1
感谢你们俩。首先向@Oliver表示兴趣并抽出时间改善我的谦虚努力,其次向DJMcMayhem澄清我认为的情况,但没有机会发表评论。奥利弗(Oliver)-再次感谢您,请随时发表更改作为评论,以便我从您的高尔夫经验中学习。
ElPedro

1
您可以删除括号" "*i以保留2个字节
Oliver Ni

1
您还可以将变量设置为len(e)喜欢for e in d:z=len(e)....保存一个字节,因为该变量被使用了两次
Oliver Ni

3

05AB1E29 38 31 29 字节

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

绝对可以打高尔夫球,但至少现在可以使用。
+9个字节,因为¡(拆分)会自动删除空项目,因此我不得不添加'|„ǝʒ:'ǝ¡'ʒм..
-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}

将输入作为两个字符串,-split将其作为第一个字面量管道(因为split使用正则表达式语法),并将元素馈入循环中|%{...}

每次迭代时,我们将字符串构造为$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
:DI总是支持vim!我认为,如果您更改mmm`然后再更改`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的Python解决方案的方法。

测试用例

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;}

松散

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

MATL33 31字节

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

在线尝试!

说明

内置函数Ydblkdiag)根据其输入构建一个块对角矩阵,可以完成大部分工作。矩阵中的填充值为0,并且char 0被视为用于显示目的的空格。该代码将简单地分割|,从结果块构建矩阵,转换为char,并在两列后加上空格和注释符号。

然而,在输入字符串空部的可能性复杂化使得问题更加有趣:所得嵌段将是空的,因此在所得到的矩阵不会显示。

为了解决这个问题,我们在每个之前引入一个char 0 |,所以没有块将为空;然后在生成的char矩阵中,我们删除仅由char 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
我隐约感到失望的是,您没有按照操作
规范

1
@ Random832我不经常使用这种格式。它占用了大量空间,几乎没有解释的空间
Luis Mendo

为什么在第一个字符串中需要转义?
科纳·奥布莱恩

@ ConorO'Brien好问题。我不知道哪个/何时需要特殊符号转义,哪个/何时不需要转义。在这种情况下,|(至少在Matlab / Octave正则表达式引擎中)(匹配子表达式之前或之后|)确实需要它
Luis Mendo

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如何仍然不竞争?是否仍在开发中?
DJMcMayhem

@DJMcMayhem是的。我为Dyalog工作,即使在15.0发布之前也可以使用16.0。16.0计划于2017年第一季度发布。
2013年

这是如何运作的?
Conor O'Brien

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

Ruby,96个 80字节

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

在eval.in上查看:https ://eval.in/639012

我真的应该只学习视网膜。


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.