Quelle était exactement votre question?


19

introduction

Lorsque vous recevez un texte ennuyeux, vous voulez simplement le terminer le plus rapidement possible. Observons le texte suivant:

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.

Remarque: ce texte contient des retours à la ligne pour plus de lisibilité, tandis que les cas de test que vous devez gérer n'ont pas de caractères de retour à la ligne.

Une façon de parcourir le texte est de trouver des questions que l'auteur a posées dans le texte. Par exemple, il y a 1 question dans le texte ci-dessus. À savoir:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

Cela peut être fait en divisant le texte en phrases. Une phrase se terminera toujours par l'un des symboles de ponctuation suivants: .?!(les autres ne doivent pas être traités). D'autres symboles que ceux-ci font partie de la phrase.


La tâche

Étant donné une ligne de texte composée uniquement de

  • lettres (A-Za-z)
  • nombres (0-9)
  • les espaces
  • ponctuation ( ,.;:?!) (une phrase ne peut pas commencer par l'une d'entre elles).

Affichez les questions contenues dans le texte dans un format raisonnable. Vous pouvez supposer que le texte aura toujours au moins 1 question . Sortie arrière et menant des espaces avant et après une question est autorisée.

Important : à côté d'un symbole de ponctuation , il n'y aura jamais d' autre symbole de ponctuation (par exemple, il ??n'est pas valide et il ne sera pas nécessaire de le gérer).


Cas de test

Au format:

Input
Output(s)

Les cas de 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?

C'est du , donc la soumission avec le plus petit nombre d'octets gagne!


2
.?!D'autres ne doivent pas être traités, comme vos règles le précisent, mais vous avez dit que d'autres ne doivent pas être traités.
Erik the Outgolfer

Pas de test avec plus d'une question?
edc65

@ edc65 Le premier scénario de test comporte 2 questions, mais j'ajouterai un autre scénario de test.
Adnan

Réponses:



5

Python, 46 octets

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

Appeler avec:

f("your string here")

sortie sur les tests:

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

