Buat alat komentar sederhana yang sederhana

14

Tantangan:

Beberapa ascii-art sulit dibuat, tetapi membuat komentar kode lebih mudah dibaca, terutama ketika kodenya padat. Tantangannya adalah membuat alat sederhana yang mengubah komentar menjadi ascii-art sederhana dengan panah. Komentar yang akan diubah dibatasi oleh komentar kosong.

Misalnya, seandainya sintaksis komentar Haskell, ubah ini:

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

Untuk ini:

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

Aturan:

  • Jawaban Anda dapat berupa fungsi atau program lengkap
  • Anda dapat memilih bahasa ini untuk bekerja dengan, mengganti "-" dengan dua atau lebih karakter yang membatasi komentar dalam beberapa bahasa
  • Jika menggunakan format komentar lain yang membutuhkan pembatas awal dan akhir, setiap baris dari bagian yang diformat ulang harus merupakan komentar yang tepat
  • Bagian yang akan diformat ulang dibatasi oleh komentar kosong "\ n - \ n"
  • Selain menambahkan baris baru, program tidak boleh mengubah input apa pun kecuali bagian yang dibatasi
  • Sebuah komentar yang diisi dengan sejumlah ruang arbitrer dapat muncul segera sebelum bagian output yang diformat dengan benar
  • Celah standar tidak diijinkan

Contoh tambahan:

(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

Mencetak:

  • Bytes paling sedikit menang
  • Pengajuan tanpa penjelasan atau contoh input / output non-sepele tidak akan dipertimbangkan (meskipun saya akan meninggalkan masa tenggang untuk memberikan waktu untuk menambahkannya)
Michael Klein
sumber
2
Bagaimana jika hanya satu karakter yang diperlukan untuk membatasi komentar?
Adm
Selama itu adalah komentar yang valid dalam bahasa tersebut, tidak apa
Michael Klein
Kita dapat mengasumsikan bahwa setiap bagian komentar yang menjadi sasaran pemformatan ulang akan berisi tepat satu baris tanda bintang penanda posisi, bukan? Apakah garis itu akan selalu menjadi yang terakhir?
manatwork
Yup, tepat satu dan selalu terakhir (komentar sebelum pembatas akhir)
Michael Klein
Dan jumlah tanda bintang akan sama dengan jumlah garis sebelumnya di bagian itu, kan?
manatwork

Jawaban:

4

Ruby, 160 karakter

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

Contoh dijalankan:

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 

Deskripsi singkat:

.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
manatwork
sumber
5

JavaScript (ES6), 418 , 237 , 233 , 236 byte

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

Wah, ini kiriman pertama saya di CG. Saya kira, mengambil cara yang sama sekali berbeda dari Washington Guedes. Berakhir 54 byte lebih pendek dari operan pertamanya. Meminimalkan semua ini dengan tangan sangat melelahkan. Satu penyesalan saya adalah belum bisa menghilangkan loop sementara, yang juga akan membiarkan saya memotong kembalinya.

Total menulis ulang, mengambil inspirasi parsial dari beberapa jawaban lainnya. Saya harus menutup semuanya di peta, membuat pengembalian jauh lebih baik. Cuplikan kode berisi versi yang dikomentari.

Mengambil beberapa byte lagi, dan membuat contoh beroperasi dengan sendirinya. (Anda akan membutuhkan monitor yang lebih besar.) :)

Lupa seluruh huruf dalam spec! Untungnya, menambahkan pemimpin '<' adalah perbaikan kecil, sepele.

Emmett R.
sumber
3

Python 2, 299 byte

Harapkan baris tambahan di input

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])

Penjelasan / Contoh

Memasukkan:

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

Pisahkan input dengan --\n. Setiap string kedua adalah blok komentar yang dibatasi.

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

Berjalan melalui setiap string. Jika string bukan komentar, maka cetak saja string tersebut. Jika tidak:

Pisahkan setiap baris di blok komentar.

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

Buat dua garis terbawah dengan mengganti garis *s dengan vdan |.

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

Untuk setiap baris komentar (mundur) hapus kolom paling kanan, tambahkan /, pad dengan -dan tambahkan komentar.

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

Cetak Segalanya

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

Kurang golf:

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
TFeld
sumber
1

JavaScript (ES6), 253

Sebagai fungsi anonim, dengan kode untuk memformat sebagai parameter string dan mengembalikan kode yang diformat.

Catatan

  1. Sepasang komentar penanda harus menyertakan teks yang tepat (baris komentar, lalu bintang)
  2. ... atau pasangan harus tidak menyertakan apa pun (contoh tambahan 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`
`)

Kurang golf

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
}

Uji

edc65
sumber
Ini melewatkan blok komentar kedua untuk saya di chrome 47 tanpa kesalahan. Juga, omong kosong, saya tidak melihat sebelumnya bahwa Anda bisa menggunakan setiap komentar sintaks dengan bahasa apapun .
Emmett R.
Eh, ya, kamu benar. @EmmettR. Terima kasih. Saya akan mencoba memperbaikinya
edc65