간단한 예쁜 주석 도구 만들기


14

도전:

일부 아트 아트는 만들기가 쉽지 않지만 특히 코드가 밀도가 높을 때 코드 주석을 쉽게 읽을 수 있습니다. 과제는 화살표로 주석을 간단한 아스키 아트로 변환하는 간단한 도구를 만드는 것입니다. 수정할 주석은 빈 주석으로 구분됩니다.

예를 들어, 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

재 포맷 될 각 주석 섹션에 정확히 한 줄의 위치 마커 별표가 포함되어 있다고 가정 할 수 있습니다. 그 줄은 항상 마지막 줄입니까?
manatwork

그렇습니다, 정확히 하나이며 항상 (끝 구분 기호 앞에 주석)
Michael Klein

그리고 별표의 양은 해당 섹션의 선행 줄 수와 같습니다.
manatwork

답변:


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

자바 스크립트 (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 바이트가 짧았습니다. 이 모든 것을 손으로 축소하는 것은 힘들었습니다. 유감스럽게도 while 루프를 아직 제거 할 수 없어서 수익을 줄일 수있었습니다.

다른 두 가지 답변에서 부분적으로 영감을 받아 완전히 다시 작성하십시오. 나는 모든 것을지도에서 닫아야하므로 훨씬 더 잘 돌아 왔습니다. 코드 스 니펫에는 주석이 달린 버전이 포함되어 있습니다.

몇 바이트 더 떨어져서 예제 자체가 작동하게했습니다. (더 큰 모니터가 필요합니다.) :)

사양에서 전체 문자를 잊어 버렸습니다! 다행스럽게도 '<'를 추가하는 것은 작고 사소한 수정이었습니다.


3

파이썬 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 줄을 vand 로 바꾸어 맨 아래 두 줄을 만듭니다 |.

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

자바 스크립트 (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
}

테스트


크롬 47에서 오류없이 두 번째 주석 블록이 누락되었습니다. 또한, crap, 나는 당신이 어떤 언어 에서도 주석 구문을 사용할 수 있다는 것을 보지 못했습니다 .
Emmett R.

네 맞아요 @EmmettR. 감사. 나는 그것을 고치려고 노력할 것이다
edc65
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.