シンプルなきれいなコメントツールを作成する


14

チャレンジ:

一部のascii-artは作成が苦痛ですが、特にコードが密集している場合は、コードのコメントを読みやすくします。課題は、コメントを矢印付きの単純なASCIIアートに変換する単純なツールを作成することです。変更するコメントは空のコメントで区切られます。

たとえば、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

ルール:

  • あなたの答えは、機能または完全なプログラムのいずれかです
  • これを使用する言語を選択し、「-」をいくつかの言語でコメントを区切る2つ以上の文字に置き換えます。
  • 開始および終了デリミタを必要とする別のコメント形式を使用する場合、再フォーマットされたセクションの各行は適切なコメントでなければなりません
  • 再フォーマットするセクションは、空のコメント「\ 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
コメントを区切るために1文字だけが必要な場合はどうなりますか?
アダム

それは言語で有効なコメントだ限り、それの罰金として
マイケル・クライン

再フォーマットの対象となる各コメントセクションには、正確に1行の位置マーカーアスタリスクが含まれると想定できますか?その行は常に最後の行ですか?
マナトワーク

うん、正確に1つで常に最後です(終了区切り文字の前のコメント)
マイケルクライン

そして、アスタリスクの量は、そのセクションの前の行の数と等しくなりますよね?
マナトワーク

回答:


4

ルビー、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'))

ふう、これは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。1つおきの文字列は、区切られたコメントブロックです。

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

各文字列を実行します。文字列がコメントではない場合、文字列を出力します。さもないと:

コメントブロック内の各行を分割します。

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

*s の行をvand で置き換えることにより、下の2行を作成し|ます。

['--    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の2番目のコメントブロックが失われます。また、がらくた、私はあなたがどの言語でコメント構文を使用できることを前に見なかった。
エメットR.

ええ、はい、あなたは正しいです。@EmmettR。ありがとう。私はそれを修正しようとします
-edc65
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.