从我深奥的代码中解析注释


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!

挑战:

编写一个程序或函数,将带注释的代码作为输入,然后输出或返回解析出所有注释的代码。尽管允许使用一个尾随换行符,但您应输出的代码中不带尾随空格。注释字符将始终为#,并且注释开始之前将始终有一个多余的空格。#不会出现在输入的注释部分。为了保持简单的挑战,这里有一些投入,你根本具备处理:

  • 您可以假定该代码在同一列中不会包含两个字符。例如,这是违反此规则的输入:

    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!

您可以按照自己喜欢的任何合理格式进行输入,例如,字符串列表,带换行符的单个字符串,二维字符列表等。最短的答案以字节为单位!


我们将需要接受代码字符降低比下?
wizzwizz4 2016年

您是否可以在测试用例的空行中添加两个空格(如hello world!您所显示的那样)?另外,您声明:“ #不会出现在输入的注释部分。 ”,但是它可以出现在代码片段本身中吗?
凯文·克鲁伊森

@KevinCruijssen查看我的编辑
DJMcMayhem

@ wizzwizz4我不确定我是否理解您的问题
DJMcMayhem

@DJMcMayhem示例:然后do {stuff} while (condition);按顺序do while (condition); #Explainything进行说明{stuff} #Explainything
wizzwizz4 2016年

Answers:


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

您甚至如何将其入侵手机?
simbabque

2
@simbabque耐心和很多复制粘贴。
丹尼斯

我总是用9杆铁杆进行推杆,也许是时候我学会了如何在果岭上使用推杆...
魔术八爪鱼缸

13

Python 2,48 43字节

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

感谢@xnor打高尔夫球5个字节!

Ideone上进行测试


1
我认为您可以这样做,map(max,*x)因为max它可以接受任意数量的参数并且None很小。
xnor

是的,我总是忘记map可以那样使用...谢谢!
丹尼斯

1
`...`[2::5]技巧如何起作用?
smls

1
@smls `...`等效于repr(...),因此对于单例字符串列表['a', 'b', 'c'],您将获得该字符串"['a', 'b', 'c']"。最后,[2::5]将前两个字符("['")砍掉,并取走剩余字符串的每五个字符。
丹尼斯

5

JavaScript(ES6),97 75 60字节

感谢@Neil帮助打高尔夫球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
尼尔2016年

对于我来说,无论是来自手册length还是用户脚本,对于我来说都是97 ,也许您没有计算换行符,但这仅仅是因为我不小心包括了分号
仅使用ASCII的

我现在看到了-我没有复制;不需要的内容(JavaScript具有ASI)。
尼尔

是的,很抱歉,我必须确保Chromium控制台将函数调用置于函数主体之外(如果在写得不好的lambda上曾经执行过一次)
仅ASCII

哦,我没意识到replace会有什么帮助,那真的很整洁!
尼尔

4

Perl,35岁 34 32字节

包括+1的 -p

在STDIN上输入

eso.pl

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

注意final后面有一个空格;。该代码按如下所示工作,但是将其替换\0文字字符以获得要求的分数。


非常好的代码。那$a|=...做得很好,花了我一段时间才弄清楚你在做什么!尽管有一个问题:*_=a似乎大致等同于$_=$a,为什么?
达达

*_=a是一个非常模糊的glob分配,别名为_globals和aglobals。因此,它并不是从$a到的副本,$_而是从那之后的副本(全局)$a$_实际上是相同的变量。全部保存1个字节...
Ton Hospel

好的,谢谢您的解释!(感谢`$ \`带来了很大的改进)
达达(Dada

3

Python 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

我明天要去学校再打高尔夫球;)


1 for可以减少到1for。此外,如果名单(第5行)的总和不能为负,你可以检查<1代替==0。开学日快乐!:D +1。
Yytsi


2

CJam,12个字节

感谢Sp3000节省2个字节。

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

J,30个字节

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

将字符串列表作为输入。基本上在Jelly回答中使用与Dennis相同的方法。

评论并解释

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

,FSe)s\#ch

在这里尝试!

果冻港口的答案

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

1

C#157122字节

多亏了@milk,高尔夫球了35个字节-尽管我发誓我早些尝试过。

将输入作为二维字符数组。

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个字节:

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');}

不应该Trim()代替TrimEnd()吗?更好的是,我认为您可以通过使用s [0]作为输出var并使用return new string(s[0],0,i)where i是最后一个代码字符的索引来节省很多字节。这个想法可能需要两个for循环而不是foreach,我会考虑更多,然后在今天晚些时候尝试编写实际代码。
牛奶

Trim()也会从一开始就进行调整,我认为这是无效的。我最初也正在加载到s [0]中,并且我i;在循环外有int (以便在返回中重用),我相信最终会增加字节
pinkfloydx33

1

Pyth,11个字节

PhceCSMCQ\#

一个程序,它在STDIN上输入字符串列表并输出一个字符串。

在线尝试

怎么运行的

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个字节

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

在输入末尾需要换行符。
我敢肯定我可以再打些高尔夫,但我很高兴它现在可以使用。





0

TSQL,216175字节

打高尔夫球:

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('%_#%',@))

取消高尔夫:

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('%_#%',@))

小提琴


0

Javascript,56 34字节,无竞争

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

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

正如@ n​​̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳所指出的那样,我没有多余的空间


未通过“准备增加空间”案例
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

Dyalog APL,22 字节

启示

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

(

⎕UCS 的字符表示

¯2↓ 除了最后两个

⍳∘35↑ 直到第35个(“#”)的位置(括号中的位置除外),取自

括号外的

) 即...

⌈⌿ 柱状最大值

⎕UCS Unicode值

在线尝试APL!


多少字节?
acrolith
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.