Qual foi exatamente a sua pergunta?

19

Introdução

Quando você recebe um texto chato, só quer acabar com isso o mais rápido possível. Vamos observar o seguinte texto:

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: Este texto possui novas linhas para facilitar a leitura, enquanto os casos de teste que você precisa manipular não possuem caracteres de nova linha.

Uma maneira de vasculhar o texto é encontrar perguntas que o escritor colocou no texto. Por exemplo, há 1 pergunta no texto acima. Nomeadamente:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

Isso pode ser feito dividindo o texto em frases. Uma frase sempre terminará com um dos seguintes símbolos de pontuação: .?!(outros não precisam ser manipulados). Outros símbolos além desses fazem parte da frase.


A tarefa

Dada uma linha de texto que consiste apenas

  • letras (A-Za-z)
  • números (0-9)
  • espaços
  • pontuação ( ,.;:?!) (uma frase não pode começar com uma delas).

Envie as perguntas que estão no texto em qualquer formato razoável. Você pode assumir que o texto sempre terá pelo menos 1 pergunta . A saída de espaços à direita e à esquerda antes e depois de uma pergunta é permitida.

Importante : Ao lado de um símbolo de pontuação , nunca haverá outro símbolo de pontuação (por exemplo, ??é inválido e não será necessário manipulá-lo).


Casos de teste

No formato:

Input
Output(s)

Os casos de teste:

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?

Isso é , então a submissão com o menor número de bytes vence!

Adnan
fonte
2
.?!Outros não devem ser manipulados, como especificam suas regras, mas você disse que outros não precisam ser manipulados.
Erik the Outgolfer
Não há caso de teste com mais de uma pergunta?
Edc65
@ edc65 O primeiro caso de teste tem 2 perguntas, mas adicionarei outro caso de teste.
Adnan

Respostas:

9

Retina, 13 11 bytes

