ยกเลิกข้อคิดเห็นโปรแกรม COBOL!


64

COBOL เป็นภาษาที่เก่าแก่มากในขณะที่เขียนมันเป็น 58 ปี อันที่จริงแล้วมันมีความแปลกประหลาดที่น่าสนใจมาก: ตัวละครหกตัวแรกของแต่ละบรรทัดเป็นความคิดเห็น

ทำไมถึงเป็นเช่นนี้คุณถาม เอาล่ะตัวละครทั้ง 6 ตัวนั้นตั้งใจที่จะใช้เป็นหมายเลขบรรทัดย้อนกลับไปในวันที่โปรแกรมไม่ได้พิมพ์แบบดิจิทัลอย่างสมบูรณ์

นอกจากนี้อักขระที่เจ็ดสามารถเป็นส่วนหนึ่งของชุดที่เล็กมากได้ (โดยปกติ*จะใส่เครื่องหมายบรรทัดหรือช่องว่างเพื่อแยกหมายเลขบรรทัดออกจากโค้ด)

แต่ถ้าคุณใช้ระบบดิจิทัลมากกว่านี้และคุณแค่ต้องการโปรแกรมดิบ

ระบบแสดงความคิดเห็น

ความคิดเห็นใน COBOL มีสองประเภท: ความคิดเห็นในบรรทัดและความคิดเห็น "หมายเลขบรรทัด" ข้างต้น

หมายเลขโทรศัพท์ที่ไม่ได้กล่าวถึงนั้นง่ายมากเพียงแค่ถอดตัวอักษรเจ็ด (หกบวกช่องว่างเดียว) ออกจากแต่ละบรรทัด

000000 apple
000001 banana
celery donuts

จะกลายเป็น:

apple
banana
donuts

ความคิดเห็นในบรรทัดทำให้ยากขึ้นอีกเล็กน้อย ความคิดเห็นบรรทัดเริ่มต้นด้วยเครื่องหมายดอกจันที่*อยู่ในตำแหน่งอักขระที่เจ็ดของบรรทัดเช่น:

000323* this is a comment

นี่ไม่ใช่ความคิดเห็นของบรรทัด:

*00000 this isn't a comment

หากต้องการยกเลิกการใส่เครื่องหมายข้อคิดเห็นในบรรทัดเพียงลบทั้งบรรทัด

ตัวอย่างความเห็น "โปรแกรม":

000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges

รุ่นที่ไม่มีข้อคิดเห็น:

blah blah
oranges?
love me some oranges

ในคำอื่น ๆ หากต้องการยกเลิกการใส่เครื่องหมายสตริงให้ลบอักขระหกตัวแรกของแต่ละบรรทัดจากนั้นส่งคืนทั้งหมดยกเว้นอักขระแรกของทุกบรรทัดที่ไม่ได้ขึ้นต้นด้วยดาว

ความท้าทาย

สร้างโปรแกรมหรือฟังก์ชั่นที่ใช้โปรแกรมที่มีคอมเมนต์และส่งคืนชุดตัวเลือกที่ไม่มีการแบ่งแยก

ชี้แจง

  • เครื่องหมายดอกจัน ( *) จะไม่ปรากฏที่ใดก็ได้นอกเจ็ดอักขระแรกในบรรทัด (เราไม่ได้ขอให้คุณยืนยันไวยากรณ์)
  • แต่ละบรรทัดจะมีอักขระอย่างน้อย 7 ตัวเสมอ
  • คุณอาจสมมติว่าอักขระตัวที่เจ็ดเป็นเครื่องหมายดอกจันหรือเว้นวรรคเสมอ
  • อินพุตหรือเอาต์พุตอาจเป็นเมทริกซ์หรือรายการ
  • ต้องจัดการอักขระ ASCII ที่พิมพ์ได้ (รวมถึงบรรทัดใหม่)
  • คุณสามารถส่งออกด้วยการขึ้นบรรทัดใหม่ คุณอาจสันนิษฐานว่าอินพุตจะมีการขึ้นบรรทัดใหม่หากคุณเลือก

เกณฑ์การให้คะแนน

เนื่องจากนี่คือคำตอบที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ!

การปฏิเสธความรับผิด: ฉันไม่รู้จริง ๆ ภาษาโคบอลและไม่เรียกร้อง หากการอ้างสิทธิ์ใด ๆ เกี่ยวกับ COBOL ที่ฉันทำในคำถามนี้ไม่ถูกต้องฉันจะไม่รับผิดชอบ


23
หมายเลขบรรทัดไม่ใช่ความคิดเห็น พวกเขาเป็นคอลัมน์ คำศัพท์โปรด
user207421

1
*ตัวอย่างทั้งหมดของคุณมีช่องว่างหลังที่ นี่เป็นเรื่องบังเอิญหรือไม่?
Neil

