สร้างเครื่องมือแสดงความคิดเห็นที่เรียบง่าย


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

กฎ:

  • คำตอบของคุณอาจเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • คุณสามารถเลือกภาษาที่ใช้กับการทำงานแทนที่ "-" ด้วยอักขระสองตัวขึ้นไปที่คั่นความคิดเห็นในบางภาษา
  • หากใช้รูปแบบความคิดเห็นอื่นที่ต้องใช้ตัวคั่นเริ่มต้นและจุดสิ้นสุดแต่ละบรรทัดของส่วนที่จัดรูปแบบใหม่จะต้องเป็นความคิดเห็นที่เหมาะสม
  • ส่วนที่จะฟอร์แมตใหม่จะถูกคั่นด้วยความคิดเห็นที่ว่าง "\ 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
จะเป็นอย่างไรถ้าจำเป็นต้องใช้อักขระเพียงตัวเดียวในการกำหนดความคิดเห็น?
Adám

ตราบใดที่มันเป็นความเห็นที่ถูกต้องในภาษามันก็ดี
Michael Klein

เราสามารถสันนิษฐานได้ว่าแต่ละส่วนความคิดเห็นซึ่งอยู่ภายใต้การจัดรูปแบบใหม่จะมีเครื่องหมายระบุตำแหน่งหนึ่งบรรทัดใช่มั้ย บรรทัดนั้นจะเป็นบรรทัดสุดท้ายเสมอหรือไม่
จัดการ

Yup, ตรงหนึ่งและมักที่ผ่านมา (แสดงความคิดเห็นก่อนที่จะคั่นจบ)
ไมเคิลไคลน์

และจำนวนของดอกจันจะเท่ากับจำนวนบรรทัดก่อนหน้าในส่วนนั้นใช่ไหม
จัดการ

คำตอบ:


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), 418 , 237 , 233 , 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 ฉันคิดว่าเป็นวิธีที่แตกต่างจากวอชิงตัน Guedes จบลงด้วย 54 ไบต์สั้นกว่าการผ่านครั้งแรกของเขา การลดทั้งหมดนี้ด้วยมือมันทรหด ความเสียใจอย่างหนึ่งของฉันคือยังไม่สามารถกำจัดห่วงในขณะที่ซึ่งจะให้ฉันตัดกลับ

เขียนซ้ำทั้งหมดโดยได้รับแรงบันดาลใจบางส่วนจากคำตอบอื่น ๆ ฉันต้องปิดทุกสิ่งในแผนที่ทำให้กลับมาดีขึ้นมาก ข้อมูลโค้ดมีเวอร์ชันที่แสดงความคิดเห็น

เอาไบต์ออกอีกสองสามตัวและทำให้ตัวอย่างทำงานด้วยตัวมันเอง (คุณจะต้องมีจอภาพที่ใหญ่กว่า) :)

ลืมตัวอักษรทั้งหมดในสเป็ค! โชคดีที่การเพิ่ม '<' นำหน้าเป็นการแก้ไขเล็กน้อย


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

น้อย golfed

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.