¿Cuál fue exactamente tu pregunta?

19

Introducción

Cuando recibes un texto aburrido, solo quieres terminarlo lo más rápido posible. Observemos el siguiente 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 tiene nuevas líneas para facilitar la lectura, mientras que los casos de prueba que necesita manejar no tienen caracteres de nueva línea.

Una forma de leer el texto es encontrar preguntas que el escritor ha puesto en el texto. Por ejemplo, hay 1 pregunta en el texto anterior. A saber:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

Esto se puede hacer dividiendo el texto en oraciones. Una oración siempre terminará con uno de los siguientes símbolos de puntuación: .?!(otros no tienen que ser manejados). Otros símbolos que estos son parte de la oración.


La tarea

Dada una línea de texto que consta de solo

  • letras (A-Za-z)
  • números (0-9)
  • espacios
  • puntuación ( ,.;:?!) (una oración no puede comenzar con uno de estos).

Envíe las preguntas que están en el texto en cualquier formato razonable. Puede suponer que el texto siempre tendrá al menos 1 pregunta . La salida de arrastre y que conduce espacios antes y después de que se permitió una pregunta.

Importante : al lado de un símbolo de puntuación , nunca habrá otro símbolo de puntuación (por ejemplo, ??no es válido y no será necesario que lo maneje).


Casos de prueba

En el formato:

Input
Output(s)

Los casos de prueba:

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?

Este es el , por lo que gana el envío con el menor número de bytes.

Adnan
fuente
2
.?!Otros no deben ser manejados, como lo especifican sus reglas, pero usted ha dicho que otros no tienen que ser manejados.
Erik the Outgolfer
No hay caso de prueba con más de una pregunta?
edc65
@ edc65 El primer caso de prueba tiene 2 preguntas, pero agregaré otro caso de prueba.
Adnan

Respuestas:

9

Retina, 13 11 bytes

