Jakie dokładnie było twoje pytanie?

19

Wprowadzenie

Kiedy dostajesz nudny tekst, po prostu chcesz go rozwiązać tak szybko, jak to możliwe. Zobaczmy następujący tekst:

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.

Uwaga: Ten tekst ma znaki nowej linii dla czytelności, podczas gdy przypadki testowe, które musisz obsługiwać, nie mają znaków nowej linii.

Jednym ze sposobów na przeglądanie tekstu jest znalezienie pytań, które pisarz umieścił w tekście. Na przykład w powyższym tekście jest 1 pytanie. Mianowicie:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

Można tego dokonać dzieląc tekst na zdania. Zdanie zawsze kończy się jednym z następujących symboli interpunkcyjnych: .?!(inne nie muszą być obsługiwane). Inne symbole niż te są częścią zdania.


Zadanie

Podany wiersz składa się tylko z

  • litery (A-Za-z)
  • liczby (0–9)
  • spacje
  • interpunkcja ( ,.;:?!) (zdanie nie może zaczynać się od jednego z nich).

Wypisz pytania, które są w tekście w dowolnym rozsądnym formacie. Możesz założyć, że w tekście zawsze będzie co najmniej jedno pytanie . Wyprowadzanie końcowego i wiodącego spacji przed i po pytaniu jest dozwolone.

Ważne : Obok symbolu interpunkcyjnego nigdy nie będzie innego symbolu interpunkcyjnego (np. ??Jest niepoprawny i nie będzie musiał być obsługiwany).


Przypadki testowe

W formacie:

Input
Output(s)

Przypadki testowe:

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?

To jest , więc wygrywa zgłoszenie z najmniejszą liczbą bajtów!

Adnan
źródło
2
.?!Innych nie wolno traktować zgodnie z twoimi regułami, ale powiedziałeś, że inni nie muszą być traktowani.
Erik the Outgolfer,
Brak testu z więcej niż jednym pytaniem?
edc65,
@ edc65 Pierwszy przypadek testowy ma 2 pytania, ale dodam kolejny przypadek testowy.
Adnan

Odpowiedzi:

9

Siatkówka, 13 11 bajtów

