制作一个简单的漂亮评论工具


14

挑战:

某些ascii技术很难制造,但使代码注释更易于阅读,尤其是在代码密集时。面临的挑战是制作一个简单的工具,以将带有箭头的注释转换为简单的ascii-art。要修改的注释由空注释分隔。

例如,假设Haskell注释语法,请转换为:

--
-- Here's a thing
-- Here's another thing
-- The most important thing
-- *    *     *
--
f x=x+1*x*1*1*0

对此:

-- /------------< Here's a thing
-- |    /-------< Here's another thing
-- |    |     /-< The most important thing
-- |    |     |
-- v    v     v
f x=x+1*x*1*1*0

规则:

  • 您的答案可能是函数或完整程序
  • 您可以选择使用的语言,将“-”替换为两个或多个以某种语言分隔注释的字符
  • 如果使用要求开始和结束定界符的另一种注释格式,则重新格式化节的每一行都必须是正确的注释
  • 要重新格式化的节由空注释“ \ n-\ n”界定
  • 除了添加换行符外,该程序不得更改除定界部分以外的任何输入
  • 在输出的正确格式部分之前,可能会出现用任意数量的空格填充的注释
  • 不允许出现标准漏洞

其他示例:

(input)
--
--
(output)
nothing


(input)
[Code Here]
--
-- important
--    *
--
(output)
[Code Here]
--    /-< important
--    |
--    v


(input)
--
-- Do
-- Re
-- Mi
-- Fa
-- So
-- *****
--
(output)
-- /-----< Do
-- |/----< Re
-- ||/---< Mi
-- |||/--< Fa
-- ||||/-< So
-- |||||
-- vvvvv

得分:

  • 最少的字节数获胜
  • 没有说明或简单的示例输入/输出的提交内容将不予考虑(尽管我会留出宽限期,以便有时间添加此类内容)

2
如果只需要一个字符来分隔注释怎么办?
亚当

只要这是该语言的有效注释,就可以了
Michael Klein

我们可以假设每个要重新格式化的注释部分将只包含一行位置标记星号,对吗?那条线会永远是最后一条吗?
manatwork '16

是的,恰好是一个,并且永远是最后一个(在定界符前加注)
Michael Klein

星号的数量将等于该部分中前几行的数量,对吗?
manatwork '16

Answers:


4

Ruby,160个字符

->c{c.gsub(/^--$(.+?)^--$/m){*t,a=$&.lines[1..-2]
a&&a.chop!&&(t.map{|l|a[?*]=?/
l[0,2]=a.gsub(/(?<=\/).*/){?-*$&.size}+'-<'
a[?/]=?|
l}<<a+$/+a.tr(?|,?v))*''}}

样品运行:

2.1.5 :001 > puts ->c{c.gsub(/^--$(.+?)^--$/m){*t,a=$&.lines[1..-2];a&&a.chop!&&(t.map{|l|a[?*]=?/;l[0,2]=a.gsub(/(?<=\/).*/){?-*$&.size}+'-<';a[?/]=?|;l}<<a+$/+a.tr(?|,?v))*''}}["
2.1.5 :002"> --
2.1.5 :003"> -- Here's a thing
2.1.5 :004"> -- Here's another thing
2.1.5 :005"> -- The most important thing
2.1.5 :006"> -- *    *     *
2.1.5 :007"> --
2.1.5 :008"> f x=x+1*x*1*1*0
2.1.5 :009"> "]

-- /------------< Here's a thing
-- |    /-------< Here's another thing
-- |    |     /-< The most important thing
-- |    |     |
-- v    v     v
f x=x+1*x*1*1*0
 => nil 

简要描述;简介:

.lines splits the section to array items ─────────╮
                                                  ▽

.gsub extracts ⎧   --                             0         
these sections ⎪   -- Here's a thing              1   t[0]   
for processing ⎨   -- Here's another thing        2   t[1]   
and replaces   ⎪   -- The most important thing    ⋮   t[2]   
them with the  ⎪   -- *    *     *               -2   a      
pretty version ⎩   --                            -1          
rest untouched —   f x=x+1*x*1*1*0
                                                      △
only the needed lines get into variables ─────────────╯



a = "-- *    *     *" + "-<"           inside .gsub's block
        ↓↓                             the first 2 characters
t[0] = "-- Here's a thing"             of t's each item are
t[1] = "-- Here's another thing"       replaced with a's value
t[2] = "-- The most important thing"   and the the separator



not only t's items are transformed inside .gsub's block,
but a's value also gets changed in multiple small steps

                       change a's value    change the value    change a's value
   a's initial value   before insertion   being inserted now   after insertion
   ╭───────────────╮   ╭───────────────╮   ╭───────────────╮   ╭───────────────╮

0  "-- *    *     *" → "-- /    *     *" → "-- /-----------" → "-- |    *     *"
1  "-- |    *     *" → "-- |    /     *" → "-- |    /------" → "-- |    |     *"
2  "-- |    |     *" → "-- |    |     /" → "-- |    |     /" → "-- |    |     |"

                       ╰───────────────╯   ╰───────────────╯   ╰───────────────╯
                      change first * to /  change everything  change first / to |
                                          after / with string
                                          of - of same length

5

的JavaScript(ES6),418237233,236个字节

f=(s)=>(d='\n//',s.split(d+'\n').map((x,y)=>y%2?'//'+(l=x.slice(2).split(d),t=l.pop().split('*'),l.map((i,j)=>t.map((k,m)=>m==j?k+'/':m<j?k+'|':k.replace(/ /g,'-')+'-').join('')+'<'+i).join(d)+d+t.join('|')+d+t.join('v')):x).join('\n'))