!`[^.?!]*\?

Pruébalo en línea!

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

¡Gracias a @MartinEnder por 2 bytes!

Pomo de la puerta
fuente
5

Python, 46 Bytes

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

Llamar con:

f("your string here")

salida en pruebas:

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

otra idea, 77 bytes (en python3 necesitarías una lista alrededor del filtro):

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

Soy nuevo en esto, así que esto podría ser mucho más corto.

-17 (!) Bytes gracias a Martin

-2 bytes haciendo coincidir cualquier cosa que no sea "!", "?" o "." (Acercándome a las soluciones de shell, pero dudo que pueda ahorrar mucho más)

KarlKastor
fuente
1
¡Bienvenido a Programming Puzzles y Code Golf! Muy buena primera respuesta :).
Adnan
No creo que necesites esa mirada retrospectiva en absoluto y tampoco necesitas hacer lo [\w,:; ]*desgreñado (porque ese grupo no puede superar un carácter de puntuación de todos modos), y tampoco necesitas anteponer .tu entrada. También puedes acortar la clase de personaje restante a [^.!?].
Martin Ender
Gracias Martin! He intentado con esto un poco, pero no vi lo obvio.
KarlKastor
4

JavaScript, 35 24 bytes

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

Devuelve todas las subcadenas que comienzan después de a ., ?o !(o el comienzo del texto) y terminan en a ?.

Gato de negocios
fuente
Urgh Y pensé que lo hice bien con 40 bytes. Good Job OP and @MartinEnder
MayorMonty
3

V , 12 bytes

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

Pruébalo en línea!

Una respuesta muy directa.

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

Afortunadamente, manejar nuevas líneas o verificar todos los casos de prueba no agrega ningún byte.

DJMcMayhem
fuente
3

Jalea , 16 bytes

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

Pruébalo en línea! o verificar todos los casos de prueba

Dennis
fuente
28 bytes, ¿no es así? (16 caracteres UTF-8)
Fabio Iotti
66
@ bruce965 Jelly usa una página de códigos personalizada que codifica cada uno de los 256 caracteres que entiende como el byte único de cada uno. El enlace de bytes en el encabezado apunta a él.
Dennis
Oh genial! Todavía no soy un codegolfer, así que no estoy al tanto de estos trucos, perdón por la pregunta.
Fabio Iotti
44
@ bruce965 Para el registro, no es realmente un truco: el lenguaje podría usar ISO 8859-1 (o alguna otra codificación de un solo byte existente) y ser igual de potente, pero usar una página de códigos personalizada le permite usar más caracteres fácilmente tipables y mejores mnemotécnicos que si tuviera que codificar con caracteres de control, por ejemplo. Al final del día, es solo una secuencia de bytes, donde a cada byte se le ha asignado algún significado.
Martin Ender
2
OK, "truco" podría haber sonado con una mala connotación, debería haber dicho "estratagema" o algo así. No pude encontrar una palabra mejor que "truco".
Fabio Iotti
3

Utilidades de Shell, 43 38 bytes

¡Gracias a rexkogitans por recortar 5 bytes!

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

Entrada de tubería, como esta:

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

Si es importante, estoy usando:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exe, enviado con Windows 5.1.2600
  • Joe
    fuente
    1
    Nunca antes había enviado una respuesta utilizando múltiples utilidades, así que si estoy haciendo algo mal, avíseme.
    Joe
    ¿Utiliza versiones de Windows de las utilidades de GNU o un shell para Windows?
    Erik the Outgolfer
    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"ahorra 5 bytes (dos agregados try 7 guardados sed, esto se probó en bash). /gno es necesario, ya que se procesa línea por línea.
    rexkogitans
    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, estoy usando los puertos de Windows de las utilidades GNU.
    Joe
    @rexkogitans, gracias! Me había olvidado de []; mi primer intento de hacer eso se parecía a algo así \(\.|!\).
    Joe
    2

    Perl 5.10, 21 18 bytes (con el indicador -n )

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

    Implementación directa de la pregunta.

    Pruébalo aquí!

    Paul Picard
    fuente
    Puede deshacerse del inicio mde su expresión regular, y luego podrá eliminar el espacio entre sayy/
    Dada
    2

    Ruby 1.9, 17 bytes

    $_=$F
    

    Un programa de 5 bytes que debe invocarse con las siguientes opciones de línea de comando:

    paF[^?]*[.!]
    
    xsot
    fuente
    ¡No sabía que las banderas de Ruby se pudieran luchar de esa manera, +1! Sin embargo, se siente un poco extraño, ya que las preguntas consecutivas estarán juntas como una cadena dentro de esa matriz, mientras que otras preguntas están separadas, ¿verdad? A menos que haya un capricho de Ruby 1.9 que no conozco.
    Value Ink
    @ValueInk El contenido de la matriz se concatenará para que el programa genere una sola cadena, no una matriz literal. Puede probarlo en golf.shinh.org/check.rb que tiene ruby ​​1.9. Las banderas se pueden establecer en el shebang.
    xsot
    Ajá, eso explica por qué necesitas 1.9 desde 2.0 y la salida para que se vea como una matriz real.
    Value Ink el
    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
    

    Leer una línea de STDIN es un byte más corto que usar set s=%*.

    Neil
    fuente
    1

    PowerShell v4 +, 43 bytes

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

    Realmente sencillo. Toma entradas $argsy las alimenta como el primer parámetro para una [regex]::Matches(...)función estática .NET . La expresión regular que estamos combinando es [^?!.]*\?, es decir, cualquier número de caracteres que no terminan la oración seguidos de un signo de interrogación. La función estática devuelve una matriz de objetos que detalla qué grupo de captura, índice, etc., pero solo queremos el .Values, por lo que el retorno se encapsula en parens y llamamos a esa propiedad. Aquí es donde entra en juego el requisito de v4 +, ya que en versiones anteriores tendría que hacer algo como un bucle |%{$_.Value}u |Select Valueobtener las propiedades adecuadas.

    Ejemplo sin los padres y .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?
    

    Ejemplo con los padres y .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
    fuente
    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])
    

    Guarda 1 byte en 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
    fuente