Qual è stata esattamente la tua domanda?


19

introduzione

Quando ti viene dato un testo noioso, vuoi solo farlo finire il più rapidamente possibile. Osserviamo il seguente testo:

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.

Nota: questo testo ha nuove righe per la leggibilità, mentre i casi di test che è necessario gestire non hanno caratteri di nuova riga.

Un modo per sfogliare il testo è trovare le domande che lo scrittore ha posto nel testo. Ad esempio, c'è 1 domanda nel testo sopra. Vale a dire:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

Questo può essere fatto suddividendo il testo in frasi. Una frase termina sempre con uno dei seguenti simboli di punteggiatura: .?!(gli altri non devono essere gestiti). Altri simboli oltre a questi fanno parte della frase.


L'obiettivo

Data una riga di testo composta da solo

  • lettere (A-Za-z)
  • numeri (0-9)
  • spazi
  • punteggiatura ( ,.;:?!) (una frase non può iniziare con una di queste).

Stampa le domande che si trovano nel testo in qualsiasi formato ragionevole. Puoi presumere che il testo abbia sempre almeno 1 domanda . Emissione finale e che porta gli spazi prima e dopo una domanda è permesso.

Importante : accanto a un simbolo di punteggiatura , non ci sarà mai un altro simbolo di punteggiatura (ad es. Non ??è valido e non sarà necessario gestirlo).


Casi test

Nel formato:

Input
Output(s)

I casi di test:

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?

Questo è , quindi vince l'invio con il minor numero di byte!


2
.?!Altri non devono essere gestiti, come specificato dalle regole, ma hai detto che gli altri non devono essere gestiti.
Erik the Outgolfer,

Nessuna prova con più di una domanda?
edc65,

@ edc65 Il primo caso di test ha 2 domande, ma aggiungerò un altro caso di test.
Adnan,

Risposte:



5

Python, 46 byte

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

Chiama con:

f("your string here")

uscita sui test:

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

un'altra idea, 77 byte (in python3 avresti bisogno di un elenco attorno al filtro):

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

Sono nuovo per questo, quindi questo potrebbe probabilmente essere molto più breve.

-17 (!) Byte grazie a Martin

-2 byte abbinando tutto ciò che non è "!", "?" o "." (Avvicinarsi alle soluzioni shell, ma dubito di poter risparmiare molto di più)


1
Benvenuti in Puzzle di programmazione e Code Golf! Molto bella la prima risposta :).
Adnan,

Non penso che tu abbia bisogno di quello sguardo dietro di te e nemmeno tu devi rendere l' [\w,:; ]*imprevedibile (perché quel gruppo non può comunque superare un carattere di punteggiatura), e quindi non devi nemmeno anteporre .al tuo contributo. Riduci anche la classe di caratteri rimanente a [^.!?].
Martin Ender,

Grazie Martin! Ho provato un po 'con questo, ma non ho visto l'ovvio.
KarlKastor,

4

JavaScript, 35 24 byte

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