ew,这是我第一次提交CG。我认为,采取的做法与华盛顿·瓜迪斯完全不同。比他的第一遍短了54个字节。用手将所有这些东西缩小是很烦人的。我的遗憾是还不能消除while循环,这也使我减少了回报。

完全重写,从其他几个答案中获得了部分启发。我必须关闭整个地图,使返回更好。该代码段包含注释版本。

多花了几个字节,使该示例自行运行。(您将需要一个更大的显示器。):)

忘记了规范中的整个字母!幸运的是,添加开头的“ <”是一个很小的琐碎问题。


3

Python 2,299字节

期望输入中包含尾随换行符

i=input().split('--\n')
a=0
for j in i:
 a+=1
 if a%2:print j,;continue
 if''==j:continue
 l=j.split('\n');n=l[-2];r=l[:-2];R=[n.replace('*','v'),n.replace('*','|')];L=R[1]
 for x in range(len(l)-2)[::-1]:L=L[:L.rfind('|')]+'/';R+=[L.ljust(n.rfind('*')+2,'-')+'< '+r[x][3:]]
 print'\n'.join(R[::-1])

说明/示例

输入:

[Code Here]
--
-- important
--    *
--

用分割输入--\n。第二个字符串是一个分隔的注释块。

['[Code Here]\n',
'-- important\n-- stuff\n--    *  *\n',
'']

遍历每个字符串。如果该字符串不是注释,则仅打印该字符串。除此以外:

拆分注释块中的每一行。

['-- important', '-- stuff', '--    *  *', '']

通过用和替换*s的行来使底部的两行。v|

['--    v  v', '--    |  |']

对于每行注释(向后),删除最右边的列,添加/,填充-并添加注释。

'--    |  /'
'--    /'
'--    /----< important'

打印所有内容

--    /----< important
--    |  /-< stuff
--    |  |
--    v  v

少打高尔夫球:

i=input().split('--\n')
a=0
for j in i:
 a+=1
 if a%2:print j,;continue # Not commment
 if''==j:continue # Empty comment
 l=j.split('\n') # Split comment into lines
 r=l[:-2]
 # Replace line of *s with v and | respectively
 R=[l[-2].replace('*','v'),l[-2].replace('*','|')]
 L=R[1][3:] # line of |
 for x in range(len(l)-2)[::-1]: # For each comment line
  L=L[:L.rfind('|')]+'/' #Remove rightmost column
  # Add a line with '-- ',columns, and comment
  R+=['-- '+L.ljust(n.rfind('*')-1,'-')+'< '+r[x][3:]]
 print'\n'.join(R[::-1]) #Print all comment lines

1

JavaScript(ES6),253

作为匿名函数,将要格式化的代码作为字符串参数并返回格式化的代码。

笔记

  1. 标记注释对必须包含正确的文本(注释行,然后是星号)
  2. ...,否则该对必须不包含任何内容(附加示例1)
t=>(t=t.split`
`,t.map((r,i)=>r=='--'?(c++&&l.map((r,j)=>(p+=q[j],z+=~q[j].length,t[i-n+j]=p+`/${'-'.repeat(z+1)}<`+r.slice(3),p+=`|`),q=l.pop(c=p=``)||p,z=q.length,q=q.split`*`,t[i]=p+q.join`v`,t[i-1]=p+q.join`|`),l=[]):n=l.push(r),c=0,l=[]),t.join`
`)

少打高尔夫球

f=t=>{
  t = t.split`\n`; // string to array of lines
  l = []; // special coment text
  c = 0; // counter of marker comment '--'
  t.forEach((r,i)=>{ // for each line of t - r: current line, i: index
    if (r == '--') // if marker comment
    {
       ++ c; // increment marker counter
       if (c > 1) // this is a closing marker
       {
          c = 0; // reset marker counter
          if (n > 0) // n is the length of array l
             q = l.pop(); // get last line from l, have to be the star line
          else
             q = ''; // no text comment, no star line 
          p = '';  // prefix for drawing the tree
          z = q.length; // length of star line, used to draw the tree horiz lines
          q = q.split('*'); // split to get star count and position
          // each element in q is the spaces between stars
          // modifiy the current and previous text line 
          t[i] = p + q.join`v`; // current row was '--', becomes the V line
          t[i-1] = p + q.join`|`; // previous row was the star line, becomes the last tree line
          l.forEach((r,j)=>{ // for each line in l, r: current line, j: index
             // each line in tree is: prefix("-- |  |"...) + ... "---< " + text
             p = p + q[j]; // adjust prefix
             z = z - q[j].length - 1 // adjust length of '---'
             // modify text in t
             t[i-n+j] = p // prefix
                + '/' + '-'.repeat(z+1) + '<'  // horiz line and <
                + r.slice(3); // text, removed '-- '
             p = p + '|'; // add vertical bar to prefix
          });
       } // end if closing comment
       l = []; // reset l
    }  
    else // not a special comment marker
       n = l.push(r) // add current line to l, set n to array size
  });
  return t.join`\n` // join to a single string
}

测试


这没有为我错过chrome 47上的第二个注释块。另外,废话,我之前没有看到您可以使用任何语言的任何注释语法。
Emmett R.

嗯,是的,你是对的。@EmmettR。谢谢。我会尝试修复它
edc65 '16
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.