แยกความคิดเห็นออกจากรหัสลับของฉัน


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 Patience และการคัดลอกจำนวนมาก
เดนนิส

ฉันมักจะใช้เหล็ก 9 ตัวบางทีอาจถึงเวลาที่ฉันเรียนรู้วิธีใช้พัตเตอร์เมื่ออยู่บนกรีน ...
Magic Octopus Urn

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ธง regexp ไม่จำเป็น (ไม่คุณมี$จุดหนึ่ง?) (p, c)เป็นพื้นที่ใน สุดท้ายผมคิดว่าจะทำงานออกมาสั้นกว่าreplace [...p].map().join
Neil

97 สำหรับฉันทั้งจากคู่มือlengthและ userscript บางทีคุณอาจไม่ได้ขึ้นบรรทัดใหม่ แต่เพราะฉันรวมอัฒภาคไว้โดยไม่ตั้งใจ
ASCII- เท่านั้น

ฉันเห็นแล้วตอนนี้ - ฉันไม่ได้คัดลอกสิ่ง;ที่ไม่จำเป็น (JavaScript มี ASI)
Neil

ใช่ฉันต้องให้แน่ใจว่า Chromium console วางการเรียกใช้ฟังก์ชันนอกส่วนของฟังก์ชัน (หากมีแลมบ์ดาที่เขียนไม่ดีครั้งเดียว)
ASCII-only

โอ้ว้าวฉันไม่ได้ตระหนักเลยว่าreplaceจะช่วยได้มากมันก็เรียบร้อยจริงๆ!
Neil

4

Perl, 35 34 32 ไบต์

รวม +1 สำหรับ -p

ให้อินพุตบน STDIN

eso.pl

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

;แจ้งให้ทราบว่ามีช่องว่างหลังขั้นสุดท้าย รหัสทำงานตามที่แสดง แต่แทนที่\0ด้วยอักขระตามตัวอักษรเพื่อรับคะแนนที่อ้างสิทธิ์


รหัสที่ดีมาก ว่า$a|=...จะทำค่อนข้างดีก็เอาฉันในขณะที่จะคิดออกสิ่งที่คุณกำลังทำอะไร! แต่คำถามหนึ่งข้อ: *_=aดูเหมือนว่าจะเทียบเท่ากับ$_=$aเหตุใดจึงเป็นเช่นนั้น
Dada

*_=aเป็นงานมอบหมายที่ไม่ชัดเจนมากซึ่งทำให้นามแฝง_กลมและaกลมกลืน ดังนั้นจึงไม่ได้คัดลอกจาก$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

ทับทิม, 63 ไบต์

โดยทั่วไปพอร์ตของเดนนิสคำตอบของวุ้น รับอินพุตเป็นอาร์เรย์ของสตริง

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

ดูได้ที่ eval.in: https://eval.in/640757


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

รับรายการสตริงเป็นอินพุต โดยทั่วไปใช้วิธีการเดียวกันกับเดนนิสในคำตอบของเยลลี่

แสดงความคิดเห็นและอธิบาย

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

C # 157 122 Bytes

Golfed 35 bytes ต้องขอบคุณ @milk - แม้ว่าฉันจะสาบานได้ว่าฉันลองมาก่อนหน้านี้

รับอินพุตเป็นอาร์เรย์อักขระสองมิติ

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)ที่iเป็นดัชนีของอักขระรหัสสุดท้าย ความคิดนั้นอาจต้องใช้สองforลูปแทนforeachฉันจะลองคิดดูอีกรอบแล้วลองเขียนโค้ดจริงในวันนี้
นม

Trim()จะตัดจากจุดเริ่มต้นด้วยซึ่งฉันเชื่อว่าจะไม่ถูกต้อง ฉันยังได้ทำการโหลดลงใน s [0] และฉันมี int 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 the Golfer - อาจเป็นเช่นนั้น แต่คุณเห็นการบดขยี้ที่เขาให้ฉันที่นี่หรือไม่
Jonathan Allan

0

Ruby, 77 ไบต์

puts File.readlines("stack.txt").join('').gsub(/\s{1}#.*\n/,'').gsub(/\s/,'')

การเข้ารหัสฮาร์ดชื่อไฟล์อินพุตไม่ใช่วิธีการอินพุตที่ยอมรับได้
Mego

@Mego ฉันจะหากฎของสิ่งที่ "ยอมรับได้" ที่ไหน
ส่งต่อ


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

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

ซอ


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

ลองใช้ออนไลน์!


กี่ไบต์
acrolith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.