!`[^.?!]*\?

Wypróbuj online!

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

Dzięki @MartinEnder za 2 bajty!

Klamka
źródło
5

Python, 46 bajtów

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

Zadzwoń z:

f("your string here")

wynik na testach:

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

inny pomysł, 77 bajtów (w python3 potrzebujesz listy wokół filtra):

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

Jestem nowy w tym, więc to, więc prawdopodobnie mogłoby to być znacznie krótsze.

-17 (!) Bajtów dzięki Martinowi

-2 bajty poprzez dopasowanie czegokolwiek, co nie jest „!”, „?” lub „.” (Zbliżam się do rozwiązań powłoki, ale wątpię, czy mógłbym zaoszczędzić znacznie więcej)

KarlKastor
źródło
1
Witamy w Programowaniu zagadek i Code Golf! Bardzo ładna pierwsza odpowiedź :).
Adnan
Nie sądzę, żebyś w ogóle potrzebował tego rodzaju spojrzenia i nie musisz robić [\w,:; ]*niewdzięczności (ponieważ ta grupa i tak nie może przejść obok znaku interpunkcyjnego), a następnie nie musisz też przygotowywać się .na swój wkład. Możesz także skrócić pozostałą klasę postaci do [^.!?].
Martin Ender
Dziękuję Martin! Próbowałem z tym trochę, ale nie widziałem oczywistości.
KarlKastor,
4

JavaScript, 35 24 bajtów

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

Zwraca wszystkie podciągi zaczynające się po a ., ?lub !(lub na początku tekstu) i kończą się na a ?.

Business Cat
źródło
Urgh. I myślałem, że zrobiłem dobrze z 40 bajtami. Good Job OP i @MartinEnder
MayorMonty
3

V , 12 bajtów

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

Wypróbuj online!

Bardzo prosta odpowiedź.

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

Na szczęście obsługa nowego wiersza lub weryfikacja wszystkich przypadków testowych nie dodaje żadnych bajtów.

DJMcMayhem
źródło
3

Galaretka , 16 bajtów

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

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe

Dennis
źródło
28 bajtów, prawda? (16 znaków UTF-8)
Fabio Iotti
6
@ bruce965 Jelly używa niestandardowej strony kodowej, która koduje każdy z 256 znaków, które rozumie jako pojedynczy bajt. Te bajty odwołuje się w punktach głowicy do niego.
Dennis,
Fajnie! Nie jestem jeszcze codegolferem, więc nie znam tych sztuczek, przepraszam za pytanie.
Fabio Iotti,
4
@ bruce965 Dla przypomnienia, to nie jest żadna sztuczka: język równie dobrze może używać ISO 8859-1 (lub innego istniejącego kodowania jednobajtowego) i być równie potężny, ale użycie niestandardowej strony kodowej pozwala na użycie większej liczby łatwe do pisania znaki i lepsze mnemoniki, niż gdybyś musiał na przykład kodować znakami kontrolnymi. Na koniec dnia jest to po prostu strumień bajtów, w którym każdemu bajtowi przypisano jakieś znaczenie.
Martin Ender
2
OK, „trik” mógł zabrzmieć złą konotacją, powinienem był powiedzieć „stratagem” lub coś w tym rodzaju. Nie mogłem znaleźć lepszego słowa niż „trick”.
Fabio Iotti
3

Narzędzia Shell, 43 38 bajtów

Dzięki rexkogitans za przycinanie 5 bajtów!

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

Wejście rurowe, takie jak to:

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

Jeśli to ważne, używam:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft's cmd.exe, dostarczany z systemem Windows 5.1.2600
  • Joe
    źródło
    1
    Nigdy wcześniej nie przesyłałem odpowiedzi przy użyciu wielu narzędzi, więc jeśli robię coś złego, daj mi znać.
    Joe
    Czy używasz wersji Windows GNU, czy powłoki dla Windows?
    Erik the Outgolfer
    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"zapisuje 5 bajtów (dwa dodane tri 7 zapisanych w sed- przetestowano to w bash). /gnie jest konieczne, ponieważ jest przetwarzany wiersz po wierszu.
    rexkogitans
    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, używam portów Windows narzędzi GNU.
    Joe
    @rexkogitans, dzięki! Zapomniałem o []; moja pierwsza próba zrobienia tego wyglądała mniej więcej tak \(\.|!\).
    Joe
    2

    Perl 5.10, 21 18 bajtów (z flagą -n )

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

    Prosta realizacja pytania.

    Wypróbuj tutaj!

    Paul Picard
    źródło
    Możesz pozbyć się wiodącego mwyrażenia regularnego, a wtedy będziesz w stanie usunąć odstęp między sayi/
    Dada
    2

    Ruby 1.9, 17 bajtów

    $_=$F
    

    5-bajtowy program, który należy wywołać z następującymi opcjami wiersza poleceń:

    paF[^?]*[.!]
    
    xsot
    źródło
    Nie wiedziałem, że można walczyć z flagami Ruby w taki sposób, +1! Wydaje się to trochę dziwne, ponieważ kolejne pytania będą razem jako jeden ciąg w tej tablicy, podczas gdy inne pytania będą osobne, prawda? Chyba że istnieje dziwactwo Ruby 1.9, którego nie znam.
    Wartość tuszu
    @ValueInk Zawartość tablicy zostanie konkatenowana, więc program wyświetli pojedynczy ciąg znaków, a nie literał tablicy. Możesz to wypróbować na golf.shinh.org/check.rb, który ma Ruby 1.9. Flagi można ustawić w shebang.
    xsot
    Aha, to wyjaśnia, dlaczego potrzebujesz wersji 1.9 od wersji 2.0 i wyższej, aby wyglądała jak rzeczywista tablica.
    Wartość tuszu
    1

    Partia, 174 bajty

    @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
    

    Odczytywanie linii ze STDIN jest bajtem krótszym niż użycie set s=%*.

    Neil
    źródło
    1

    PowerShell v4 +, 43 bajty

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

    Naprawdę proste. Pobiera dane wejściowe $argsi przekazuje je jako pierwszy parametr do [regex]::Matches(...)funkcji statycznej .NET . Wyrażenie, które dopasowujemy, to [^?!.]*\?- dowolna liczba znaków nie kończących zdania, po których następuje znak zapytania. Funkcja statyczna zwraca tablicę obiektów wyszczególniającą grupę przechwytywania, indeks itp., Ale chcemy tylko .Values, więc powrót jest enkapsulowany w parens i nazywamy tę właściwość. Tutaj właśnie pojawia się wymóg v4 +, ponieważ we wcześniejszych wersjach trzeba zamiast tego zrobić coś w rodzaju pętli |%{$_.Value}lub |Select Valueuzyskać odpowiednie właściwości.

    Przykład bez parens i .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?
    

    Przykład z parens i .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
    źródło
    1

    Python 3, 91 bajtów

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

    Zapisuje 1 bajt w Pythonie 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
    źródło