6
เก่าไม่ได้บอกเป็นนัยโดยอัตโนมัติ ฉันทำงานในร้านค้า Agile COBOL พวกเขาสามารถทำสิ่งต่าง ๆ ใน AS / 400 ที่เราไม่สามารถทำได้ใน Java
Thorbjørn Ravn Andersen

1
อืม ... ฉันจริง ๆ แล้วฉันเขียนโปรแกรมแยกวิเคราะห์ COBOL CopyBook ซึ่งจะทำงานเฉพาะในกรณีที่ไม่มีการบรรจุฟิลด์ เพียงแค่แปลงมันเป็น key:{key:{key:length,key:length}}JSON แยกข้อมูลการจัดรูปแบบทั้งหมดและพิมพ์ข้อมูลแม้ว่า
Magic Octopus Urn

4
มีช่องว่างใน 6 ตัวแรกหรือไม่?

คำตอบ:


104

COBOL (GnuCOBOL), 191 + 17 = 208 ไบต์

ฉัน "เรียนรู้" ภาษาโคบอลสำหรับคำตอบนี้ดังนั้นจึงอาจไม่ได้เล่นกอล์ฟอย่างเต็มที่

นี่เป็นโปรแกรมเต็มรูปแบบโดยรับอินพุตในสิ่งที่ฉันคิดว่าเป็นอินพุตมาตรฐานและเขียนลงในสิ่งที่ฉันคิดว่าเป็นเอาต์พุตมาตรฐาน บางทีวันหนึ่งฉันจะกลับมาที่นี่และ (1) พิจารณาว่าภาษาโคบอลมีฟังก์ชั่นหรือไม่และถ้าเป็นเช่นนั้น (2) ดูว่าโซลูชันฟังก์ชั่นจะสั้นลงหรือไม่

จำนวนไบต์รวมถึงโปรแกรมและธงคอมไพเลอร์ ( -freeและ-frelax-syntax)

program-id.c.select i assign keyboard line sequential.fd i. 1 l pic X(80). 88 e value 0.open input i perform until e read i end set e to true end-read if not e and l(7:1)<>'*'display l(8:73).

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

โปรแกรม Ungolfed

program-id. c.

select i assign to keyboard organization line sequential.

fd i.
    1 l pic X(80).
    88 e value 0.

open input i
perform until e
    read i
        end set e to true
    end-read
    if not e and l(7:1) <> '*'
        display l(8:73).

ข้อ จำกัด

ผลลัพธ์คือเทคนิคการพูดไม่ถูกต้อง จากการวิจัยคร่าวๆของฉันดูเหมือนว่าวิธีเดียวที่ใช้งานได้จริงในการจัดเก็บสตริงใน COBOL อยู่ในบัฟเฟอร์ขนาดคงที่ ฉันเลือกบัฟเฟอร์ขนาด 80 ตัวอักษรเนื่องจากนี่เป็นขีดจำกัดความยาวบรรทัดสำหรับโปรแกรมที่มีรูปแบบคงที่ ข้อเสนอนี้มีข้อ จำกัด สองประการ:

  • บรรทัดที่มีความยาวเกิน 80 อักขระจะถูกปัดเศษ
  • บรรทัดที่มีความยาวน้อยกว่า 80 อักขระจะถูกเสริมด้วยช่องว่าง

ฉันเดาว่านี่เป็นสิ่งที่ยอมรับได้เพราะมันคือภาษาโคบอล ถ้าไม่ฉันยินดีที่จะมองหาทางเลือกอื่น

กิตติกรรมประกาศ

  • -166 ไบต์ขอบคุณ Edward H
  • -2 ไบต์ขอบคุณhornj

10
เครื่องหมายดอกจัน (*) จะไม่พบที่ใดก็ได้นอกเจ็ดตัวละครครั้งแรกในบรรทัด ... และยัง ... ;)
Cœur

@ Cœurฮ่าฮ่าใช่ ... แต่วิธีการแก้ปัญหาของฉันไม่ได้ใช้ข้อสันนิษฐานนั้นดังนั้นมันอาจจะเหมาะสม!
จา

8
คุณชนะอินเทอร์เน็ตเดียว
โจชัว

@Cœurยกเว้นในคำสั่ง COMPUTE
ClickRick

1
ขอแสดงความยินดีกับตราทองของคุณ!
caird coinheringaahing

20

Python 2 , 39 38 37 ไบต์

-1 ไบต์ขอบคุณ LyricLy -1 ไบต์ต้องขอบคุณ Mego

lambda s:[i[7:]for i in s if'*'>i[6]]

ลองออนไลน์!

I / O เป็นรายการสตริง


2
บันทึกไบต์โดยแทนที่!=ด้วย<เนื่องจากจุดรหัสของช่องว่างต่ำกว่าเครื่องหมายดอกจันและอักขระตัวที่เจ็ดจะเป็นช่องว่างหรือเครื่องหมายดอกจัน
LyricLy

