คำถามของคุณคืออะไร


19

บทนำ

เมื่อคุณได้รับข้อความที่น่าเบื่อคุณเพียงแค่ต้องการเอาชนะให้เร็วที่สุด ลองสังเกตข้อความต่อไปนี้:

Ens colligi timenda etc priorem judicem. De quascunque ii at contingere 
repugnaret explicetur intellectu. Adjuvetis hoc fortassis suspicari opportune 
obversari vix eam? Dei praemia prudens hominum iii constet requiri haberem. Ima 
sane nemo modi fuit lus pro dem haud. Vestro age negare tactum hoc cui lor. Ne et 
ut quod id soli soni deus. At constare innumera is occurret ea. Nia calebat seu 
acquiro fraudem effingo dicimus.

หมายเหตุ:ข้อความนี้มีการขึ้นบรรทัดใหม่เพื่อให้สามารถอ่านได้ในขณะที่กรณีทดสอบที่คุณต้องจัดการไม่มีอักขระขึ้นบรรทัดใหม่

วิธีหนึ่งในการอ่านข้อความอย่างคร่าว ๆ คือค้นหาคำถามที่ผู้เขียนใส่ไว้ในข้อความ ตัวอย่างเช่นมีคำถาม 1 ข้อในข้อความด้านบน กล่าวคือ:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

สามารถทำได้โดยแยกข้อความออกเป็นประโยค ประโยคจะเสมอจบลงด้วยการเป็นหนึ่งในสัญลักษณ์เครื่องหมายวรรคตอนต่อไปนี้: .?!(คนอื่นไม่จำเป็นต้องได้รับการจัดการ) สัญลักษณ์อื่น ๆ นอกเหนือจากนี้เป็นส่วนหนึ่งของประโยค


งาน

รับบรรทัดของข้อความประกอบด้วยเท่านั้น

  • ตัวอักษร (A-Za-z)
  • หมายเลข (0-9)
  • ช่องว่าง
  • เครื่องหมายวรรคตอน ( ,.;:?!) (ประโยคไม่สามารถเริ่มด้วยหนึ่งในนั้น)

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

สำคัญ : ถัดจากสัญลักษณ์เครื่องหมายวรรคตอนจะไม่มีสัญลักษณ์วรรคตอนอื่น (เช่น??ไม่ถูกต้องและไม่จำเป็นต้องจัดการ)


กรณีทดสอบ

ในรูปแบบ:

Input
Output(s)

กรณีทดสอบ:

Huh? I haven't heard what you just said. Could you repeat that please?
Huh?
Could you repeat that please?

plz can i haz cheesburgr? i am cat pls.
plz can i haz cheesburgr?

This is a badly formatted question.Can u please help me,or my friends,with formatting this question    ?thankyou.
Can u please help me,or my friends,with formatting this question    ?

a.b.c.d?
d?

Does this question have a question mark? yes
Does this question have a question mark?

Why example.com resolves to 127.0.0.1 in 99.9 percent of cases?
9 percent of cases?

A? b? c? d!
A?
b?
c?

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


2
.?!คนอื่นจะต้องไม่ได้รับการจัดการตามที่กฎของคุณระบุ แต่คุณบอกว่าคนอื่นไม่ต้องจัดการ
Erik the Outgolfer

ไม่มีกรณีทดสอบที่มีคำถามมากกว่าหนึ่งข้อใช่ไหม
edc65

@ edc65 กรณีทดสอบแรกมี 2 คำถาม แต่ฉันจะเพิ่มอีกกรณีทดสอบ
Adnan

คำตอบ:



5

Python ขนาด 46 ไบต์

import re
f=lambda s:re.findall("[^!?.]*\?",s)

โทรด้วย:

f("your string here")

ผลลัพธ์จากการทดสอบ:

['Can u please help me,or my friends,with formatting this question    ?', 'Can u please help me,or my friends,with formatting this question    ?', ' Huh?', ' Could you repeat that please?', ' plz can i haz cheesburgr?', 'd?', 'Does this question have a question mark?', '9 percent of cases?', 'A?', ' b?', ' c?']

อีกแนวคิดหนึ่ง 77 ไบต์ (ใน python3 คุณต้องการรายการตัวกรอง):

import re
f=lambda s:filter(lambda x:x[-1]=="?",re.split("(?<=[\.\?!]).",s)))

ฉันใหม่สำหรับสิ่งนี้ดังนั้นนี่อาจจะสั้นกว่านี้มาก

-17 (!) ไบต์ขอบคุณ Martin

-2 ไบต์โดยการจับคู่สิ่งที่ไม่ใช่ "!", "?" หรือ "." (ใกล้กับโซลูชั่นเชลล์ แต่ฉันสงสัยว่าฉันจะประหยัดได้มากกว่านี้)


1
ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ! คำตอบแรกที่ดีมาก :)
Adnan