une autre idée, 77 octets (en python3 vous auriez besoin d'une liste autour du filtre):

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

Je suis nouveau dans ce domaine, donc cela pourrait donc être beaucoup plus court.

-17 (!) Octets grâce à Martin

-2 octets en faisant correspondre tout ce qui n'est pas "!", "?" ou "." (Se rapprocher des solutions shell, mais je doute que je pourrais économiser beaucoup plus)


1
Bienvenue dans Programmation d'énigmes et Code Golf! Très belle première réponse :).
Adnan

Je ne pense pas que vous ayez besoin de ce regard du tout et vous n'avez pas non plus besoin de rendre le non- [\w,:; ]*punitif (parce que ce groupe ne peut pas dépasser un caractère de ponctuation de toute façon), et alors vous n'avez pas non plus besoin de faire précéder .votre entrée. Vous pouvez également raccourcir la classe de personnage restante à [^.!?].
Martin Ender

Merci, Martin! J'ai essayé un peu avec cela, mais je n'ai pas vu l'évidence.
KarlKastor

4

JavaScript, 35 24 octets

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

Renvoie tous les sous - chaînes qui commencent après ., ?ou !(ou le début du texte) et à la fin dans un ?.


Urgh. Et je pensais que je faisais bien avec 40 octets. Good Job OP et @MartinEnder
MayorMonty

3

V , 12 octets

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

Essayez-le en ligne!

Une réponse très simple.

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

Heureusement, la gestion des nouvelles lignes ou la vérification de tous les cas de test n'ajoute aucun octet.


3

28 octets, n'est-ce pas? (16 caractères UTF-8)
Fabio Iotti

6
@ bruce965 Jelly utilise une page de codes personnalisée qui encode chacun des 256 caractères qu'il comprend comme un seul octet chacun. Le lien octets dans l'en-tête pointe vers lui.
Dennis

Oh cool! Je ne suis pas encore un golfeur de code, donc je ne suis pas au courant de ces astuces, désolé pour la question.
Fabio Iotti

4
@ bruce965 Pour mémoire, ce n'est pas vraiment une astuce: le langage pourrait tout aussi bien utiliser ISO 8859-1 (ou un autre codage à un octet existant) et être tout aussi puissant, mais l'utilisation d'une page de codes personnalisée vous permet d'utiliser plus des caractères facilement saisissables et de meilleurs mnémoniques que si vous deviez coder avec des caractères de contrôle par exemple. À la fin de la journée, ce n'est qu'un flux d'octets, où chaque octet a reçu une signification.
Martin Ender

2
OK, "truc" aurait pu sonner avec une mauvaise connotation, j'aurais dû dire "stratagème" ou quelque chose. Je n'ai pas pu trouver de meilleur mot que "truc".
Fabio Iotti

3

Utilitaires Shell, 43 38 octets

Merci à rexkogitans pour avoir coupé 5 octets!

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

Entrée de tuyau, comme ceci:

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

Si cela compte, j'utilise:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exe, livré avec Windows 5.1.2600

  • 1
    Je n'ai jamais soumis de réponse en utilisant plusieurs utilitaires auparavant, donc si je fais quelque chose de mal, faites le moi savoir.
    Joe

    Utilisez-vous des versions Windows des utilitaires GNU, ou un shell pour Windows?
    Erik the Outgolfer

    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"enregistre 5 octets (deux ajoutés tret 7 enregistrés sed- cela a été testé en bash). /gn'est pas nécessaire, car il est traité ligne par ligne.
    rexkogitans

    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, j'utilise les ports Windows des utilitaires GNU.
    Joe

    @rexkogitans, merci! J'ai oublié []; ma première tentative de faire ça ressemblait à quelque chose \(\.|!\).
    Joe

    2

    Perl 5.10, 21 18 octets (avec le drapeau -n )

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

    Mise en œuvre simple de la question.

    Essayez-le ici!


    Vous pouvez vous débarrasser du début mde votre expression régulière, puis vous pourrez supprimer l'espace entre sayet/
    Dada

    2

    Ruby 1.9, 17 octets

    $_=$F
    

    Un programme de 5 octets qui doit être appelé avec les options de ligne de commande suivantes:

    paF[^?]*[.!]
    

    Je ne savais pas que les drapeaux Ruby pouvaient être combattus de cette manière, +1! Cela semble un peu étrange, cependant, puisque les questions consécutives seront ensemble comme une chaîne dans ce tableau tandis que les autres questions sont séparées, non? Sauf s'il y a une bizarrerie de Ruby 1.9 que je ne connais pas.
    Value Ink

    @ValueInk Le contenu du tableau sera concaténé afin que le programme génère une seule chaîne, pas un littéral de tableau. Vous pouvez l'essayer sur golf.shinh.org/check.rb qui a ruby ​​1.9. Les drapeaux peuvent être placés dans le shebang.
    xsot

    Aha, cela explique pourquoi vous avez besoin de la version 1.9 depuis la version 2.0 et supérieure pour ressembler à un tableau réel.
    Value Ink

    1

    Lot, 174 octets

    @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 lecture d'une ligne depuis STDIN est un octet plus court que l'utilisation set s=%*.


    1

    PowerShell v4 +, 43 octets

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

    Vraiment simple. Prend les entrées $argset les alimente en tant que premier paramètre d'une [regex]::Matches(...)fonction statique .NET . Le regex que nous faisons correspondre est [^?!.]*\?- c'est-à-dire, n'importe quel nombre de caractères non-fin de phrase qui sont suivis d'un point d'interrogation. La fonction statique renvoie un tableau d'objets détaillant le groupe de capture, l'index, etc., mais nous voulons uniquement.Value s, donc le retour est encapsulé en parens et nous appelons cette propriété. C'est là que l'exigence v4 + entre en jeu, car dans les versions précédentes, vous devriez plutôt faire quelque chose comme une boucle |%{$_.Value}ou |Select Valueobtenir les propriétés appropriées.

    Exemple sans les parens et .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?
    

    Exemple avec les parens et .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 octets

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

    Enregistre 1 octet 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]
    
    En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
    Licensed under cc by-sa 3.0 with attribution required.