ดังนั้นตัวละครที่ 7 จะเป็นช่องว่างหรือดอกจันเสมอ
มนุษย์โดยรวม

ใช่. You may assume the seventh character is always an asterisk or a space.
LyricLy

1
บันทึก 1 ไบต์ด้วยif'*'!=i[6]
Mego

13

Perl 5 , 19 + 1 (-p) = 20 16 ไบต์

-4 ไบต์พร้อมคำแนะนำของ Pavel

s/.{6}( |.*)//s

ลองออนไลน์!


2
คุณสามารถบันทึกสามไบต์หากคุณแทนที่(\*.*$| )ด้วย( |.*)
Pavel

ไม่สั้นเท่ากับความคิดเห็นของ @ Pavel แต่/ /;$_=/\* /?$,:$'เป็นอีกทางเลือกหนึ่ง
Dom Hastings

^นอกจากนี้คุณยังไม่จำเป็นต้องใช้
พาเวล

11

V , 13 11 10 ไบต์

Î6x<<
çª/d

ลองออนไลน์!

คำอธิบาย

Î       ' On every line
  x     ' delete the first...
 6      ' 6 characters
   <<   ' and unindent the line (removes the leading space)
ç /     ' on every line
 ª      ' matching \*
   d    ' delete the line

hexdump:

00000000: ce36 783c 3c0a e7aa 2f64                 .6x<<.../d

คุณทำ7xแทน6x<<ไม่ได้ใช่ไหม
DJMcMayhem

1
จากนั้นจะลบ*
nmjcman101

มันจะทำงานเพื่อลบการ lins ด้วย*ก่อนแล้วทำÎ7xอย่างไร (สมมติว่า * ไม่สามารถอยู่ในตัวอักษร 0-5)
12431234123412341234123

@ 12431234123412341234123 น่าเสียดายที่ไม่มีเพราะอาจมี*อักขระ 6 ตัวแรก
nmjcman101

9

Paradoc (v0.2.8 +), 8 ไบต์ (CP-1252)

µ6>(7#;x

รับรายการของบรรทัดและผลลัพธ์ในรายการของบรรทัดที่ไม่ใส่เครื่องหมายคอมเมนต์

คำอธิบาย:

μ        .. Map the following block over each line (the block is terminated
         .. by }, but that doesn't exist, so it's until EOF)
 6>      .. Slice everything after the first six characters
   (     .. Uncons, so now the stack has the 6th character on top
         .. and the rest of the line second
    7#   .. Count the multiplicity of factors of 7 in the character
         .. (treated as an integer, so '*' is 42 and ' ' is 32)
      ;  .. Pop the top element of the stack (the rest of the line)...
       x .. ...that many times (so, don't pop if the 6th character was a
         .. space, and do pop if it was an asterisk)

สวัสดีฉันเขียนภาษาการเขียนโปรแกรมกอล์ฟ :)

ฉันยังคงพัฒนามันอยู่และเพิ่ม / ปรับแต่งบิวด์อินหลังจากพยายามเขียนสิ่งนี้เพื่อให้มีวิธีที่เหมาะสมกว่าในการแยกความแตกต่างระหว่างช่องว่างกับเครื่องหมายดอกจันมากกว่า " 7#" แต่ฉันรู้สึกว่ามันจะทำให้การเขียนแบบนี้ไม่ใช่ มันโชคดีที่มันยังใช้งานได้ (ใช้เพียงฟีเจอร์จาก v0.2.8 ซึ่งฉันได้ทำไว้เมื่อสามวันก่อน)


"สวัสดีฉันเขียนภาษาโปรแกรมกอล์ฟ" รุ่นที่คุณใช้วางจำหน่ายก่อนหรือหลังการท้าทายนี้ถูกโพสต์หรือไม่
เสา

1
มันทำงานได้ในรุ่นนี้จากสามวันที่ผ่านมา: github.com/betaveros/paradoc/releases/tag/v0.2.8
betaveros

ขวาที่คุณกล่าวถึงนั้น แต่อย่างใดไม่ได้ลงทะเบียนอย่างชัดเจน ...
Mast


7

อ็อกเทฟ 23 ไบต์

@(s)s(s(:,7)~=42,8:end)

ลองออนไลน์!


4
ฉันไม่เคยรู้เลยว่า Octave สามารถสร้างสตริงแบบนี้ได้ ... xD
Sanchises

