Chính xác câu hỏi của bạn là gì?


19

Giới thiệu

Khi bạn được cung cấp một văn bản nhàm chán, bạn chỉ muốn hoàn thành nó nhanh nhất có thể. Hãy quan sát văn bản sau:

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.

Lưu ý: Văn bản này có dòng mới để dễ đọc, trong khi các trường hợp kiểm tra bạn cần xử lý không có ký tự dòng mới.

Một cách để đọc lướt văn bản là tìm các câu hỏi mà người viết đã đặt vào văn bản. Ví dụ, có 1 câu hỏi trong văn bản trên. Cụ thể là:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

Điều này có thể được thực hiện bằng cách chia văn bản thành câu. Một câu sẽ luôn kết thúc bằng một trong các ký hiệu dấu câu sau: .?!(những câu khác không phải xử lý). Các ký hiệu khác ngoài đây là một phần của câu.


Nhiệm vụ

Cho một dòng văn bản chỉ bao gồm

  • chữ cái (A-Za-z)
  • số (0-9)
  • không gian
  • dấu câu ( ,.;:?!) (một câu không thể bắt đầu bằng một trong những câu này).

Xuất ra các câu hỏi trong văn bản ở bất kỳ định dạng hợp lý. Bạn có thể cho rằng văn bản sẽ luôn có ít nhất 1 câu hỏi . Xuất ra dấu vết và dấu cách hàng đầu trước và sau khi một câu hỏi được cho phép.

Quan trọng : Bên cạnh biểu tượng dấu chấm câu , sẽ không bao giờ có biểu tượng dấu chấm câu khác (ví dụ: ??không hợp lệ và sẽ không bắt buộc phải xử lý).


Các trường hợp thử nghiệm

Trong định dạng:

Input
Output(s)

Các trường hợp thử nghiệm:

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?

Đây là , vì vậy bài nộp có số byte thấp nhất sẽ thắng!


2
.?!Những người khác không được xử lý, như quy tắc của bạn chỉ định, nhưng bạn đã nói người khác không cần phải xử lý.
Erik the Outgolfer 20/07/2016

Không có testcase với nhiều hơn một câu hỏi?
edc65

@ edc65 Trường hợp thử nghiệm đầu tiên có 2 câu hỏi, nhưng tôi sẽ thêm một trường hợp thử nghiệm khác.
Ad Nam

Câu trả lời:



5

Python, 46 byte

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

Gọi với:

f("your string here")

đầu ra trong các bài kiểm tra:

['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?']

một ý tưởng khác, 77 byte (trong python3 bạn cần một danh sách xung quanh bộ lọc):

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

Tôi chưa quen với điều này nên điều này có thể ngắn hơn nhiều.

-17 (!) Byte nhờ Martin

-2 byte bằng cách khớp bất cứ thứ gì không phải là "!", "?" hoặc là "." (Đến gần với các giải pháp vỏ, nhưng tôi nghi ngờ tôi có thể tiết kiệm nhiều hơn)


1
Chào mừng bạn đến với Câu đố lập trình và Code Golf! Câu trả lời đầu tiên rất hay :).
Ad Nam

Tôi không nghĩ bạn cần cái nhìn đó chút nào và bạn cũng không cần phải làm cho sự vô ơn [\w,:; ]*(vì dù sao nhóm đó cũng không thể vượt qua một dấu chấm câu), và sau đó bạn cũng không cần phải trả trước .cho đầu vào của mình. Bạn có thể rút ngắn lớp nhân vật còn lại [^.!?].
Martin Ender

Cảm ơn, Martin! Tôi đã thử xung quanh với điều này một chút, nhưng không thấy rõ ràng.
KarlKastor

4

JavaScript, 35 24 byte

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

Trả về tất cả các chuỗi con bắt đầu sau a ., ?hoặc !(hoặc đầu văn bản) và kết thúc bằng a ?.


Urgh. Và tôi nghĩ rằng tôi đã làm tốt với 40 byte. Công việc tốt OP và @MartinEnder
MayorMonty

3

V , 12 byte

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

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

Một câu trả lời rất đơn giản.

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

Rất may, xử lý các dòng mới hoặc xác minh tất cả các trường hợp thử nghiệm không thêm bất kỳ byte nào.


3

28 byte, phải không? (16 ký tự UTF-8)
Fabio Iotti

6
@ bruce965 Jelly sử dụng một trang mã tùy chỉnh mã hóa từng trong số 256 ký tự mà nó hiểu là mỗi byte đơn. Các liên kết byte trong tiêu đề trỏ đến nó.
Dennis

Ồ tuyệt! Tôi chưa phải là một codegolfer, vì vậy tôi không nhận thức được thủ thuật này, xin lỗi vì câu hỏi này.
Fabio Iotti

