Was genau war deine Frage?


19

Einführung

Wenn Sie einen langweiligen Text erhalten, möchten Sie ihn nur so schnell wie möglich hinter sich bringen. Beobachten wir den folgenden Text:

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.

Hinweis: Dieser Text enthält zur besseren Lesbarkeit Zeilenumbrüche, während die zu behandelnden Testfälle keine Zeilenumbrüche enthalten.

Eine Möglichkeit, Text zu überfliegen, besteht darin, Fragen zu finden, die der Verfasser in den Text eingefügt hat. Zum Beispiel gibt es 1 Frage im obigen Text. Nämlich:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

Dies kann durch Aufteilen des Textes in Sätze erfolgen. Ein Satz endet immer mit einem der folgenden Satzzeichen: .?!(andere müssen nicht behandelt werden). Andere Symbole als diese sind Teil des Satzes.


Die Aufgabe

Bei einer Textzeile bestehend aus nur

  • Buchstaben (A-Za-z)
  • Zahlen (0-9)
  • Leerzeichen
  • Interpunktion ( ,.;:?!) (ein Satz kann nicht mit einer dieser beginnen).

Geben Sie die Fragen im Text in einem angemessenen Format aus. Sie können davon ausgehen, dass der Text immer mindestens 1 Frage enthält . Die Ausgabe von nachgestellten und führenden Leerzeichen vor und nach einer Frage ist zulässig.

Wichtig : Neben einem Interpunktionssymbol wird kein weiteres Interpunktionssymbol angezeigt (z. B. ??ist ungültig und muss nicht behandelt werden).


Testfälle

Im Format:

Input
Output(s)

Die Testfälle:

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?

Das ist , also gewinnt die Einsendung mit der niedrigsten Anzahl von Bytes!


2
.?!Andere dürfen nicht behandelt werden, wie in Ihren Regeln festgelegt, Sie haben jedoch angegeben, dass andere nicht behandelt werden müssen.
Erik der Outgolfer

Kein Testfall mit mehr als einer Frage?
Edc65

@ edc65 Der erste Testfall hat 2 Fragen, aber ich werde einen weiteren Testfall hinzufügen.
Adnan

Antworten:



5

Python, 46 Bytes

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

Rufen Sie an mit:

f("your string here")

Ausgabe bei 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?']

eine andere Idee, 77 Bytes (in python3 brauchst du eine Liste um Filter):

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

Ich bin neu darin, also könnte dies wahrscheinlich viel kürzer sein.

-17 (!) Bytes dank Martin

-2 Bytes durch Abgleichen von Elementen, die nicht "!", "?" oder "." (Ich komme den Shell-Lösungen sehr nahe, bezweifle aber, dass ich noch viel mehr sparen kann.)


1
Willkommen bei Programming Puzzles und Code Golf! Sehr schöne erste Antwort :).
Adnan

Ich glaube nicht, dass Sie diesen Lookbehind brauchen, und Sie müssen auch nicht den [\w,:; ]*Ungreedy machen (weil diese Gruppe ohnehin nicht an einem Interpunktionszeichen vorbeikommen kann), und dann müssen Sie .Ihren Eingaben auch nichts voranstellen . Sie können die verbleibende Zeichenklasse auch auf kürzen [^.!?].
Martin Ender

Vielen Dank, Martin! Ich habe es ein bisschen ausprobiert, aber das Offensichtliche nicht gesehen.
Karl Kastor

4

JavaScript, 35 24 Bytes

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

Gibt alle Teilzeichenfolgen zurück, die nach a ., ?oder !(oder dem Anfang des Texts) beginnen und in a enden ?.


Urgh. Und ich dachte, ich mache es gut mit 40 Bytes. Gute Arbeit OP und @MartinEnder
MayorMonty

3

V , 12 Bytes

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

Probieren Sie es online!

Eine sehr einfache Antwort.

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

Zum Glück werden durch das Behandeln von Zeilenumbrüchen oder das Überprüfen aller Testfälle keine Bytes hinzugefügt.


3

28 Bytes, nicht wahr? (16 UTF-8-Zeichen)
Fabio Iotti

6
@ bruce965 Jelly verwendet eine benutzerdefinierte Codepage, die jedes der 256 Zeichen codiert, die es als Einzelbyte versteht. Der Byte- Link im Header verweist darauf.
Dennis

Oh cool! Ich bin noch kein Codegolfer, daher sind mir diese Tricks nicht bekannt. Die Frage tut mir leid.
Fabio Iotti