ฉันไม่คิดว่าคุณต้องมองอย่างนั้นเลยและคุณไม่จำเป็นต้องทำตัว[\w,:; ]*ไร้มารยาท (เพราะกลุ่มนั้นไม่สามารถผ่านเครื่องหมายวรรคตอนได้) และจากนั้นคุณก็ไม่จำเป็นต้องเสริมสิ่ง.ที่คุณป้อนเข้าไป คุณ calso [^.!?]ลดชั้นตัวที่เหลือ
Martin Ender

ขอบคุณมาร์ติน! ฉันลองไปสักพักแล้ว แต่ก็ไม่เห็นชัดเจน
KarlKastor

4

JavaScript, 35 24 ไบต์

a=>a.match(/[^.?!]*\?/g)

ผลตอบแทนสตริงทั้งหมดที่เริ่มต้นหลังจากที่., ?หรือ!(หรือจุดเริ่มต้นของข้อความ) ?และสิ้นสุดใน


Urgh และฉันคิดว่าฉันทำได้ดีด้วย 40 ไบต์ Good Job OP และ @MartinEnder
MayorMonty

3

V , 12 ไบต์

Í[^.!?]*[.!]

ลองออนไลน์!

คำตอบที่ตรงไปตรงมามาก

Í             "Remove every occurrence, on every line
 [^.!?]       "Of any character that isn't '.', '!', or '?'
       *      "Repeated any number of times
        [.!]  "Followed by a a '.' or a '!'

โชคดีที่การจัดการบรรทัดใหม่หรือการตรวจสอบกรณีทดสอบทั้งหมดไม่ได้เพิ่มไบต์ใด ๆ


3

28 ไบต์ใช่ไหม (16 UTF-8 ตัวอักษร)
Fabio Iotti

6
@ bruce965 Jelly ใช้หน้ารหัสที่กำหนดเองที่เข้ารหัสอักขระ 256 ตัวแต่ละตัวที่มันเข้าใจว่าเป็นไบต์เดียว ไบต์เชื่อมโยงในจุดที่ส่วนหัวของมัน
Dennis

โอ้เยี่ยมเลย! ฉันยังไม่ได้เป็น codegolfer ดังนั้นฉันจึงไม่ทราบถึงเทคนิคนี้ขออภัยสำหรับคำถามนี้
Fabio Iotti

4
@ bruce965 สำหรับบันทึกแล้วมันไม่ได้เป็นเคล็ดลับจริงๆ: ภาษาก็สามารถใช้ ISO 8859-1 (หรือการเข้ารหัสไบต์เดี่ยวอื่น ๆ ที่มีอยู่) และมีประสิทธิภาพเท่าเดิม แต่การใช้หน้ารหัสที่กำหนดเองช่วยให้คุณใช้งานได้มากขึ้น อักขระที่พิมพ์ได้ง่ายและตัวช่วยจำดีกว่าถ้าคุณต้องใช้รหัสด้วยอักขระควบคุมเช่น ในตอนท้ายของวันมันเป็นเพียงแค่กระแสไบต์ที่ทุกไบต์ได้รับการกำหนดความหมายบางอย่าง
Martin Ender

2
ตกลง "หลอกลวง" อาจฟังด้วยความหมายแฝงที่ไม่ดีฉันควรจะพูดว่า "อุบาย" หรืออะไรบางอย่าง ฉันไม่พบคำที่ดีไปกว่า "หลอกลวง"
Fabio Iotti

3

สาธารณูปโภคเชลล์ 43 38 ไบต์

ขอบคุณrexkogitansสำหรับการตัดแต่ง 5 ไบต์!

tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"

ท่อเข้าเช่นนี้:

echo Huh? I haven't heard what you just said. Could you repeat that please?|tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"