!`[^.?!]*\?

Experimente online!

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

Obrigado a @MartinEnder por 2 bytes!

Maçaneta da porta
fonte
5

Python, 46 bytes

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

Ligue para:

f("your string here")

saída em testes:

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

outra idéia, 77 bytes (em python3, você precisaria de uma lista em torno do filtro):

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

Eu sou novo nisso, então isso, provavelmente poderia ser muito mais curto.

-17 (!) Bytes graças a Martin

-2 bytes, correspondendo a qualquer coisa que não seja "!", "?" ou "." (Aproximando-me das soluções shell, mas duvido que poderia economizar muito mais)

KarlKastor
fonte
11
Bem-vindo à Programação de Puzzles e Code Golf! Muito boa primeira resposta :).
21716 Adnan
Eu não acho que você precise olhar para trás e também não torne o [\w,:; ]*filme ingrato (porque esse grupo não pode passar de um caractere de pontuação de qualquer maneira), e então você também não precisa acrescentar .sua entrada. Você também reduz a classe de personagem restante para [^.!?].
Martin Ender
Obrigado Martin! Eu tentei um pouco com isso, mas não vi o óbvio.
KarlKastor
4

JavaScript, 35 24 bytes

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

Retorna todas as substrings que iniciam após a ., ?ou !(ou o início do texto) e terminam em a ?.

Gato de negócios
fonte
Urgh. E eu pensei que fiz bem com 40 bytes. Bom trabalho OP e @MartinEnder
MayorMonty
3

V , 12 bytes

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

Experimente online!

Uma resposta muito direta.

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

Felizmente, lidar com novas linhas ou verificar todos os casos de teste não adiciona nenhum bytes.

DJMcMayhem
fonte
3

Gelatina , 16 bytes

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

Experimente online! ou verifique todos os casos de teste

Dennis
fonte
28 bytes, não é? (16 caracteres UTF-8)
Fabio Iotti
6
@ bruce965 O Jelly usa uma página de códigos personalizada que codifica cada um dos 256 caracteres que entende como um byte único cada. O link de bytes no cabeçalho aponta para ele.
Dennis19 /
Oh fixe! Ainda não sou um codegolfer, por isso não conheço esses truques, desculpe pela pergunta.
Fabio Iotti
4
@ bruce965 Para o registro, não é realmente um truque: o idioma pode também usar a ISO 8859-1 (ou alguma outra codificação de byte único existente) e ser igualmente poderoso, mas o uso de uma página de código personalizada permite que você use mais caracteres de fácil digitação e mnemônicos melhores do que se você tivesse que codificar com caracteres de controle, por exemplo. No final do dia, é apenas um fluxo de bytes, onde cada byte recebeu algum significado.
Martin Ender
2
OK, "truque" pode ter soado com uma conotação ruim, eu deveria ter dito "estratagema" ou algo assim. Não consegui encontrar nenhuma palavra melhor do que "truque".
Fabio Iotti
3

Utilitários Shell, 43 38 bytes

Obrigado a rexkogitans por cortar 5 bytes!

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

Entrada de tubulação, assim:

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

Se importa, estou usando:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exe, fornecido com o Windows 5.1.2600
  • Joe
    fonte
    11
    Nunca enviei uma resposta usando vários utilitários antes. Se estiver fazendo algo errado, informe-me.
    19416 Joe
    Você usa versões para Windows dos utilitários GNU ou um shell para Windows?
    Erik the Outgolfer
    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"salva 5 bytes (dois adicionados tre sete salvos em sed- isso foi testado no bash). /gnão é necessário, pois é processado linha por linha.
    Rexkogitans
    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, estou usando as portas do Windows dos utilitários GNU.
    21416 Joe
    @rexkogitans, obrigado! Eu esqueci []; minha primeira tentativa de fazer isso foi algo parecido \(\.|!\).
    21416 Joe
    2

    Perl 5.10, 21 18 bytes (com sinalizador -n )

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

    Implementação direta da questão.

    Experimente aqui!

    Paul Picard
    fonte
    Você pode se livrar da liderança mdo seu regex e, em seguida, poderá remover o espaço entre saye/
    Dada
    2

    Ruby 1.9, 17 bytes

    $_=$F
    

    Um programa de 5 bytes que deve ser chamado com as seguintes opções de linha de comando:

    paF[^?]*[.!]
    
    xsot
    fonte
    Eu não sabia que bandeiras de Ruby poderiam ser combatidas dessa maneira, +1! Parece meio estranho, já que perguntas consecutivas estarão juntas como uma string dentro dessa matriz, enquanto outras perguntas são separadas, certo? A menos que haja uma peculiaridade do Ruby 1.9 que eu não esteja ciente.
    Value Ink
    @ValueInk O conteúdo da matriz será concatenado para que o programa produza uma única string, não uma literal da matriz. Você pode experimentá-lo em golf.shinh.org/check.rb, que possui o ruby ​​1.9. As bandeiras podem ser definidas no shebang.
    xsot
    Ah, isso explica por que você precisa do 1.9 desde 2.0 e a saída é parecida com uma matriz real.
    Value Ink
    1

    Lote, 174 bytes

    @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
    

    Ler uma linha do STDIN é um byte mais curto que o uso set s=%*.

    Neil
    fonte
    1

    PowerShell v4 +, 43 bytes

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

    Realmente simples. Recebe a entrada $argse alimenta isso como o primeiro parâmetro para uma [regex]::Matches(...)função estática do .NET . O regex que estamos correspondendo é [^?!.]*\?- ou seja, qualquer número de caracteres que não terminem a frase que é seguido por um ponto de interrogação. A função estática retorna uma matriz de objetos detalhando qual grupo de captura, índice etc., mas queremos apenas os .Values; portanto, o retorno é encapsulado em parênteses e chamamos essa propriedade. É aqui que o requisito v4 + entra em jogo, pois nas versões anteriores você precisaria fazer algo como um loop |%{$_.Value}ou |Select Valueobter as propriedades apropriadas.

    Exemplo sem os parênteses 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?
    

    Exemplo com os parênteses 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?
    
    AdmBorkBork
    fonte
    1

    Python 3, 91 bytes

    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 em 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
    fonte