4
@ bruce965 Đối với bản ghi, đó không thực sự là một mẹo: ngôn ngữ cũng có thể sử dụng ISO 8859-1 (hoặc một số mã hóa byte đơn hiện có khác) và mạnh mẽ như vậy, nhưng sử dụng trang mã tùy chỉnh cho phép bạn sử dụng nhiều hơn dễ dàng đánh máy các ký tự và ghi nhớ tốt hơn so với nếu bạn phải mã bằng các ký tự điều khiển chẳng hạn. Vào cuối ngày, nó chỉ là một luồng byte, trong đó mỗi byte đã được gán một số ý nghĩa.
Martin Ender

2
OK, "mánh khóe" có thể nghe có ý nghĩa xấu, tôi nên nói "chiến lược" hay gì đó. Tôi không thể tìm thấy từ nào tốt hơn "lừa".
Fabio Iotti

3

Tiện ích Shell, 43 38 byte

Cảm ơn rexkogitans đã cắt tỉa 5 byte!

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

Đầu vào ống, như thế này:

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

Nếu có vấn đề, tôi đang sử dụng:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exe, xuất xưởng với Windows 5.1.2600

  • 1
    Tôi chưa bao giờ gửi câu trả lời bằng nhiều tiện ích trước đây, vì vậy nếu tôi làm sai, hãy cho tôi biết.
    Joe

    Bạn có sử dụng các phiên bản windows của GNU, hoặc shell cho windows không?
    Erik the Outgolfer 20/07/2016

    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"tiết kiệm 5 Byte (hai được thêm vào trvà 7 lưu vào sed- điều này đã được thử nghiệm trong bash). /glà không cần thiết, vì nó được xử lý từng dòng.
    rexkogitans

    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, tôi đang sử dụng các cổng Windows của các tiện ích GNU.
    Joe

    @rexkogitans, cảm ơn! Tôi quên mất []; nỗ lực đầu tiên của tôi để làm điều đó trông giống như \(\.|!\).
    Joe

    2

    Perl 5.10, 21 18 byte (có cờ -n )

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

    Thực hiện đơn giản các câu hỏi.

    Hãy thử nó ở đây!


    Bạn có thể thoát khỏi sự dẫn đầu mcủa regex của mình và sau đó bạn sẽ có thể xóa khoảng trống giữa say/
    Dada

    2

    Ruby 1.9, 17 byte

    $_=$F
    

    Một chương trình 5 byte phải được gọi với các tùy chọn dòng lệnh sau:

    paF[^?]*[.!]
    

    Tôi không biết cờ Ruby có thể được vật lộn theo cách như vậy, +1! Tuy nhiên, cảm thấy hơi kỳ lạ vì các câu hỏi liên tiếp sẽ được kết hợp thành một chuỗi trong mảng đó trong khi các câu hỏi khác là riêng biệt, phải không? Trừ khi có một quirk Ruby 1.9 tôi không biết.
    Mực giá trị

    @ValueInk Nội dung của mảng sẽ được nối để chương trình xuất ra một chuỗi, không phải là một mảng bằng chữ. Bạn có thể dùng thử tại golf.shinh.org/check.rb có ruby ​​1.9. Các cờ có thể được đặt trong shebang.
    xsot

    Aha, điều đó giải thích tại sao bạn cần 1.9 kể từ 2.0 và xuất ra nó để trông giống như một mảng thực tế.
    Mực giá trị

    1

    Mẻ, 174 byte

    @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
    

    Đọc một dòng từ STDIN ngắn hơn một byte so với sử dụng set s=%*.


    1

    PowerShell v4 +, 43 byte

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

    Thực sự đơn giản. Đưa đầu vào $argsvà nguồn cấp dữ liệu đó làm tham số đầu tiên cho [regex]::Matches(...)hàm tĩnh .NET . Regex chúng ta kết hợp là [^?!.]*\?- nghĩa là, bất kỳ số lượng ký tự không kết thúc câu nào được theo sau bởi một dấu hỏi. Hàm tĩnh trả về một mảng các đối tượng mô tả chi tiết nhóm chụp, chỉ mục, v.v., nhưng chúng ta chỉ muốn .Values, vì vậy trả về được gói gọn trong parens và chúng ta gọi thuộc tính đó. Đây là lúc yêu cầu v4 + phát huy tác dụng, như trong các phiên bản trước, bạn cần thay vào đó làm một cái gì đó như vòng lặp |%{$_.Value}hoặc |Select Valueđể có được các thuộc tính phù hợp.

    Ví dụ không có parens và .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?
    

    Ví dụ với parens và .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 byte

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

    Lưu 1 byte trong 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]
    
    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.