Apa sebenarnya pertanyaan Anda?

19

pengantar

Ketika Anda diberi teks yang membosankan, Anda hanya ingin menyelesaikannya secepat mungkin. Mari kita amati teks berikut:

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.

Catatan: Teks ini memiliki baris baru untuk dibaca, sementara kasus uji yang perlu Anda tangani tidak memiliki karakter baris baru.

Salah satu cara untuk membaca skim teks adalah dengan menemukan pertanyaan yang telah dimasukkan penulis ke dalam teks. Misalnya, ada 1 pertanyaan dalam teks di atas. Yaitu:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

Ini dapat dilakukan dengan memisahkan teks menjadi kalimat. Sebuah kalimat akan selalu diakhiri dengan salah satu simbol tanda baca berikut: .?!(yang lain tidak harus ditangani). Simbol lain dari ini adalah bagian dari kalimat.


Tugas

Diberikan satu baris teks yang hanya terdiri dari

  • huruf (A-Za-z)
  • angka (0-9)
  • spasi
  • tanda baca ( ,.;:?!) (kalimat tidak dapat dimulai dengan salah satu dari ini).

Keluarkan pertanyaan yang ada dalam teks dalam format apa pun yang masuk akal. Anda dapat berasumsi bahwa teks akan selalu memiliki setidaknya 1 pertanyaan . Keluaran membuntuti dan terkemuka spasi sebelum dan setelah pertanyaan diperbolehkan.

Penting : Di sebelah simbol tanda baca , tidak akan pernah ada simbol tanda baca lain (mis. Tidak ??valid dan tidak akan diminta untuk menangani).


Uji kasus

Dalam format:

Input
Output(s)

Kasus uji:

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?

Ini adalah , jadi pengiriman dengan jumlah byte terendah menang!

Adnan
sumber
2
.?!Orang lain tidak boleh ditangani, seperti yang ditentukan oleh peraturan Anda, tetapi Anda telah mengatakan orang lain tidak harus ditangani.
Erik the Outgolfer
Tidak ada testcase dengan lebih dari satu pertanyaan?
edc65
@ edc65 Kasing uji pertama memiliki 2 pertanyaan, tetapi saya akan menambahkan kasing uji lain.
Adnan

Jawaban:

9

Retina, 13 11 byte

!`[^.?!]*\?

Cobalah online!

!`       print all matches
[^.?!]*  any number of non-ending-punctuation symbols
\?       followed by a question mark

Terima kasih kepada @MartinEnder selama 2 byte!

Gagang pintu
sumber
5

Python, 46 Bytes

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

Telepon dengan:

f("your string here")

output pada tes:

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

ide lain, 77 byte (dalam python3 Anda perlu daftar di sekitar filter):

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

Saya baru dalam hal ini, jadi ini mungkin jauh lebih pendek.

-17 (!) Byte terima kasih kepada Martin

-2 byte dengan mencocokkan apa pun yang bukan "!", "?" atau "." (Semakin dekat dengan solusi shell, tapi saya ragu saya bisa menghemat lebih banyak)

KarlKastor
sumber
1
Selamat Datang di Programming Puzzles dan Code Golf! Jawaban pertama sangat bagus :).
Adnan
Saya tidak berpikir Anda perlu yang terlihat di belakang sama sekali dan Anda juga tidak perlu membuat [\w,:; ]*ungreedy (karena kelompok itu tidak bisa melewati karakter tanda baca), dan kemudian Anda juga tidak perlu menambahkan .input Anda. Anda juga dapat mempersingkat kelas karakter yang tersisa menjadi [^.!?].
Martin Ender
Terima kasih, Martin! Saya sudah mencoba-coba dengan ini sedikit, tetapi tidak melihat yang jelas.
KarlKastor
4

JavaScript, 35 24 byte

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

Mengembalikan semua substring yang dimulai setelah a .,, ?atau !(atau awal teks) dan diakhiri dengan a ?.

Kucing Bisnis
sumber
Urgh. Dan saya pikir saya melakukan yang baik dengan 40 byte. Good Job OP dan @MartinEnder
MayorMonty
3

V , 12 byte

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

Cobalah online!

Jawaban yang sangat mudah.

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

Untungnya, menangani baris baru, atau memverifikasi semua kasus uji tidak menambah byte.

DJMcMayhem
sumber
3

Jelly , 16 byte

f€“.?!”0;œṗfÐf”?

Cobalah online! atau verifikasi semua kasus uji