ตั้งแต่R2016b เปิดตัวอาร์เรย์สตริงฉันค่อนข้างแน่ใจว่ามันจะทำงานใน MATLAB ด้วย @Sanchises! ขณะนี้ฉันมีสิทธิ์เข้าถึง R2015b เท่านั้นดังนั้นจึงไม่สามารถยืนยันได้ MATLAB สามารถทำได้ใน 74 ไบต์อาจน้อยกว่า@(s)cellfun(@(r)r(8:end),s(cellfun(@(r)r(7)~=42,s)),'uniformoutput',false)ซึ่งsเป็นเซลล์อาร์เรย์ไม่ใช่อาร์เรย์สตริง การใช้ regexp หรือบางอย่างน่าจะสั้นกว่า แต่วิธีการที่ฉันเขียนนั้นเทียบได้กับวิธีการในคำตอบนี้สำหรับ MATLAB เก่า
Wolfie

6

เยลลี่ , 11 9 ไบต์

ṫ€7Ḣ⁼¥Ðf⁶

ลองออนไลน์!

อินพุตและเอาต์พุตเป็นรายการของบรรทัด

-2 ไบต์ขอขอบคุณ @EriktheOutgolfer และ @JonathanAllan

มันทำงานอย่างไร

ṫ€7Ḣ=¥Ðf⁶
 €           On each line:
ṫ 7            Replace the line with line[7:]
      Ðf     Keep all lines that meet condition:
     ¥         Dyad:
   Ḣ             First Element (modifies line)
    =            Equals
        ⁶    Space

7$€สามารถ€7
Erik the Outgolfer

นำมันลงไปที่ 9 เช่น:ṫ€7Ḣ⁼¥Ðf⁶
Jonathan Allan

5

PowerShellขนาด 32 ไบต์

$input-replace'^.{6}( |.*)'-ne''

ลองออนไลน์!

ไปป์ไลน์มาเป็นอาร์เรย์ของสตริง-replaceทำงานบนทุก ๆ สตริงและ-ne ''(ไม่เท่ากับสตริงว่าง) ที่ใช้กับอาร์เรย์ทำหน้าที่กรองบรรทัดว่าง


4

C, 63 59 55 48 47 46 ไบต์

ขอบคุณที่ " ผู้ใช้ที่ไม่ระบุชื่อ " สำหรับการกำจัดไบต์อื่น

ขอบคุณFelix Palmen ที่เตือนฉันถึง " คุณอาจถือว่าตัวละครที่เจ็ดเป็นเครื่องหมายดอกจันหรือเว้นวรรค " ซึ่งโกนทิ้งอีกหนึ่งไบต์

f(char**a){for(;*a;++a)(*a)[6]&2||puts(*a+7);}

ใช้เช่น:

char** program = { "000000 apple", "000001 banana", "celery donuts", 0 };
f(program);

ลองออนไลน์!


3

จริงแล้ว 13 ไบต์

⌠6@tp' =*⌡M;░

อินพุตและเอาต์พุตทำตามรายการของสตริง

คำอธิบาย:

⌠6@tp' =*⌡M;░
⌠6@tp' =*⌡M    for each line:
 6@t             discard the first 6 characters
    p            pop the first character of the remainder
     ' =         is it a space?
        *        multiply the string by the boolean - returns the string if true, and an empty string if false
           ;░  filter out empty strings

ลองออนไลน์!


3

Gaiaขนาด 9 ไบต์

6>¦'*«⁈ḥ¦

ฟังก์ชั่นรับรายการสตริงและส่งคืนรายการสตริง

ลองออนไลน์!

คำอธิบาย

6>¦        Remove the first 6 characters of each string
   '*«⁈    Filter out ones that start with *
       ḥ¦  Remove the initial space from each

ฉันนับตัวอักษรสิบตัวและเนื่องจากสามตัวไม่ใช่ ASCII พวกเขาจึงไม่ใช้เกินไบต์?
WGroleau

@WGroleau และ«มีอักขระ 1 ตัว ภาษาการตีกอล์ฟที่ใช้อักขระที่ไม่ใช่ ASCII (อาจยกเว้น Neim) ใช้การเข้ารหัสแบบกำหนดเองที่อนุญาตให้ไม่ใช่แบบ ASCII ทั้งหมดจะนับเป็นไบต์เดียว นี่คือหน้ารหัสปฐมภพ
Mr. Xcoder

@ Mr.Xcoder Neim มีการเข้ารหัสเช่นกัน
Erik the Outgolfer

3

Pyth , 9 ไบต์

โปรดทราบว่านี่จะใช้งานได้หากอย่างน้อย 1 บรรทัดไม่ใช่ความคิดเห็นและอย่างน้อย 1 บรรทัดเป็นความคิดเห็น โซลูชันอื่น ๆ ทั้งหมดใช้งานได้ในทุกกรณี

-2 ไบต์ต้องขอบคุณ@pizzakingme !

m>d7.m@b6

ลองที่นี่!

คำอธิบาย

m>d7.m@b6     - Full program with implicit input. Takes input as a list of Strings.

