আমার রহস্যমূলক কোডের বাইরে মন্তব্যগুলি পার্স করুন


30

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

a                #Explanation of what 'a' does
 bc              #Bc
   d             #d
    e            #Explanation of e
     fgh         #foobar
        ij       #hello world
          k      #etc.
           l     #so on
            mn   #and
              op #so forth

কোডটি বের করার জন্য আপনাকে যা করতে হবে তা এখানে। প্রথমে মন্তব্য চরিত্র ( #), এর আগে স্থান এবং মন্তব্য চরিত্রের পরে সমস্ত কিছু সরিয়ে ফেলুন ।

a               
 bc             
   d            
    e           
     fgh        
        ij      
          k     
           l    
            mn  
              op

তারপরে, প্রতিটি লাইন একটি একক লাইনে উপরের দিকে ভেঙে পড়ুন। উদাহরণস্বরূপ, যেহেতু bলাইন দুইয়ের দ্বিতীয় কলামে রয়েছে, একবার আমরা একে একে ভেঙে ফেলি, এটি এক লাইনের দ্বিতীয় কলামে থাকবে । একইভাবে, cপ্রথম লাইনের তৃতীয় কলামে dরাখা হবে এবং চতুর্থটি স্থাপন করা হবে। প্রতিটি চরিত্রের জন্য এটি পুনরাবৃত্তি করুন এবং আপনি এটি পান:

abcdefghijklmnop

গুরুত্বপূর্ণ দ্রষ্টব্য: মনে হচ্ছে তুচ্ছ সমাধানটি হ'ল মন্তব্যগুলি সরিয়ে নেওয়া, প্রতিটি স্থান সরিয়ে নেওয়া এবং প্রতিটি লাইনে যোগদান করা। এই না একটি বৈধ পদ্ধতির! যেহেতু মূল কোডটিতে এটিতে ফাঁকা স্থান থাকতে পারে, এগুলি এই পদ্ধতির সাথে ছিটকে যাবে। উদাহরণস্বরূপ, এটি একটি সম্পূর্ণ বৈধ ইনপুট:

hello         #Line one
              #Line two
       world! #Line three

এবং সম্পর্কিত আউটপুট হতে হবে:

hello  world!

চ্যালেঞ্জ:

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

  • আপনি ধরে নিতে পারেন যে কোডটিতে একই কলামে দুটি অক্ষর থাকবে না। উদাহরণস্বরূপ, এটি এমন একটি ইনপুট যা এই বিধি লঙ্ঘন করে:

    a  #A character in column one
    bc #Characters in columns one and two
    
  • আপনি ধরে নিতে পারেন যে সমস্ত মন্তব্য অক্ষর একই কলামে উপস্থিত হবে। উদাহরণস্বরূপ, এই ইনপুট:

    short       #this is a short line
          long        #This is a long line
    

    এই নিয়ম লঙ্ঘন করে। এর অর্থ #এটি কোড বিভাগে থাকবে না।

  • এবং শেষ অবধি, আপনাকে নেতৃস্থানীয় বা পিছনের স্থানগুলির সাথে কোড বিভাগগুলি পরিচালনা করতে হবে না। উদাহরণ স্বরূপ,

      Hello,          #
             World!   #
    

আপনি ধরেও নিতে পারেন যে ইনপুটটিতে কেবল প্রিন্টযোগ্য ASCII অক্ষর রয়েছে।

উদাহরণ:

Input:
hello         #Line one
              #Line two
       world! #Line three

Output:
hello  world!

Input:
E                                                   #This comment intentionally left blank
 ac                                                 #
   h s                                              #
      ecti                                          #
          on is                                     #
                one c                               #
                     haracte                        #
                            r longer                #
                                     than the       #
                                              last! #

Output:
Each section is one character longer than the last!

Input:
4          #This number is 7
 8         #
  15       #That last comment is wrong.
    16     #
      23   #
        42 #

Output:
4815162342

Input:
Hello                     #Comment 1
      world               #Comment 2
           ,              #Comment 3
             how          #Comment 4
                 are      #Comment 5
                     you? #Comment 6

Output:
Hello world, how are you?

Input:
Prepare                               #
        for...                        #
                        extra spaces! #

Output:
Prepare for...          extra spaces!

আপনার পছন্দসই যুক্তিসঙ্গত বিন্যাসে আপনি ইনপুট নিতে পারেন, উদাহরণস্বরূপ, স্ট্রিংগুলির একটি তালিকা, নিউলাইনগুলির সাথে একটি একক স্ট্রিং, অক্ষরের একটি 2 ডি তালিকা ইত্যাদি!


আমাদের কি পরবর্তীগুলির চেয়ে কম অক্ষর সহ কোড গ্রহণ করতে হবে ?
wizzwizz4

আপনি খালি লাইনের সাথে পরীক্ষাগুলি কেবল দুটি স্পেস (যেমন hello world!আপনি দেখিয়েছেন) দিয়ে যুক্ত করতে পারেন ? এছাড়াও, আপনি বলেছেন: " #ইনপুটটির মন্তব্য বিভাগে উপস্থিত হবে না " ", তবে এটি কোড-স্নিপেটে নিজেই দেখা দিতে পারে?
কেভিন ক্রুইজসেন

@ কেভিন ক্রুইজসেন আমার সম্পাদনাগুলি দেখুন
ডিজেএমসিএমহেম

@ wizzwizz4 আমি আপনার প্রশ্নটি বুঝতে পেরেছি কিনা তা নিশ্চিত নই
ডিজেএমসিএমহেম

@DJMcMayhem উদাহরণ: do {stuff} while (condition);অনুক্রমে ব্যাখ্যা do while (condition); #Explainythingতারপর {stuff} #Explainything
wizzwizz4

উত্তর:


18

জেলি , 8 7 বাইট

»/ṣ”#ḢṖ

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

»/ṣ”#ḢṖ  Main link. Argument: A (array of strings)

»/       Reduce the columns of A by maximum.
         Since the space is the lowest printable ASCII characters, this returns the
         non-space character (if any) of each column.
  ṣ”#    Split the result at occurrences of '#'.
     Ḣ   Head; extract the first chunk, i.e., everything before the (first) '#'.
      Ṗ  Pop; remove the trailing space.

2
এটা ঠিক ... বাহ!
জোনাথন অ্যালান

3
আমি এখনই খুব জেলি।
MonkeyZeus

এমনকি আপনি কীভাবে আপনার ফোনে হ্যাক করবেন?
সিম্বাবাক

2
@ সিম্বাবাক ধৈর্য এবং প্রচুর অনুলিপি-আটকানো।
ডেনিস

আমি সবসময় একটি 9-আয়রন ব্যবহার করে রাখছি, সম্ভবত এই সময়টি যখন আমি সবুজতে থাকি তখন কীভাবে পটার ব্যবহার করব তা শিখেছি ...
ম্যাজিক অক্টোপাস উরন

13

পাইথন 2, 48 43 বাইট

lambda x:`map(max,*x)`[2::5].split(' #')[0]

@ এক্সনরকে 5 বাইট বন্ধ করে দেওয়ার জন্য ধন্যবাদ!

আইডিয়নে এটি পরীক্ষা করুন ।


1
আমি মনে করি আপনি এটি করতে পারেন map(max,*x)কারণ যে maxকোনও সংখ্যক যুক্তি গ্রহণ করে এবং Noneছোট is
xnor

ঠিক আছে, আমি সর্বদা ভুলে যাই যে mapএটি ব্যবহার করা যেতে পারে ... ধন্যবাদ!
ডেনিস

1
`...`[2::5]কৌশলটি কীভাবে কাজ করে?

1
@ এসএমএলএস `...`সমতুল্য repr(...), সুতরাং সিঙ্গলটন স্ট্রিংগুলির তালিকার জন্য ['a', 'b', 'c']আপনি স্ট্রিংটি পাবেন "['a', 'b', 'c']"। অবশেষে, [2::5]প্রথম দুটি অক্ষর ছড়িয়ে যায় ( "['") এবং বাকি স্ট্রিংয়ের প্রতিটি পঞ্চম অক্ষর নেয়।
ডেনিস

5

জাভাস্ক্রিপ্ট (ES6), 97 75 60 বাইট

22 বাইট বন্ধ গল্ফ সাহায্য করার জন্য @ নীল ধন্যবাদ

a=>a.reduce((p,c)=>p.replace(/ /g,(m,o)=>c[o])).split` #`[0]

ইনপুট লাইনগুলির একটি অ্যারে।

  • a অ্যারে ইনপুট হয়
  • p পূর্ববর্তী আইটেম
  • c বর্তমান আইটেম
  • m ম্যাচ স্ট্রিং
  • o অফসেট হয়

আমি 96 বাইট গণনা? এছাড়াও, mরেজিএক্সএক্স পতাকাটি অপ্রয়োজনীয় (আপনার $এক পর্যায়ে একটি ছিল?) স্থানটি যেমন রয়েছে তেমন (p, c)। পরিশেষে, আমি মনে করি এর replaceচেয়ে কম কাজ করবে [...p].map().join
নীল

ম্যানুয়াল lengthএবং ইউজার স্ক্রিপ্ট উভয়ই আমার পক্ষে maybe৯, সম্ভবত আপনি নতুন লাইনটি গণনা করেননি, তবে কেবলমাত্র আমি ঘটনাক্রমে সেমিকোলনটি অন্তর্ভুক্ত করেছি
এএসসিআইআই-কেবল

আমি এখনই দেখছি - ;যা প্রয়োজন নেই তা অনুলিপি করিনি (জাভাস্ক্রিপ্টে এএসআই আছে)।
নিল

হ্যাঁ, দুঃখিত, আমার কাছে ক্রোমিয়াম কনসোলটি ফাংশন বডির বাইরে ফাংশন কল রাখে (এটি একবার খারাপভাবে লেখা ল্যাম্বডায় ছিল) তা নিশ্চিত করা উচিত ছিল
ASCII-

ওহ বাহ, আমি বুঝতে পারি না replaceযে এতটা সাহায্য করবে, এটি সত্যিই ঝরঝরে!
নিল

4

পার্ল, 35 34 32 বাইট

এর জন্য +1 অন্তর্ভুক্ত -p

STDIN এ ইনপুট দিন

eso.pl

#!/usr/bin/perl -p
y/ /\0/;/.#/;$\|=$`}{$\=~y;\0; 

ফাইনালের পরে জায়গা আছে তা লক্ষ করুন ;। কোডটি প্রদর্শিত হিসাবে কাজ করে, তবে \0দাবি করা স্কোর পেতে আক্ষরিক চরিত্র দ্বারা প্রতিস্থাপন করুন ।


খুব সুন্দর কোড। যে $a|=...বরং ভাল, সম্পন্ন করা হয় এটা তুমি কি করছিলে জিনিসটা কিছুদিনের আমাকে গ্রহণ! যদিও একটি প্রশ্ন: *_=aমোটামুটি সমান বলে মনে হচ্ছে $_=$a, তা কেন?
দাদা

*_=a_গ্লোবাল এবং aগ্লোবালকে আলাদা করে রাখে এমন একটি অত্যন্ত অস্পষ্ট গ্লোব অ্যাসাইনমেন্ট। সুতরাং এটি এত একটি কপি থেকে নয় $aথেকে $_কিন্তু (গ্লোবাল) যে বিন্দু থেকে $aএবং $_আসলে একই পরিবর্তনশীল হয়। 1 টি বাইট সংরক্ষণ করার জন্য সমস্ত ...
টন হসপেল

ঠিক আছে, ব্যাখ্যার জন্য ধন্যবাদ! (এবং চমৎকার উন্নতির জন্য ধন্যবাদ `$ \ to)
দাদা

3

পাইথন 2, 187 বাইট

def f(x,o=""):
 l=[i[:i.index("#")-1]for i in x]
 for n in range(len(l[0])):
  c=[x[n]for x in l]
  if sum([1for x in c if x!=" "])<1:o+=" "
  else:o+=[x for x in c if x!=" "][0]
 print o

I'm gonna golf this more tomorrow I have school ;)


1 for can be reduced to 1for. Also, if the sum of the list (at line 5) can't be negative, you can just check for <1 instead of ==0. Happy school day! :D +1.
Yytsi


2

সিজেম , 12 বাইট

2 বাইট সংরক্ষণের জন্য Sp3000 ধন্যবাদ।

{:.e>_'##(<}

একটি নামবিহীন ব্লক যা স্ট্রিংগুলির তালিকা (প্রতিটি লাইনের জন্য একটি) নেয় এবং এটি একটি একক স্ট্রিংয়ের সাথে প্রতিস্থাপন করে।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

:.e>  e# Reduce the list of strings by elementwise maximum. This keeps non-spaces in
      e# favour of spaces. It'll also wreak havoc with the comments, but we'll discard
      e# those anyway.
_'##  e# Duplicate and find the index of '#'.
(<    e# Decrement that index and truncate the string to this length.

2

জে, 30 বাইট

(#~[:<./\'#'~:])@(>./&.(3&u:))

ইনপুট হিসাবে স্ট্রিংয়ের একটি তালিকা নেয়। মূলত তার জেলি উত্তরে ডেনিসের মতো একই পন্থা ব্যবহার করে।

মন্তব্য এবং ব্যাখ্যা

ord =: 3 & u:
under =: &.
max =: >./
over =: @
maxes =: max under ord
neq =: ~:
arg =: ]
runningMin =: <./\
magic =: #~ [: runningMin ('#' neq arg)

f =: magic over maxes

মধ্যবর্তী পদক্ষেপ:

   p
Hello                     #Comment 1
      world               #Comment 2
           ,              #Comment 3
             how          #Comment 4
                 are      #Comment 5
                     you? #Comment 6
   maxes p
Hello world, how are you? #Comment 6
   magic
#~ ([: runningMin '#' neq arg)
   3 neq 4
1
   '#' neq '~'
1
   '#' neq '#'
0
   '#' neq maxes p
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1
   runningMin 5 4 2 5 9 0 _3 4 _10
5 4 2 2 2 0 _3 _3 _10
   runningMin '#' neq maxes p
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
   0 1 0 1 1 0 # 'abcdef'
bde
   'abcdef' #~ 0 1 0 1 1 0
bde
   (maxes p) #~ runningMin '#' neq maxes p
Hello world, how are you? 
   (#~ [: runningMin '#' neq arg) maxes p
Hello world, how are you? 
   ((#~ [: runningMin '#' neq arg) over maxes) p
Hello world, how are you? 
   (magic over maxes) p
Hello world, how are you? 

পরীক্ষা ক্ষেত্রে

   f =: (#~[:<./\'#'~:])@(>./&.(3&u:))
   a
Hello                     #Comment 1
      world               #Comment 2
           ,              #Comment 3
             how          #Comment 4
                 are      #Comment 5
                     you? #Comment 6
   $a
6 36
   f a
Hello world, how are you?

2

জাভাস্ক্রিপ্ট (ES6), 63 বাইট

a=>a.reduce((p,c)=>p+/(.+?)\s+#/.exec(c)[1].slice(p.length),'')

স্ট্রিংগুলির অ্যারে হিসাবে ইনপুট নেয়।

F=a=>a.reduce((p,c)=>p+/(.+?)\s+#/.exec(c)[1].slice(p.length),'')

input.oninput = update;
update();

function update() {
  try {
    output.innerHTML = F(input.value.trim().split`
`);
  } catch(e) {
    output.innerHTML = 'ERROR: INVALID INPUT';
  }
}
textarea {
  width: 100%;
  box-sizing: border-box;
  font-family: monospace;
}
<h2>Input:</h2>
<textarea id="input" rows="8">
a                #Explanation of what 'a' does
 bc              #Bc
   d             #d
    e            #Explanation of e
     fgh         #foobar
        ij       #hello world
          k      #etc.
           l     #so on
            mn   #and
              op #so forth
</textarea>
<hr />
<h2>Output:</h2>
<pre id="output">
</pre>



1

Pyke, 15 10 bytes

,FSe)s\#ch

Try it here!

Port of the Jelly answer

,          -     transpose()
 FSe)      -    map(min, ^)
     s     -   sum(^)
      \#c  -  ^.split("#")
         h - ^[0]

1

C# 157 122 Bytes

Golfed 35 bytes thanks to @milk -- though I swear I tried that earlier.

Takes input as a 2-d array of characters.

string f(char[][]s){int i=0;foreach(var x in s)for(i=0;x[i]!=35;i++)if(x[i]!=32)s[0][i]=x[i];return new string(s[0],0,i);}

157 bytes:

string g(char[][]s){var o=new char[s[0].Length];foreach(var x in s)for(int i=0;x[i]!=35;i++)if(x[i]!=32|o[i]<1)o[i]=x[i];return new string(o).TrimEnd('\0');}

Shouldn't Trim() work instead of TrimEnd()? Even better, I think you can save a lot of bytes by using s[0] as the output var and using return new string(s[0],0,i) where i is the index of the last code character. That idea may require two for loops instead of the foreach, I'll think about it more and try to write actual code later today.
milk

Trim() will trim from the start as well, which I believe wouldn't be valid. I also was originally doing the loading into s[0] and I had int i; outside of the loop (to reuse it in the return) which I believe ultimately added bytes
pinkfloydx33

1

Pyth, 11 bytes

PhceCSMCQ\#

A program that takes input of a list of strings on STDIN and prints a string.

Try it online

How it works

PhceCSMCQ\#  Program. Input: Q
       CQ    Transpose Q
     SM      Sort each element of that lexicographically
    C        Transpose that
   e         Yield the last element of that, giving the program ending with ' #' and some
             parts of the comments
  c      \#  Split that on the character '#'
 h           Yield the first element of that, giving the program with a trailing space
P            All but the last element of that, removing the trailing space
             Implicitly print

1

sed, 126 bytes

:a;N;$!ba;s,#[^\n]*\n,#,g;s,^,#,;:;/#[^ ]/{/^# /s,^# *,,;t;H;s,#.,#,g}
t;/#[^ ]/!{H;s,#.,#,g};t;g;s,\n#(.)[^\n]*,\1,g;s,...$,,

Requires a newline at the end of the input.
I'm sure I can golf this a little more, but I'm just happy it works for now.



0

Jelly, 27 bytes

żḟ€” ;€” Ḣ€
i€”#’©ḣ@"ç/ḣ®ṪṖ

Test it at TryItOnline

Uses the strictest spec - the extra space before the comment character is removed at the cost of a byte.

Input is a list of strings.


@Erik the Golfer - maybe so, but did you see the crushing he gave me here?
Jonathan Allan


0

TSQL, 216 175 bytes

Golfed:

DECLARE @ varchar(max)=
'hello         #Line one
              #Line two
       world! #Line three'

DECLARE @i INT=1,@j INT=0WHILE @i<LEN(@)SELECT @=stuff(@,@j+1,len(x),x),@j=iif(x=char(10),0,@j+1),@i+=1FROM(SELECT ltrim(substring(@,@i,1))x)x PRINT LEFT(@,patindex('%_#%',@))

Ungolfed:

DECLARE @ varchar(max)=
'hello         #Line one
              #Line two
       world! #Line three'

DECLARE @i INT=1,@j INT=0
WHILE @i<LEN(@)
  SELECT @=stuff(@,@j+1,len(x),x),@j=iif(x=char(10),0,@j+1),@i+=1
  FROM(SELECT ltrim(substring(@,@i,1))x)x
PRINT LEFT(@,patindex('%_#%',@))

Fiddle



0

Dyalog APL, 22 bytes

Inspiration.

(⎕UCS¯2↓⍳∘35↑⊢)⌈⌿∘⎕UCS

(

⎕UCS character representation of

¯2↓ all but the last two of

⍳∘35↑ up until the position of the first 35 ("#"), in that which is outside the parenthesis, taken from

that which is outside the parenthesis

) namely...

⌈⌿ the columnar maximums

of

⎕UCS the Unicode values

TryAPL online!


How many bytes?
acrolith
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.