Dennis
sumber
28 byte, bukan? (16 karakter UTF-8)
Fabio Iotti
6
@ bruce965 Jelly menggunakan halaman kode khusus yang mengkodekan masing-masing 256 karakter yang dipahami sebagai masing-masing byte tunggal. The byte link dalam poin sundulan untuk itu.
Dennis
Oh keren! Saya belum menjadi codegolfer, jadi saya tidak mengetahui trik ini, maaf untuk pertanyaannya.
Fabio Iotti
4
@ bruce965 Sebagai catatan, ini bukan tipuan: bahasa bisa saja menggunakan ISO 8859-1 (atau beberapa pengkodean byte tunggal lainnya) dan sama kuatnya, tetapi menggunakan halaman kode khusus memungkinkan Anda untuk menggunakan lebih banyak karakter yang mudah diketik dan mnemonik yang lebih baik daripada jika Anda harus kode dengan karakter kontrol misalnya. Pada akhirnya, itu hanya aliran byte, di mana setiap byte telah diberi makna.
Martin Ender
2
OK, "trik" mungkin terdengar dengan konotasi yang buruk, saya seharusnya mengatakan "siasat" atau sesuatu. Saya tidak dapat menemukan kata yang lebih baik daripada "trik".
Fabio Iotti
3

Utilitas Shell, 43 38 byte

Terima kasih kepada rexkogitans untuk memangkas 5 byte!

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

Masukan pipa, seperti ini:

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

Jika jika penting, saya menggunakan:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exe, dikirimkan dengan Windows 5.1.2600
  • Joe
    sumber
    1
    Saya belum pernah mengirimkan jawaban menggunakan banyak utilitas sebelumnya, jadi jika saya melakukan sesuatu yang salah, beri tahu saya.
    Joe
    Apakah Anda menggunakan versi Windows dari utilitiies GNU, atau shell untuk windows?
    Erik the Outgolfer
    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"menghemat 5 Bytes (dua ditambahkan trdan 7 disimpan sed- ini diuji dalam bash). /gtidak perlu, karena diproses baris demi baris.
    rexkogitans
    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, saya menggunakan port Windows pada utilitas GNU.
    Joe
    @rexkogitans, terima kasih! Saya lupa tentang []; Usaha pertamaku dalam melakukan itu terlihat seperti \(\.|!\).
    Joe
    2

    Perl 5.10, 21 18 byte (dengan flag -n )

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

    Implementasi langsung dari pertanyaan.

    Coba di sini!

    Paul Picard
    sumber
    Anda dapat menyingkirkan bagian mdepan regex Anda, dan kemudian Anda akan dapat menghapus ruang antara saydan/
    Dada
    2

    Ruby 1.9, 17 byte

    $_=$F
    

    Program 5 byte yang harus dijalankan dengan opsi baris perintah berikut:

    paF[^?]*[.!]
    
    xsot
    sumber
    Saya tidak tahu bendera Ruby bisa digeluti sedemikian rupa, +1! Rasanya agak aneh, karena pertanyaan berturut-turut akan disatukan sebagai satu string dalam array itu sementara pertanyaan lain terpisah, kan? Kecuali ada Ruby 1.9 quirk yang tidak saya sadari.
    Nilai Tinta
    @NilaiInk Isi array akan digabungkan sehingga program menghasilkan string tunggal, bukan array literal. Anda dapat mencobanya di golf.shinh.org/check.rb yang memiliki ruby ​​1.9. Bendera dapat diatur di shebang.
    xsot
    Aha, itu menjelaskan mengapa Anda perlu 1,9 sejak 2.0 dan naikkan output agar terlihat seperti array yang sebenarnya.
    Nilai Tinta
    1

    Batch, 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
    

    Membaca baris dari STDIN lebih pendek satu byte daripada menggunakan set s=%*.

    Neil
    sumber
    1

    PowerShell v4 +, 43 byte

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

    Sangat mudah. Mengambil input $argsdan mengumpankannya sebagai parameter pertama ke [regex]::Matches(...)fungsi .NET statis. Regex yang kami cocokkan adalah [^?!.]*\?- yaitu, sejumlah karakter tanpa akhir kalimat yang diikuti oleh tanda tanya. Fungsi statis mengembalikan array objek yang merinci apa yang menangkap grup, indeks, dll., Tetapi kami hanya menginginkan .Values, jadi pengembaliannya dirangkum dalam parens dan kami menyebutnya properti itu. Di sinilah persyaratan v4 + berperan, karena dalam versi sebelumnya Anda harus melakukan sesuatu seperti loop |%{$_.Value}atau |Select Valueuntuk mendapatkan properti yang sesuai.

    Contoh tanpa parens dan .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?
    

    Contoh dengan parens dan .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?
    
    AdmBorkBork
    sumber
    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])
    

    Menghemat 1 byte dalam 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]
    
    Daniel
    sumber