m>d7          - All but the first 7 letters of 
    .m   (Q)  - The input, filtered for its minimal value using the < operator on
      @b6     - the 7th character -- note that "*" is greater than " "
              - Implicitly Output the result.

Pyth , 11 ไบต์

tMfqhTdm>d6

ลองที่นี่!

คำอธิบาย

tMfqhTdm> d6 - โปรแกรมเต็มรูปแบบพร้อมอินพุตโดยนัย รับอินพุตเป็นรายการของ Strings

       m> d6 - ลบอักขระ 6 ตัวแรกของแต่ละบรรทัด
    hT - รับตัวอักษรตัวแรกของแต่ละตัว
  fq d - เก็บเครื่องหมายดอกจันที่มีอักขระตัวแรก
tM - ลบอักขระตัวแรกของแต่ละตัว
            - เอาท์พุทโดยปริยาย

Pyth , 11 ไบต์

m>d7fqd@T6Q

ลองที่นี่!

คำอธิบาย

m> d7fq @ T6dQ - โปรแกรมเต็มรูปแบบ รับอินพุตเป็นรายการของ Strings

      @ T6 - อักขระตัวที่หกของแต่ละตัว
    fq dQ - เก็บบรรทัดที่มีช่องว่างเป็น ^
m> d7 - ครอบตัดอักขระ 7 ตัวแรก
             - ผลผลิตโดยปริยาย

Pyth , 12 ไบต์

tMfnhT\*m>d6

ลองที่นี่!

คำอธิบาย

tMfnhT \ * m> d6 - โปรแกรมเต็มรูปแบบพร้อมอินพุตโดยนัย รับอินพุตเป็นรายการของ Strings

        m> d6 - ลบอักขระ 6 ตัวแรกของแต่ละบรรทัด
    hT - รับตัวอักษรตัวแรกของแต่ละตัว
  fn \ * - กรองผู้ที่ไม่เท่ากับเครื่องหมายดอกจัน
tM - ลบอักขระตัวแรกของแต่ละตัว
             - เอาท์พุทโดยปริยาย

Pyth , 12 ไบต์

m>d7fn@T6\*Q

ลองที่นี่!

คำอธิบาย

m> d7fn @ T6 \ * Q - โปรแกรมเต็มรูปแบบ รับอินพุตเป็นรายการของ Strings

      @ T6 - รับอักขระที่หกของแต่ละสตริง
    fn \ * Q - และกรองผู้ที่ไม่เท่ากับเครื่องหมายดอกจัน
m> d7 - ครอบตัดอักขระ 7 ตัวแรก
              - ผลผลิตโดยปริยาย

" เก็บเครื่องหมายดอกจันไว้ที่ตัวอักษรตัวแรก " ฉันคิดว่าคุณหมายถึง "รักษาสิ่งที่อักขระตัวแรกไม่ใช่เครื่องหมายดอกจัน"
Kevin Cruijssen

m>d7.m@b6ควรทำงานที่ 9 ไบต์การทารุณกรรมที่*เกิดขึ้นหลังจากที่ว่างตามลำดับพจนานุกรม
เดฟ

ฉันสามารถแก้ไขได้ด้วยคำอธิบาย / ลิงค์ทดสอบถ้าคุณต้องการ!
เดฟ

@pizzakingme ฉันจะดีใจถ้าคุณจะแก้ไขเพราะฉันใช้มือถือ ขอบคุณมากและอย่าลืมให้เครดิตตัวเองสำหรับโซลูชันใหม่!
Mr. Xcoder

มันใช้งานได้ไหมถ้าทุกบรรทัดเป็นความคิดเห็นของบรรทัด (ฉันไม่แน่ใจว่าคุณต้องจัดการกับกรณีนี้หรือไม่)
betaveros

3

GNU Sed, 19 + 2 = 21 ตัวอักษร

ต้องการ-Eอาร์กิวเมนต์เพื่อsedเปิดใช้งานนิพจน์ทั่วไปที่ขยายเพิ่ม

/^.{6}\*/d;s/^.{7}/

คุณสามารถทำสิ่งเดียวกันกับผู้ชายที่เป็น Perl ได้s/^.{6}( |.*)//g
markasoftware

3

Java 8, 40 ไบต์

นิพจน์ทั่วไป: ประมาณ แต่ไม่มากเครื่องมือที่ผิดสำหรับงาน แลมบ์ดาจากStringไปString(มอบหมายให้Function<String, String>) อินพุตต้องมีการขึ้นบรรทัดใหม่ที่ต่อท้าย

s->s.replaceAll("(?m)^.{6}( |.*\\n)","")

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

กิตติกรรมประกาศ


เครื่องมือที่เหมาะสม! :)
Olivier Grégoire

3

Haskell , 27 25 ไบต์

เวอร์ชั่นของ Laikoni สั้นกว่าของฉัน:

f n=[x|' ':x<-drop 6<$>n]

