난해한 코드에서 주석을 파싱하십시오.


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!

문자열 목록, 줄 바꿈이 포함 된 단일 문자열, 2d 문자 목록 등 원하는 형식으로 입력 할 수 있습니다.


다음 문자 보다 낮은 문자를 가진 코드를 받아 들여야 합니까?
wizzwizz4

빈 줄로 테스트 케이스를 추가 할 수 hello world!있습니까? 또한 " #입력의 주석 섹션에 " 가 나타나지 않습니다. "라고 말하지만 코드 조각 자체에서 발생할 수 있습니까?
Kevin 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
그것은 단지 ... 와우입니다.
Jonathan Allan

3
나는 지금 너무 젤리입니다.
MonkeyZeus

당신은 어떻게 당신의 전화를 해킹합니까?
simbabque

2
@simbabque 인내와 많은 복사 붙여 넣기.
Dennis

저는 항상 9 번 아이언을 사용하고 있습니다. 아마 그린에있을 때 퍼터를 사용하는 법을 배웠을 때가 있습니다.
Magic Octopus Urn

13

파이썬 2, 48 43 바이트

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

5 바이트를 골라 낸 @xnor에게 감사드립니다!

Ideone에서 테스트하십시오 .


1
나는 당신이 할 수 있는 많은 주장을 취하고 map(max,*x)작기 때문에 할 수 있다고 생각합니다 . maxNone
xnor

그래, 난 항상 그런 식 map으로 사용될 수 있다는 걸 잊어 버려
Dennis

1
`...`[2::5]트릭 은 어떻게 작동합니까?
smls

1
@smls `...`는 동일 repr(...)하므로 singleton 문자열 목록의 ['a', 'b', 'c']경우 문자열을 얻습니다 "['a', 'b', 'c']". 마지막으로 [2::5]처음 두 문자 ( "['")를 잘라 내고 나머지 문자열의 다섯 번째 문자를 모두 취합니다.
Dennis

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 바이트를 셉니까? 또한의 공간과 마찬가지로 mregexp 플래그는 불필요합니다 ( $한 지점에 있었습니까?) (p, c). 마지막으로, replace보다 짧은 운동을 할 것이라고 생각 [...p].map().join합니다.
Neil

매뉴얼 length과 사용자 스크립트 모두에서 97은 나에게 줄 바꿈을 세지 않았지만 실수로 세미콜론을 포함했기 때문에
ASCII 만

나는 지금 보았습니다- ;필요 하지 않은 것을 복사 하지 않았습니다 (JavaScript에는 ASI가 있습니다).

네, 죄송합니다, 나는 그것을 확실히 크롬 콘솔 풋에게 함수 본문 외부 함수 호출했습니다 (그것을했다 심하게 작성 람다에 한 번)
ASCII 전용

와우, 나는 replace그렇게 많은 도움 이 될지 몰랐다 .

4

펄, 35 34 32 바이트

에 +1 포함 -p

STDIN에 입력하십시오

eso.pl

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

마지막 뒤에 공백이 ;있습니다. 코드는 표시된대로 작동하지만 \0청구 된 점수를 얻기 위해 리터럴 문자로 대체 됩니다.


아주 좋은 코드입니다. 그것은 $a|=...꽤 잘 이루어졌으며, 당신이 무엇을하고 있는지 알아내는 데 시간이 걸렸습니다! 그래도 한 가지 질문 : *_=a과 대략 같은 것으로 보입니다 $_=$a. 왜 그렇 습니까?
Dada

*_=a_지구본과 지구본의 별명을 나타내는 매우 모호한 glob 할당입니다 a. 그래서에서 너무 많은 사본이 아니다 $a으로 $_하지만 (글로벌) 그 시점에서 $a그리고 $_실제로 같은 변수입니다. 모두 1 바이트를 절약하기 위해 ...
Ton Hospel

설명 감사합니다! (그리고`$ \`덕분에 좋은 개선)
Dada

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

나는 내일 학교가 더 골프를 할거야;)


1 for로 줄일 수 있습니다 1for. 또한 목록의 합계 (5 행)가 음수가 될 수없는 경우 <1대신 대신 확인할 수 있습니다 ==0. 행복한 학교 데이! : D +1.
Yytsi


2

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

J, 30 바이트

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

문자열 목록을 입력으로 사용합니다. 기본적으로 그의 젤리 답변에서 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

자바 스크립트 (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

C # 157 바이트

@milk 덕분에 35 바이트를 기록했습니다. 맹세하지만 일찍 시도했습니다.

입력을 2 차원 문자 배열로 사용합니다.

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()합니까? 더 좋은 점은 출력 var로 s [0]을 사용 하고 마지막 코드 문자의 인덱스는 return new string(s[0],0,i)where 를 사용하여 많은 바이트를 절약 할 수 있다고 생각합니다 i. 이 아이디어는에 대한 for대신 두 개의 루프 가 필요할 수 있습니다. foreach더 생각하고 오늘 나중에 실제 코드를 작성하려고 시도합니다.
우유

Trim()처음부터 다듬을 것입니다. 또한 원래 S [0]로로드 하하고, I는 INT했다 i;(리턴에 재사용) I 결국 추가 바이트를 판단하는 루프의 외부
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

젤리 , 27 바이트

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

TryItOnline 에서 테스트

가장 엄격한 사양을 사용합니다-주석 문자 앞에 바이트를 추가하여 제거하기위한 추가 공간.

입력은 문자열 목록입니다.


어쩌면 그래서,하지만 당신은 그가 내게 준 분쇄 보았는가 - 골퍼를 @Erik 여기 ?
Jonathan Allan


0

TSQL, 216 175 바이트

골프 :

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

자바 스크립트, 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

디아 로그 APL , 22 바이트

영감 .

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

(

⎕UCS 의 문자 표현

¯2↓ 마지막 두 개를 제외한 모두

⍳∘35↑ 괄호 밖에있는 첫 번째 35 ( "#")의 위치까지

괄호 밖에있는 것

) 즉...

⌈⌿ 주상 최대

⎕UCS 유니 코드 값

TryAPL 온라인!


몇 바이트입니까?
acrolith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.