Складіть простий засіб для симпатичних коментарів


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

Поки це дійсний коментар мовою, це добре
Майкл Кляйн

Можна припустити, що кожен розділ коментарів, який підлягає переформатуванню, міститиме рівно один рядок зірочок маркера позиції, правда? Чи завжди цей рядок буде останнім?
манатура

Так, рівно один і завжди останній (коментар до кінця відмежувача)
Майкл Клейн

А кількість зірочок буде дорівнює кількості попередніх рядків у цьому розділі, правда?
манатство

Відповіді:


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. Я вважаю, що зовсім інша справа від Вашингтона Гідеса. Закінчився на 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 без помилок. Крім того, лайно, я раніше не бачив, щоб ви могли використовувати будь-який синтаксис коментарів будь-якою мовою .
Емметт Р.

Ага, так, ти маєш рацію. @EmmettR. Спасибі. Я спробую це виправити
edc65
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.