ลองออนไลน์!

รุ่นของฉัน:

f n=[drop 7x|x<-n,x!!6<'*']

ลองออนไลน์!


25 f n=[x|' ':x<-drop 6<$>n]ไบต์:
Laikoni

@Laikoni เยี่ยมมาก !! ฉันไม่รู้ว่ามันเป็นไปได้ที่จะจับคู่รูปแบบในตัวกำเนิดของรายการความเข้าใจ
jferard

3

C (gcc) , 53 48 46 ไบต์

x;main(y){for(y=&x;gets(y-6);x&2||puts(y+1));}

ลองออนไลน์!

-5 ไบต์:มันเป็นเรื่องยุ่งยากมากที่จะได้รับนี้ " โปรแกรมทั้งหมด " ลงไปขนาดเดียวกับฟังก์ชั่นของ gurka ตอนนี้มันเขียนออกมาจากขอบเขต (ทั้งสองทิศทาง) ของอาร์เรย์ประเภทที่ไม่ถูกต้องและอาศัยจำนวนendian น้อยและจำนวนเต็ม 4 ไบต์เพื่อค้นหาเครื่องหมายดอกจัน ... แต่เดี๋ยวก่อนมันใช้ได้;)

-2 ไบต์:ถ้าเราเขียนไปยังตำแหน่ง "สุ่ม" .bssแล้วทำไมต้องประกาศอาร์เรย์เลย! ดังนั้นที่นี่มาพร้อมโปรแกรมจัดการสตริงที่ใช้ค่าcharประเภทมิได้อาร์เรย์


ดี! และ*x&2ทำให้ผมจำได้ดังนั้นฉันควรจะสามารถที่จะโกนไบต์บางส่วนออก :-) คำตอบของฉัน "คุณอาจจะสมมติตัวละครที่เจ็ดอยู่เสมอเครื่องหมายดอกจันหรือพื้นที่."
simon

@ gurka ขอบคุณ: D -2, hehe
Felix Palmen

3

R, 47 45 ไบต์

function(x)gsub("(?m)^.{6}( |.*\\n)","",x,,T)

หากคุณรับอินพุตเป็นรายการสตริงฉันคิดว่าคุณสามารถย่อ regex ให้เป็น "^. {6} (|. * ​​$)" สำหรับ -6
อาชญากรคนร้าย

@CriminallyVulgar ถูกต้อง ในกรณีนี้ฉันสามารถลบpe=Tอาร์กิวเมนต์ได้ อย่างไรก็ตามฉันไม่แน่ใจว่าอนุญาตให้ป้อนข้อมูลเป็นรายการสตริงหรือไม่
Sven Hohenstein

จาก OP:Input or output may be a matrix or list.
สิ้นเชิงมนุษย์

@CriminallyVulgar ปัญหาคือการมีสตริงว่างในผลลัพธ์
Sven Hohenstein

@SvenHohenstein อ่าแน่นอนฉันไม่ได้คิดอย่างนั้น
CriminallyVulgar

3

SNOBOL4 (CSNOBOL4) , 72 70 66 50 ไบต์

R	INPUT POS(6) (' '  REM . OUTPUT | '*') :S(R)
END

ลองออนไลน์!

การจับคู่รูปแบบใน SNOBOL นั้นค่อนข้างแตกต่างจาก regex แต่ความคิดที่นี่ยังคงเหมือนเดิม: หากบรรทัดตรงกับ "หกตัวอักษรและเครื่องหมายดอกจัน" ให้ลบออกมิฉะนั้นให้ลบอักขระเจ็ดตัวแรกของบรรทัดแล้วพิมพ์ผลลัพธ์

ตอนนี้สิ่งนี้จะได้ประโยชน์ที่ดีกว่าจากผู้ดำเนินการกำหนดเงื่อนไขของ SNOBOL

รูปแบบPOS(6) (' ' REM . OUTPUT | '*')ที่ถูกตีความว่า:

เริ่มต้นที่ตำแหน่ง 6 OUTPUTตรงกับช่องว่างหรือเครื่องหมายดอกจันและถ้าคุณตรงกับพื้นที่กำหนดส่วนที่เหลือของสายไป


3

เป็นกลุ่ม 14 ไบต์

Ctrl-VG5ld:%g/\*/dEnter

การโหลดไฟล์อินพุตเป็นบัฟเฟอร์เพื่อแก้ไขจากนั้นป้อนคำสั่งด้านบน เอาต์พุตเป็นบัฟเฟอร์ใหม่


2

Ruby , 39 38 36 29 23 22 20 + 1 = 21 ไบต์

$_[/.{6}( |.*
)/]=''

ลองออนไลน์!

ใช้-pธง

คำอธิบาย:

การ-pตั้งค่าสถานะเพิ่มบล็อกโดยนัยรอบรหัสดังนั้นรหัสที่ได้รับจริงเรียกใช้มีลักษณะดังนี้:

