難解なコードからコメントを解析する


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、2行目の2列目にあるため、折りたたむと、1行目の2列目になります。同様に、c1行目の3列目に配置され、dに配置され、4行目に配置されます。すべてのキャラクターについてこれを繰り返して、これを取得します:

abcdefghijklmnop

重要な注意:コメントを削除し、すべてのスペースを削除し、すべての行を結合することが簡単な解決策のようです。これは有効なアプローチではありません!元のコードにはスペースが含まれている可能性があるため、このアプローチではスペースが削除されます。たとえば、これは完全に有効な入力です。

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

対応する出力は次のとおりです。

hello  world!

チャレンジ:

コメント付きコードを入力として受け取り、すべてのコメントが解析されたコードを出力または返すプログラムまたは関数を作成します。コードの末尾にスペースを入れずに出力する必要がありますが、1つの末尾の改行を使用できます。コメント文字は常にとなり#、コメントが始まる前に常に1つの余分なスペースがあります。#ではない入力のコメントセクションに表示されます。チャレンジをより簡単に保つために、あなたがしないいくつかの入力があります処理。

  • コードの同じ列に2つの文字がないと仮定できます。たとえば、これはこのルールに違反する入力です。

    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!

入力は、文字列のリスト、改行を含む単一の文字列、文字の2dリストなど、好きな形式で入力できます。バイト単位の最短回答が優先されます。


次の文字より低い文字を含むコードを受け入れる必要がありますか?
wizzwizz4

空白が2つだけの空の行でテストケースを追加できますか(hello world!示したように)。また、「#入力のコメントセクションには表示されません。」と述べていますが、コードスニペット自体に表示されることはありますか?
ケビンCruijssen

@KevinCruijssen編集を見る
DJMcMayhem

私はあなたの質問を理解していれば@ wizzwizz4私はわからない
DJMcMayhem

@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
私は今とてもゼリーです。
モンキーゼウス

それをどのようにして携帯電話にハッキングするのですか?
シンバク

2
@simbabque忍耐と多くのコピー&ペースト。
デニス

私はいつもどのようにグリーン上でパター際に使用するためには、私が学んだ多分それの時間を9番アイアンを使用して入れている...
マジックタコ壺

13

パイソン2、48の 43バイト

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

5バイトのゴルフを楽しんでくれた@xnorに感謝します!

Ideoneでテストします。


1
私はあなただけで行うことができますだと思うmap(max,*x)ので、max任意の数の引数を取り、None小さいです。
xnor

そうです、私はいつもそのmapように使用できることを忘れています...ありがとう!
デニス

1
`...`[2::5]トリックはどのように機能しますか?
smls

1
@smls `...`は同等repr(...)であるため、シングルトン文字列のリストについては['a', 'b', 'c']、文字列を取得します"['a', 'b', 'c']"。最後に、[2::5]最初の2文字("['")を切り取り、残りの文字列の5文字ごとに取得します。
デニス

5

JavaScript(ES6)、97 75 60バイト

22バイトのゴルフを手伝ってくれた@Neilに感謝

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
ニール

私のために97、両方のマニュアルからlengthとuserscript、多分あなたは改行はカウントされませんでしたが、私は誤ってセミコロンを含めるためだけ
ASCIIのみ

なるほど- ;必要のないものはコピーしていません(JavaScriptにはASIがあります)。
ニール

ええ、申し訳ありませんが、Chromiumコンソールが関数呼び出しを関数本体の外に置くようにしなければなりませんでした(不適切に記述されたラムダで1回行っていた)
ASCIIのみ

ああすごい、私はreplaceそんなに助けになるとは知らなかった、それは本当にすてきです!
ニール

4

Perl、35 34 32バイト

+1を含む -p

STDINに入力する

eso.pl

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

finalの後にスペースがあることに注意してください;。コードは示されているように機能しますが\0、リテラル文字に置き換えて、要求されたスコアを取得します。


非常に素晴らしいコード。それ$a|=...はかなりよくできています、あなたが何をしていたかを理解するのにしばらく時間がかかりました!しかし、1つの質問:*_=aとほぼ同等のようですが$_=$a、なぜですか?
ダダ

*_=a_グローバルとグローバルをエイリアスする非常に不明瞭なグロブ割り当てaです。したがって、$ato $_からのコピーではなく、(global)からのコピーで$aあり$_、実際には同じ変数です。1つのバイトを保存するために、すべての...
トンHospel

Ok, thanks for the explanation! (and nice improvement thanks to `$\`)
Dada

3

Python 2, 187 bytes

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

Ruby, 63 bytes

Basically a port of Dennis' Jelly answer. Takes input as an array of strings.

->a{l,=a
l.gsub(/./){a.map{|m|m[$`.size]||$/}.max}[/(.+) #/,1]}

eval.inで参照してください:https ://eval.in/640757


2

CJam, 12 bytes

2バイトを節約してくれたSp3000に感謝します。

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

文字列のリスト(各行に1つ)を取り、それを単一の文字列に置き換える名前のないブロック。

オンラインでお試しください!

説明

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

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

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

Javascript, 56 34 bytes, non-competing

q=>q.split(/\n/).map(x=>/ (.?) #./.exec(x)[1]).join()

q=>q.replace(/^ *| *#.*$\n?/gm,'')

As @n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ pointed out, I am not prepared for extra spaces


Doesn't pass the "Prepare for extra spaces" case
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

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.