Restituisce tutte le sottostringhe che iniziano dopo a ., ?o !(o all'inizio del testo) e terminano con a ?.


Urgh. E pensavo di aver fatto bene con 40 byte. Good Job OP e @MartinEnder
MayorMonty

3

V , 12 byte

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

Provalo online!

Una risposta molto semplice.

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

Per fortuna, la gestione di newline o la verifica di tutti i casi di test non aggiunge alcun byte.


3

Gelatina , 16 byte

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

Provalo online! o verifica tutti i casi di test


28 byte, no? (16 caratteri UTF-8)
Fabio Iotti,

6
@ bruce965 Jelly utilizza una codepage personalizzata che codifica ciascuno dei 256 caratteri che considera ciascuno il singolo byte. Il collegamento byte nell'intestazione punta ad esso.
Dennis,

Oh, fico! Non sono ancora un codegolfer, quindi non sono a conoscenza di questi trucchi, mi dispiace per la domanda.
Fabio Iotti,

4
@ bruce965 Per la cronaca, non è proprio un trucco: il linguaggio potrebbe anche usare ISO 8859-1 (o qualche altra codifica a byte singolo esistente) ed essere altrettanto potente, ma l'uso di una tabella codici personalizzata consente di utilizzare più caratteri facilmente digitabili e mnemonici migliori rispetto ad esempio se si dovesse codificare con caratteri di controllo. Alla fine della giornata, è solo un flusso di byte, in cui a ogni byte è stato assegnato un significato.
Martin Ender,

2
OK, "trucco" avrebbe potuto suonare con una cattiva connotazione, avrei dovuto dire "stratagemma" o qualcosa del genere. Non sono riuscito a trovare una parola migliore di "trucco".
Fabio Iotti,

3

Utilità Shell, 43 38 byte

Grazie a rexkogitans per il taglio di 5 byte!

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

Pipe input, in questo modo:

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

Se è importante, sto usando:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exe, fornito con Windows 5.1.2600

  • 1
    Non ho mai inviato una risposta utilizzando più utility prima, quindi se sto facendo qualcosa di sbagliato, fammelo sapere.
    Joe,

    Usi le versioni di Windows delle utility GNU o una shell per Windows?
    Erik the Outgolfer,

    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"salva 5 byte (due aggiunti tre 7 salvati in sed- questo è stato testato in bash). /gnon è necessario, poiché viene elaborato riga per riga.
    rexkogitans,

    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, sto usando le porte Windows delle utility GNU.
    Joe,

    @rexkogitans, grazie! Mi sono dimenticato []; il mio primo tentativo di farlo sembrava qualcosa del genere \(\.|!\).
    Joe,

    2

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

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

    Semplice implementazione della domanda.

    Provalo qui!


    Puoi sbarazzarti del comando mdella tua regex e poi sarai in grado di rimuovere lo spazio tra saye/
    Dada,

    2

    Ruby 1.9, 17 byte

    $_=$F
    

    Un programma di 5 byte che deve essere richiamato con le seguenti opzioni della riga di comando:

    paF[^?]*[.!]
    

    Non sapevo che le bandiere di Ruby potessero essere combattute in questo modo, +1! Sembra strano, però, dal momento che le domande consecutive saranno riunite come un'unica stringa all'interno di quella matrice mentre le altre domande sono separate, giusto? A meno che non ci sia una stranezza di Ruby 1.9 di cui non sono a conoscenza.
    Value Ink

    @ValueInk Il contenuto dell'array verrà concatenato in modo che il programma emetta una singola stringa, non un array letterale. Puoi provarlo su golf.shinh.org/check.rb che ha ruby ​​1.9. Le bandiere possono essere inserite nello shebang.
    xsot

    Ah, questo spiega perché hai bisogno di 1.9 dal 2.0 in poi per farlo sembrare un vero array.
    Value Ink

    1

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

    La lettura di una riga da STDIN è un byte più breve dell'uso set s=%*.


    1

    PowerShell v4 +, 43 byte

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

    Davvero semplice. Prende l'input $argse lo inserisce come primo parametro in una [regex]::Matches(...)funzione statica .NET . La regex che stiamo abbinando è [^?!.]*\?- vale a dire qualsiasi numero di caratteri senza terminazione seguiti da un punto interrogativo. La funzione statica restituisce una matrice di oggetti che descrivono in dettaglio quale gruppo di acquisizione, indice, ecc., Ma vogliamo solo le .Values, quindi il ritorno è incapsulato in parentesi e chiamiamo quella proprietà. È qui che entra in gioco il requisito v4 +, poiché nelle versioni precedenti dovresti invece fare qualcosa come un loop |%{$_.Value}o |Select Valueottenere le proprietà appropriate.

    Esempio senza le parentesi e .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?
    

    Esempio con le parentesi e .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])
    

    Salva 1 byte in 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]
    
    Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
    Licensed under cc by-sa 3.0 with attribution required.