while gets
    $_[/.{6}( |.*
)/]=''

    puts $_
end

getsอ่านบรรทัดข้อความและเก็บผลลัพธ์$_ไว้

$_[/.../]=''ลบเกิดขึ้นเป็นครั้งแรกของ regex สามารถใน...$_

/.{6}( |.*\n)/ตรงกับ 6 ของตัวละครใด ๆ ที่จุดเริ่มต้นของบรรทัดตามด้วยช่องว่างหรือส่วนที่เหลือของบรรทัด เนื่องจากช่องว่างปรากฏขึ้นก่อนจะพยายามลบเฉพาะอักขระ 6 ตัวแรกและช่องว่างก่อนจึงจะพยายามลบทั้งบรรทัด

$_ จะถูกพิมพ์ออกมาและกระบวนการนี้จะทำซ้ำสำหรับแต่ละบรรทัด


1
การเรียกเมธอดใน Ruby ไม่จำเป็นต้องใช้วงเล็บการลบออกจะช่วยให้คุณประหยัดไบต์
m-chrzan



2

JavaScript (ES6), 48 ไบต์

s=>s.map(c=>c[6]<"*"?console.log(c.substr(7)):1)

ลองออนไลน์!


1
นี่ไม่ใช่ทั้งฟังก์ชั่นและโปรแกรมเต็มรูปแบบเนื่องจากถือว่าอินพุตถูกเก็บไว้ในzซึ่งไม่ได้รับอนุญาตที่นี่ อย่างไรก็ตามคุณสามารถเปลี่ยนมันเป็นฟังก์ชั่นลูกศรที่ไม่ระบุชื่อเพื่อให้มันถูกต้อง
caird coinheringaahing

1
@cairdcoinheringaahing คุณพูดถูกจริงๆ อัปเดตวิธีแก้ปัญหา - ไม่แน่ใจว่าสิ่งที่เป็นกฎเกี่ยวกับ(และ)รอบ fn เพิ่มพวกเขาเพื่อให้แน่ใจ
sgtdck

1
คุณไม่ต้องการ()ฟังก์ชั่นรอบตัว แต่อย่างอื่นมันก็ดูดี
caird coinheringaahing

2

> <>, 57 53 ไบต์