ถ้าหากมีความสำคัญฉันกำลังใช้:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exeมาพร้อมกับ Windows 5.1.2600

  • 1
    ฉันไม่เคยส่งคำตอบโดยใช้ยูทิลิตี้หลายตัวมาก่อนดังนั้นหากฉันทำอะไรผิดพลาดให้ฉันรู้
    Joe

    คุณใช้ GNU utililties รุ่น windows หรือ shell สำหรับ windows หรือไม่?
    Erik the Outgolfer

    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"บันทึก 5 ไบต์ (เพิ่มอีกสองในtrและบันทึกใน 7 sed- นี่คือการทดสอบในทุบตี) /gไม่จำเป็นเพราะมันถูกประมวลผลทีละบรรทัด
    rexkogitans

    @ ตอนที่ฉันกำลังใช้พอร์ต Windows ของโปรแกรมอรรถประโยชน์ GNU
    Joe

    @rexkogitans ขอบคุณ! ฉันลืมไป[]แล้ว \(\.|!\)ความพยายามครั้งแรกของฉันที่ทำบางสิ่งบางอย่างที่ดูเหมือน
    Joe

    2

    Perl 5.10, 21 18 ไบต์ (พร้อมแฟล็ก -n )

    say m/[^?.!]+\?/g
    

    การใช้คำถามอย่างตรงไปตรงมา

    ลองที่นี่!


    คุณสามารถกำจัดผู้นำmของ regex ของคุณแล้วคุณจะสามารถลบช่องว่างระหว่างsayและ/
    Dada

    2

    Ruby 1.9, 17 ไบต์

    $_=$F
    

    โปรแกรมขนาด 5 ไบต์ที่ต้องเรียกใช้ด้วยตัวเลือกบรรทัดคำสั่งต่อไปนี้:

    paF[^?]*[.!]
    

    ฉันไม่รู้ว่าธงทับทิมสามารถปล้ำได้ด้วยวิธีนี้ +1! แม้ว่าจะรู้สึกแปลก ๆ เนื่องจากคำถามต่อเนื่องจะรวมกันเป็นหนึ่งสตริงภายในอาร์เรย์นั้นในขณะที่คำถามอื่นแยกกันใช่มั้ย นอกเสียจากว่าจะมีการเล่นโวหารทับทิมฉันไม่ทราบ
    หมึกมูลค่า

    @ValueInk เนื้อหาของอาเรย์จะถูกต่อกันดังนั้นโปรแกรมจะส่งออกสตริงเดี่ยวไม่ใช่ตัวอักษรอาเรย์ คุณสามารถลองเล่นได้ที่golf.shinh.org/check.rbซึ่งมีทับทิม 1.9 ธงสามารถตั้งค่าใน shebang
    xsot

    อ๊ะอธิบายว่าทำไมคุณต้องใช้ 1.9 ตั้งแต่ 2.0 ขึ้นไปให้มันดูเหมือนอาเรย์ที่แท้จริง
    หมึกมูลค่า

    1

    แบตช์ 174 ไบต์

    @echo off
    set/ps=
    set t=
    :l
    set c=%s:~0,1%
    set t=%t%%c%
    if "%c%"=="?" echo %t%&set t=
    if "%c%"=="!" set t=
    if "%c%"=="." set t=
    set s=%s~1%
    if not "%s%"=="" goto l
    

    อ่านบรรทัดจาก STDIN set s=%*เป็นไบต์สั้นกว่าการใช้


    1

    PowerShell v4 +, 43 ไบต์

    ([regex]::Matches($args,'[^?!.]*\?')).Value
    

    ตรงไปตรงมาจริงๆ รับอินพุต$argsและฟีดที่เป็นพารามิเตอร์แรกของ[regex]::Matches(...)ฟังก์ชัน static .NET regex ที่เราจับคู่คือ[^?!.]*\?- คือจำนวนอักขระที่ไม่ใช่ประโยคที่ลงท้ายด้วยเครื่องหมายคำถาม ฟังก์ชั่นคงที่จะส่งกลับอาร์เรย์ของวัตถุที่มีรายละเอียดว่ากลุ่มการจับภาพดัชนี ฯลฯ แต่เราต้องการเพียงแค่.Values ดังนั้นการส่งคืนจะถูกห่อหุ้มด้วย parens และเราเรียกคุณสมบัตินั้นว่า นี่คือสิ่งที่ข้อกำหนดของ v4 + ปรากฏขึ้นเช่นเดียวกับในเวอร์ชั่นก่อนที่คุณจะต้องทำอะไรซักอย่างแทนการวนซ้ำ|%{$_.Value}หรือ|Select Valueเพื่อให้ได้คุณสมบัติที่เหมาะสม

    ตัวอย่างที่ไม่มีการล้อเลียนและ .Value

    PS C:\Tools\Scripts\golfing> .\what-exactly-was-your-question.ps1 "Huh? I haven't heard what you just said! Could you repeat that please?"
    
    Groups   : {Huh?}
    Success  : True
    Captures : {Huh?}
    Index    : 0
    Length   : 4
    Value    : Huh?
    
    Groups   : { Could you repeat that please?}
    Success  : True
    Captures : { Could you repeat that please?}
    Index    : 40
    Length   : 30
    Value    :  Could you repeat that please?
    

    ตัวอย่างกับ parens และ .Value

    PS C:\Tools\Scripts\golfing> .\what-exactly-was-your-question.ps1 "Huh? I haven't heard what you just said! Could you repeat that please?"
    Huh?
     Could you repeat that please?
    

    1

    Python 3, 91 ไบต์

    def f(x,a=0):
     for n in range(len(x)):
      if x[n]in".!":a=n+1
      if x[n]is"?":print(x[a:n+1])
    

    บันทึก 1 ไบต์ใน Python 2:

    def f(x,a=0):
     for n in range(len(x)):
      if x[n]in".!":a=n+1
      if x[n]is"?":print x[a:n+1]
    
    โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
    Licensed under cc by-sa 3.0 with attribution required.