একটি সহজ সুন্দর মন্তব্য সরঞ্জাম করুন


14

চ্যালেঞ্জ:

কিছু এসকি-আর্ট করা ব্যথা, তবে কোড মন্তব্যগুলি পড়া সহজ করে তোলে, বিশেষত যখন কোডটি ঘন হয়। চ্যালেঞ্জটি হ'ল একটি সাধারণ সরঞ্জাম যা মন্তব্যগুলিকে তীরগুলির সাথে সাধারণ অ্যাসিআই-আর্টে রূপান্তর করে। সংশোধন করার জন্য মন্তব্যগুলি ফাঁকা মন্তব্যে সীমাবদ্ধ।

উদাহরণস্বরূপ, হাস্কেল মন্তব্য বাক্য গঠন অনুমান করে এটিকে রূপান্তর করুন:

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

নিয়মাবলী:

  • আপনার উত্তরটি কোনও ফাংশন বা পুরো প্রোগ্রাম হতে পারে
  • "-" এর পরিবর্তে দুটি বা আরও বেশি অক্ষর দিয়ে প্রতিস্থাপনের জন্য যে ভাষাটি তৈরি করা হয়েছে তা আপনি বেছে নিতে পারেন যা কোনও ভাষায় মন্তব্যকে সীমিত করে দেয়
  • যদি অন্য কোনও মন্তব্য বিন্যাস ব্যবহার করা হয় যার জন্য ডিলিমেটারগুলির শুরু এবং শেষের প্রয়োজন হয়, পুনরায় ফর্ম্যাট করা বিভাগগুলির প্রতিটি লাইন অবশ্যই একটি সঠিক মন্তব্য হতে হবে
  • পুনরায় ফর্ম্যাট করা বিভাগগুলি খালি মন্তব্য "" im 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
একটি মন্তব্য সীমিত করতে যদি কেবল একটি চরিত্রের প্রয়োজন হয়?
অ্যাডম

যতক্ষণ না এটি ভাষায় একটি বৈধ মন্তব্য, ঠিক আছে
মাইকেল ক্লেইন

আমরা ধরে নিতে পারি যে প্রতিটি মন্তব্য বিভাগ যা পুনরায় ফর্ম্যাট করার বিষয়বস্তুতে ঠিক আছে, মার্কার অ্যাসিরিস্টসের ঠিক এক লাইন থাকবে? Line লাইনটি কি সর্বদা সর্বশেষ থাকবে?
manatwork

হ্যাঁ, ঠিক এক এবং সর্বদা শেষ (শেষ সীমানার আগে মন্তব্য করুন)
মাইকেল ক্লেইন

এবং নক্ষত্রের পরিমাণটি সেই বিভাগের পূর্ববর্তী লাইনের সংখ্যার সাথে সমান হবে, তাই না?
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'))

হ্যাঁ, সিজি-তে এটি আমার প্রথম জমা। নিয়েছি, আমার মনে হয়, ওয়াশিংটন গুয়াদেসের থেকে একেবারে আলাদা কৌশল। শেষ হয়েছে তার প্রথম পাসের চেয়ে কম 54 বাইট। হাত দিয়ে এই সমস্ত মাইনাইফিং করছিল বিরক্তিকর। আমার এক আফসোস এখনও লুপটি অপসারণ করতে সক্ষম হচ্ছে না, যা আমাকে রিটার্নটিও কাটতে দেবে।

অন্যান্য উত্তরগুলির কয়েকটি থেকে আংশিক অনুপ্রেরণা নিয়ে মোট পুনর্লিখন। আমি মানচিত্রগুলিতে পুরো জিনিসটি বন্ধ করে দিতে পেরেছিলাম, আরও ভাল করে ফিরে আসছি। কোড স্নিপেটটিতে মন্তব্য করা সংস্করণ রয়েছে।

আরও কয়েকটি বাইট বন্ধ নিয়েছে এবং উদাহরণটি নিজেই চালিত করে। (আপনার আরও বড় মনিটর লাগবে)) :)

চশমা একটি পুরো চিঠি ভুলে গেছেন! ভাগ্যক্রমে, শীর্ষস্থানীয় '<' যুক্ত করা একটি ক্ষুদ্র, তুচ্ছ স্থির ছিল।


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', '--    *  *', '']

লাইনের প্রতিস্থাপন নীচে দুই লাইন করে *দিয়ে গুলি 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

জাভাস্ক্রিপ্ট (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-এ আমার ত্রুটিযুক্ত না করে দ্বিতীয় মন্তব্য ব্লকটি মিস করে। এছাড়াও, বিষ্ঠা, আমি আগে যা আপনি ব্যবহার করতে পারে দেখতে পাইনি কোনো সঙ্গে মন্তব্য সিনট্যাক্স কোনো ভাষা
এমমেট আর।

আহ, হ্যাঁ, আপনি ঠিক বলেছেন। @EmmettR। ধন্যবাদ। আমি এটি ঠিক করার চেষ্টা করব
edc65
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.