>i~i~i~i~i~i~i67*=\
<o$/?:$/?=a:;?(0:i<
\~$/~\ $
/  <o\?/

ลองออนไลน์

คำอธิบาย

>i~i~i~i~i~i~i67*=    Read in the first seven bytes of the line
 i~i~i~i~i~i~         Read, and discard 6 characters
             i        Read the seventh
              67*=    Check if the seventh character was an 
                      asterisk (and leave that value on the stack );

<o$/?:$/?=a:;?(0:i<    Read characters until a newline or eof
                 i     Read the next character of the line
            ;?(0:      If it's a -1, terminate the program
       /?=a:           If it's a newline, break out of the loop
   /?:$                If the seventh character was not an asterisk
<o$                    Output this character
\~$/                   otherwise discard it

   /~\ $    Having reached the end of the line, output
/  <o\?/    the newline only if it was not a comment

แก้ไข: 53 ไบต์

>   i~i~i~i~i~i~i67*=\
/?=a<o/?$@:$@:$;?(0:i<
~   \~/

โดยพื้นฐานแล้วสิ่งเดียวกันก่อน แต่ปรับโครงสร้างเล็กน้อย

ในฐานะที่เป็นหมายเหตุด้านข้าง: ฉันผิดหวังที่ยังไม่มีใครทำเรื่องนี้ในโคบอล


2

C #, 160 145 90 89 ไบต์

t=>{var o="";foreach(var s in i.Split('\n'))if(s[6]!=42)o+=s.Substring(7)+"\n";return o;}

ขอบคุณ Pavel & auhmaan สำหรับการลดขนาด


ยินดีต้อนรับสู่ PPCG! ฉันขอแนะนำให้เพิ่มลิงก์ลองออนไลน์ในคำตอบของคุณเพื่อให้ผู้อื่นสามารถทดสอบรหัสของคุณได้ นอกจากนั้นคำตอบแรกที่ดี (ดีสอง)!
LyricLy

คุณสามารถทำให้สิ่งนี้สั้นลงได้โดยเขียนแลมบ์ดาในรูปแบบt=>{...}
Pavel

@LyricLy ฉันลองทำแบบนั้นจริง ๆ แล้ว แต่ด้วยเหตุผลบางอย่างมันไม่ทำงาน มันใช้งานได้ดีอย่างสมบูรณ์ในแอปคอนโซล VS
snorepion

@Pavel เช่นนั้นหรือไม่ ฉันไม่แน่ใจว่าฉันทำถูกต้องทั้งหมดหรือไม่ ฉันไม่เคยต้องการใช้การแสดงออกแลมบ์ดามาก่อน
snorepion

ใช่แล้ว func<string, string>คุณสามารถทดสอบได้โดยการกำหนดค่าให้กับ
พาเวล

2

Python 3, 71 ไบต์ (ไม่มี regexp)

def f(s):
 for w in s.split('\n'):
  t=w[6:]
  if t[0]!='*':print(t[1:])

มันได้ผล!

>>> s="""000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges"""
>>> f(s)
blah blah
oranges?
love me some oranges


1

JavaScript, 44 34 ไบต์

ข้ามแยก 44 ยังคงเป็นปกติ 44

บันทึกได้ 6 ไบต์ด้วยtsh

a=>a.replace(/^.{6}( |.*\n)/gm,'')

ลองออนไลน์!


s=>s.replace(/^.{6}( |\*.*\s)?/mg,'')
tsh


@tsh จนกว่าจะมีล่ามที่เสถียรซึ่งอนุญาตให้ใช้งานได้ฉันคิดว่ามันจะไม่นับเป็นภาษาการเขียนโปรแกรมที่ถูกต้อง

ดูเหมือนว่าจะไม่ได้ผลที่ถูกต้องหากบรรทัดสุดท้ายเป็นบรรทัดความคิดเห็น
LyricLy

@LyricLy เป็นเพราะฉันคิดว่าอินพุตจะมีบรรทัดใหม่ต่อท้ายเสมอ คุณจะเห็นว่ามันใช้งานได้มีบรรทัดว่างหลังจากอินพุต ถ้าฉันไม่ควรคิดเอาเองการแก้ไขจะมีราคา 1 ไบต์ (เพิ่ม?หลังจาก\n)

1

C ++ (GCC), 121 112 ไบต์

ขอบคุณ @gurka สำหรับการบันทึก 9 ไบต์!

#import<bits/stdc++.h>
void f(std::list<std::string>l){for(auto s:l)if(s[6]-42)std::cout<<s.substr(7,s.size());}

รับอินพุตเป็นรายการของบรรทัด

ลองออนไลน์!


#import? นอกจากนี้ฉันคิดว่ามันก็โอเคที่จะละเว้นมาตรฐานรวมถึง
simon

#importไม่ใช่มาตรฐาน C ++ แต่อย่างน้อย GCC และ MSVC ก็รองรับ การข้ามบางอย่างรวมถึงการทำงานกับ C แต่ไม่ใช่กับ C ++ รหัสไม่สามารถใช้งานได้หากไม่มีการรวมดังนั้นจึงต้องมีการนับในจำนวนรวมทั้งหมด
Steadybox

ฉันคิดว่าคุณสามารถข้ามไปได้เนื่องจากคุณไม่เห็นimportคำตอบของงูหลามหรือusingในคำตอบ C # นอกจากนี้#include <bits/stdc++.h>คำตอบของคุณจะสั้นลงหรือไม่?
simon

@ gurka ใช่มันจะสั้นกว่านี้ ขอบคุณ!
Steadybox

@ gurka การนำเข้าถูกนับในคำตอบของ Python เป็นเพียงแค่ว่า Python มีฟังก์ชั่นมากมายที่ไม่จำเป็นต้องนำเข้า C # มีแนวโน้มที่จะได้ไม่ต้องใช้คำสั่งเพราะมันมักจะเขียนสั้นsystem.foo()กว่าusing system;foo()
พาเวล

1

Java 8, 95 54 53 ไบต์

s->s.filter(x->x.charAt(6)<33).map(x->x.substring(7))

-42 bytes ขอบคุณ@ OliverGrégoireโดยใช้Stream<String>แทนStringเป็น in- และ output

คำอธิบาย:

ลองที่นี่

s->                          // Method with Stream<String> as parameter and return-type
  s.filter(x->x.charAt(6)<33)//  Filter out all lines containing an asterisk as 7th char
   .map(x->x.substring(7))   //  And remove the first 7 characters from the remaining lines
                             // End of method (implicit / single-line body)

ดูเหมือนว่าคุณสามารถใช้String[]หรือList<String>เป็นอินพุตสำหรับ -12 ไบต์
จา

หรือStream<String>ว่าสามารถช่วยได้ ตัวอย่าง:s->s.map(x->x.charAt(6)!=42?x.substring(7):"")
Olivier Grégoire

1
โอ้มันจำเป็นต้องกรอง ... แล้วs->s.filter(x->x.charAt(6)!=42).map(x->x.substring(7))ถึง 54 ไบต์
Olivier Grégoire

1
ใช้<42แทน!=42เพราะ "คุณอาจถือว่าอักขระที่เจ็ดเป็นเครื่องหมายดอกจันหรือเว้นวรรค"
Olivier Grégoire

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