4
@ bruce965 Für das Protokoll ist es kein wirklicher Trick: Die Sprache könnte genauso gut ISO 8859-1 (oder eine andere vorhandene Einzelbyte-Codierung) verwenden und genauso leistungsfähig sein, aber die Verwendung einer benutzerdefinierten Codepage ermöglicht es Ihnen, mehr zu verwenden Leicht tippbare Zeichen und bessere Mnemonik, als wenn Sie zum Beispiel mit Steuerzeichen codieren müssten. Letztendlich ist es nur ein Strom von Bytes, denen jedes Byte eine Bedeutung zugewiesen wurde.
Martin Ender

2
OK, "Trick" hätte mit einer schlechten Konnotation klingen können, ich hätte "Strategem" sagen sollen oder so. Ich konnte kein besseres Wort als "Trick" finden.
Fabio Iotti

3

Shell-Dienstprogramme, 43 38 Bytes

Dank an rexkogitans für das Trimmen von 5 Bytes!

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

Pipe-Eingabe in etwa so:

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

Wenn es darauf ankommt, benutze ich:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exewird mit Windows 5.1.2600 ausgeliefert

  • 1
    Ich habe noch nie eine Antwort mit mehreren Dienstprogrammen gesendet. Wenn ich also etwas falsch mache, lass es mich wissen.
    Joe

    Verwenden Sie Windows-Versionen der GNU-Dienstprogramme oder eine Shell für Windows?
    Erik der Outgolfer

    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"spart 5 Bytes (zwei hinzugefügt trund 7 gespeichert sed- dies wurde in Bash getestet). /gist nicht notwendig, da es zeilenweise abgearbeitet wird.
    Rexkogitans

    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, ich benutze die Windows-Ports der GNU-Dienstprogramme.
    Joe

    @rexkogitans, danke! Ich habe es vergessen []; mein erster versuch sah so aus \(\.|!\).
    Joe

    2

    Perl 5.10, 21 18 Bytes (mit -n Flag)

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

    Einfache Umsetzung der Frage.

    Probieren Sie es hier aus!


    Sie können die Führung mIhres Regex loswerden , und dann können Sie das Leerzeichen zwischen sayund entfernen/
    Dada

    2

    Ruby 1.9, 17 Bytes

    $_=$F
    

    Ein 5-Byte-Programm, das mit den folgenden Befehlszeilenoptionen aufgerufen werden muss:

    paF[^?]*[.!]
    

    Ich wusste nicht, dass mit Ruby-Flaggen so gerungen werden kann, +1! Es fühlt sich jedoch seltsam an, da aufeinanderfolgende Fragen als eine Zeichenfolge in diesem Array zusammengefasst werden, während andere Fragen getrennt sind, oder? Es sei denn, es gibt eine Ruby 1.9-Eigenheit, die ich nicht kenne.
    Value Ink

    @ValueInk Der Inhalt des Arrays wird verkettet, sodass das Programm eine einzelne Zeichenfolge und kein Array-Literal ausgibt. Sie können es unter golf.shinh.org/check.rb mit Ruby 1.9 ausprobieren . Die Flaggen können im shebang gesetzt werden.
    Xsot

    Aha, das erklärt, warum Sie 1.9 seit 2.0 benötigen und es ausgeben müssen, um wie ein tatsächliches Array auszusehen.
    Wert Tinte

    1

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

    Das Lesen einer Zeile aus STDIN ist ein Byte kürzer als die Verwendung set s=%*.


    1

    PowerShell v4 +, 43 Byte

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

    Wirklich unkompliziert. Übernimmt die Eingabe$args und gibt diese als ersten Parameter an eine [regex]::Matches(...)statische .NET- Funktion weiter. Die Regex, mit der wir übereinstimmen, ist [^?!.]*\?- das heißt, eine beliebige Anzahl von Zeichen ohne Satzende, denen ein Fragezeichen folgt. Die statische Funktion gibt ein Array von Objekten zurück, in denen angegeben ist, welche Erfassungsgruppe, welcher Index usw. vorhanden ist. Wir möchten jedoch nur das .Values, sodass die Rückgabe in Parens eingeschlossen ist und wir diese Eigenschaft aufrufen. Hier kommt die v4 + -Anforderung ins Spiel, da Sie in früheren Versionen stattdessen eine Schleife ausführen |%{$_.Value}oder |Select Valuedie entsprechenden Eigenschaften abrufen müssen.

    Beispiel ohne die Eltern und .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?
    

    Beispiel mit den Eltern und .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 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])
    

    Speichert 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]
    
    Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
    Licensed under cc by-sa 3.0 with attribution required.