Phân tích các ý kiến ​​ra khỏi mã bí truyền của tôi


30

Đầu tuần này, chúng tôi đã tìm hiểu về cách định dạng các ngôn ngữ bí truyền để bình luận. Hôm nay, chúng ta sẽ làm điều ngược lại. Tôi cần bạn viết một chương trình hoặc hàm phân tích một số mã bí truyền được nhận xét tốt và phân tích các nhận xét, chỉ trả lại mã. Sử dụng một số ví dụ từ thử thách trước, đây là đoạn mã được nhận xét tốt trông như thế nào:

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

Dưới đây là những gì bạn cần làm để trích xuất mã. Đầu tiên, xóa ký tự nhận xét ( #), khoảng trắng trước nó và mọi thứ sau ký tự nhận xét.

a               
 bc             
   d            
    e           
     fgh        
        ij      
          k     
           l    
            mn  
              op

Sau đó, thu gọn mỗi dòng lên trên thành một dòng duy nhất. Ví dụ, vì bở cột thứ hai trên dòng hai, một khi chúng ta thu gọn nó, nó sẽ ở cột thứ hai trên dòng một . Tương tự, csẽ được đặt trong cột thứ ba của dòng một, và dsẽ được đặt vào cột thứ tư. Lặp lại điều này cho mỗi nhân vật và bạn nhận được điều này:

abcdefghijklmnop

Lưu ý quan trọng: Có vẻ như giải pháp tầm thường là chỉ xóa các bình luận, xóa mọi chỗ trống và tham gia mọi dòng. Đây không phải là một cách tiếp cận hợp lệ! Bởi vì mã ban đầu có thể có khoảng trắng trong đó, chúng sẽ bị loại bỏ bằng cách tiếp cận này. Ví dụ, đây là một đầu vào hoàn toàn hợp lệ:

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

Và đầu ra tương ứng phải là:

hello  world!

Các thách thức:

Viết chương trình hoặc hàm lấy mã nhận xét làm đầu vào và xuất hoặc trả lại mã với tất cả các nhận xét được phân tích cú pháp. Bạn nên xuất mã mà không có bất kỳ dấu cách nào, mặc dù một dòng mới theo dõi được cho phép. Các nhân vật bình luận sẽ luôn luôn #, và sẽ luôn có thêm một khoảng trống trước khi các bình luận bắt đầu. #sẽ không xuất hiện trong phần bình luận của đầu vào. Để giữ cho thử thách đơn giản hơn, đây là một số đầu vào bạn không phải xử lý:

  • Bạn có thể giả sử rằng mã sẽ không có hai ký tự trong cùng một cột. Ví dụ: đây là một đầu vào vi phạm quy tắc này:

    a  #A character in column one
    bc #Characters in columns one and two
    
  • Bạn cũng có thể giả định rằng tất cả các ký tự nhận xét xuất hiện trong cùng một cột. Ví dụ: đầu vào này:

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

    vi phạm quy tắc này. Điều này cũng có nghĩa là #sẽ không nằm trong phần mã.

  • Và cuối cùng, bạn không phải xử lý các phần mã với khoảng trắng ở đầu hoặc cuối. Ví dụ,

      Hello,          #
             World!   #
    

Bạn cũng có thể cho rằng đầu vào chỉ chứa các ký tự ASCII có thể in được.

Ví dụ:

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!

Bạn có thể lấy đầu vào ở bất kỳ định dạng hợp lý nào bạn thích, ví dụ: danh sách các chuỗi, một chuỗi có dòng mới, danh sách 2 ký tự, v.v ... Câu trả lời ngắn nhất bằng byte sẽ thắng!


Chúng ta có cần chấp nhận mã với các ký tự thấp hơn ký tự tiếp theo không?
wizzwizz4

Bạn có thể thêm trường hợp thử nghiệm với dòng trống chỉ với hai khoảng trắng (như hello world!bạn đã hiển thị) không? Ngoài ra, bạn nêu: " #sẽ không xuất hiện trong phần bình luận của đầu vào. ", Nhưng nó có thể xảy ra trong chính đoạn mã không?
Kevin Cruijssen

@KevinCruijssen Xem các chỉnh sửa của tôi
DJMcMayhem

@ wizzwizz4 Tôi không chắc là tôi có hiểu câu hỏi của bạn không
DJMcMayhem

@DJMcMayhem Ví dụ: do {stuff} while (condition);với lời giải thích theo thứ tự do while (condition); #Explainythingsau đó {stuff} #Explainything.
wizzwizz4

Câu trả lời:


18

Thạch , 8 7 byte

»/ṣ”#ḢṖ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

»/ṣ”#ḢṖ  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
Đó chỉ là ... wow.
Jonathan Allan

3
Tôi rất thạch ngay bây giờ.
MonkeyZeus

Làm thế nào để bạn thậm chí hack nó vào điện thoại của bạn?
simbabque

2
@simbabque Kiên nhẫn và dán nhiều bản sao.
Dennis

Tôi luôn luôn sử dụng bàn ủi 9, có lẽ đã đến lúc tôi học cách sử dụng gậy putter khi ở trên màu xanh lá cây ...
Bạch tuộc ma thuật Urn

13

Python 2, 48 43 byte

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

Cảm ơn @xnor vì đã chơi golf 5 byte!

Kiểm tra nó trên Ideone .


1
Tôi nghĩ bạn chỉ có thể làm map(max,*x)maxcó bất kỳ số lượng đối số và Nonenhỏ.
xnor

Phải, tôi luôn quên rằng mapcó thể được sử dụng như vậy ... Cảm ơn!
Dennis

1
Làm thế nào để `...`[2::5]lừa làm việc?
smls

1
@smls `...`tương đương với repr(...), vì vậy, đối với danh sách các chuỗi singleton ['a', 'b', 'c'], bạn nhận được chuỗi "['a', 'b', 'c']". Cuối cùng, chọn [2::5]hai ký tự đầu tiên ( "['") và lấy mỗi ký tự thứ năm của chuỗi còn lại.
Dennis

5

JavaScript (ES6), 97 75 60 byte

Cảm ơn @Neil vì đã giúp chơi golf 22 byte

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

Đầu vào là một mảng các dòng.

  • a là đầu vào mảng
  • p là mục trước
  • c là mặt hàng hiện tại
  • m là chuỗi phù hợp
  • o được bù

Tôi đếm 96 byte? Ngoài ra, mcờ regrec là không cần thiết (bạn đã có một $điểm chưa?) Như là không gian trong (p, c). Cuối cùng, tôi nghĩ replacesẽ làm việc ngắn hơn [...p].map().join.
Neil

97 đối với tôi, cả từ hướng dẫn sử dụng lengthvà mô tả người dùng, có thể bạn đã không đếm dòng mới, nhưng chỉ vì tôi vô tình bao gồm dấu chấm phẩy
ASCII - chỉ

Bây giờ tôi đã thấy - tôi đã không sao chép ;cái không cần thiết (JavaScript có ASI).
Neil

Vâng, xin lỗi, tôi đã có nó để đảm bảo bảng điều khiển Chromium thực hiện cuộc gọi chức năng bên ngoài thân chức năng (đã có một lần trên lambda được viết xấu)
ASCII - chỉ

Ôi chà, tôi không nhận ra replacesẽ giúp được nhiều, điều đó thực sự gọn gàng!
Neil

4

Perl, 35 34 32 byte

Bao gồm +1 cho -p

Cung cấp đầu vào trên STDIN

eso.pl

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

Lưu ý rằng có một khoảng trống sau trận chung kết ;. Mã này hoạt động như được hiển thị, nhưng thay thế \0bằng ký tự bằng chữ để có được số điểm được yêu cầu.


Mã rất đẹp. Điều đó $a|=...được thực hiện khá tốt, tôi phải mất một thời gian để tìm ra những gì bạn đang làm! Một câu hỏi mặc dù: *_=adường như gần tương đương với $_=$a, tại sao vậy?
Dada

*_=alà một nhiệm vụ toàn cầu rất mơ hồ mà bí danh toàn cầu _và toàn cầu a. Vì vậy, nó không phải là một bản sao từ $ađến $_nhưng từ thời điểm đó (toàn cầu) $a$_thực sự là cùng một biến. Tất cả để tiết kiệm 1 byte ...
TonMedel

Ok, cảm ơn đã giải thích! (và cải thiện tốt đẹp nhờ `$ \`)
Dada

3

Python 2, 187 byte

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

Tôi sẽ chơi golf nhiều hơn vào ngày mai tôi có trường học;)


1 forcó thể được giảm xuống 1for. Ngoài ra, nếu tổng của danh sách (ở dòng 5) không thể âm, bạn chỉ có thể kiểm tra <1thay vì ==0. Chúc mừng ngày học! : D +1.
Yytsi


2

CJam , 12 byte

Cảm ơn Sp3000 đã lưu 2 byte.

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

Một khối không tên lấy danh sách các chuỗi (một chuỗi cho mỗi dòng) và thay thế nó bằng một chuỗi.

Hãy thử trực tuyến!

Giải trình

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

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

Đưa ra một danh sách các chuỗi làm đầu vào. Về cơ bản sử dụng cách tiếp cận tương tự như Dennis trong câu trả lời Jelly của mình.

Nhận xét và giải thích

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

f =: magic over maxes

Các bước trung gian:

   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? 

Trường hợp thử nghiệm

   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 byte

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

Đưa đầu vào như một mảng của chuỗi.

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

Chơi gôn 35 byte nhờ @milk - mặc dù tôi thề tôi đã thử điều đó trước đó.

Đưa đầu vào dưới dạng một mảng 2 ký tự.

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

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

Không nên Trim()làm việc thay vì TrimEnd()? Thậm chí tốt hơn, tôi nghĩ bạn có thể tiết kiệm rất nhiều byte bằng cách sử dụng s [0] làm var đầu ra và sử dụng return new string(s[0],0,i)đâu ilà chỉ mục của ký tự mã cuối cùng. Ý tưởng đó có thể yêu cầu hai forvòng thay vì foreach, tôi sẽ nghĩ về nó nhiều hơn và cố gắng viết mã thực tế sau ngày hôm nay.
sữa

Trim()cũng sẽ cắt giảm từ đầu, mà tôi tin rằng sẽ không hợp lệ. Ban đầu tôi cũng đang thực hiện tải vào s [0] và tôi có int i;bên ngoài vòng lặp (để sử dụng lại trong phần trả về) mà tôi tin rằng cuối cùng đã thêm byte
Pinkfloydx33

1

Bình thường, 11 byte

PhceCSMCQ\#

Một chương trình lấy đầu vào của danh sách các chuỗi trên STDIN và in một chuỗi.

Dùng thử trực tuyến

Làm thế nào nó hoạt động

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 byte

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

Yêu cầu một dòng mới ở cuối đầu vào.
Tôi chắc chắn rằng tôi có thể chơi golf này nhiều hơn một chút, nhưng bây giờ tôi rất vui vì nó hoạt động.



0

Thạch , 27 byte

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

Kiểm tra nó tại TryItOnline

Sử dụng thông số kỹ thuật nghiêm ngặt nhất - khoảng trống thừa trước khi ký tự nhận xét bị xóa với giá của một byte.

Đầu vào là một danh sách các chuỗi.


@Erik the Golfer - có lẽ vậy, nhưng bạn có thấy sự nghiền nát mà anh ấy dành cho tôi ở đây không?
Jonathan Allan


0

TSQL, 216 175 byte

Chơi gôn

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

Ung dung:

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

Vĩ cầm


0

Javascript, 56 34 byte, không cạnh tranh

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

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

Như @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ đã chỉ ra, tôi không chuẩn bị cho không gian thêm


Không vượt qua trường hợp "Chuẩn bị cho không gian thêm"
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

APL Dyalog , 22 byte

Cảm hứng .

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

(

⎕UCS đại diện nhân vật của

¯2↓ tất cả trừ hai

⍳∘35↑ cho đến vị trí của 35 đầu tiên ("#"), trong đó nằm ngoài dấu ngoặc đơn, được lấy từ

cái nằm ngoài dấu ngoặc đơn

) cụ thể là ...

⌈⌿ mức tối đa của cột

của

⎕UCS các giá trị Unicode

Dùng thử trực tuyến!


Có bao nhiêu byte?
acrolith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.