Каким именно был ваш вопрос?

19

Вступление

Когда вам дают скучный текст, вы просто хотите покончить с ним как можно быстрее. Давайте посмотрим на следующий текст:

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.

Примечание. В этом тексте есть новые строки для удобства чтения, в то время как в тестовых примерах, которые вам нужно обработать, нет символов новой строки.

Один из способов просмотра текста - найти вопросы, которые автор вставил в текст. Например, есть 1 вопрос в тексте выше. А именно:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

Это можно сделать, разбив текст на предложения. Предложение всегда заканчивается одним из следующих символов пунктуации: .?!(другие не должны обрабатываться). Другие символы, кроме этих, являются частью предложения.


Задание

Задана строка текста, состоящая только из

  • буквы (а-я-я)
  • цифры (0-9)
  • пространства
  • пунктуация ( ,.;:?!) (предложение не может начинаться с одного из них).

Выведите вопросы, которые есть в тексте, в любом разумном формате. Вы можете предположить, что в тексте всегда будет хотя бы 1 вопрос . Выведение завершающую и ведущие пробелы до и после того, как вопрос разрешен.

Важно : Рядом с символом пунктуации никогда не будет другого символа пунктуации (например, ??он недействителен и не должен обрабатываться).


Контрольные примеры

В формате:

Input
Output(s)

Тестовые случаи:

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?

Это , поэтому выигрывает представление с наименьшим количеством байтов!

Аднан
источник
2
.?!Другие не должны обрабатываться, как указано в ваших правилах, но вы сказали, что другие не должны обрабатываться.
Эрик Outgolfer
Нет теста с более чем одним вопросом?
edc65
@ edc65 В первом тестовом примере есть 2 вопроса, но я добавлю еще один тестовый пример.
Аднан

Ответы:

5

Python, 46 байт

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

Звоните с:

f("your string here")

вывод на тесты:

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

другая идея, 77 байт (в python3 вам понадобится список вокруг фильтра):

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

Я новичок в этом, так что это, так что это может быть гораздо короче.

-17 (!) Байтов благодаря Мартину

-2 байта путем сопоставления чего-либо, кроме "!", "?" или "." (Приближаясь к решениям оболочки, но я сомневаюсь, что смогу сэкономить гораздо больше)

KarlKastor
источник
1
Добро пожаловать в Программирование Пазлов и Code Golf! Очень хороший первый ответ :).
Аднан
Я не думаю, что вам вообще нужен этот [\w,:; ]*взгляд за спиной, и вам также не нужно делать несносных (потому что эта группа в любом случае не может пройти мимо знака препинания), и тогда вам также не нужно предвкушать .свой вклад. Вы также сокращаете оставшийся класс персонажа до [^.!?].
Мартин Эндер
Спасибо, Мартин! Я немного попробовал с этим, но не видел очевидного.
КарлКастор
4

JavaScript, 35 24 байта

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

Возвращает все подстроки, которые начинаются после a ., ?или или !(или начала текста) и заканчиваются на a ?.

Бизнес Кот
источник
Urgh. И я думал, что справился с 40 байтами. Хорошая работа OP и @MartinEnder
MayorMonty
3

V , 12 байт

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

Попробуйте онлайн!

Очень простой ответ.

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

К счастью, обработка новых строк или проверка всех тестовых случаев не добавляет байтов.

DJMcMayhem
источник
3

Желе , 16 байт

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

Попробуйте онлайн! или проверьте все тесты

Деннис
источник
28 байт, не так ли? (16 символов UTF-8)
Фабио Иотти
6
@ bruce965 Jelly использует пользовательскую кодовую страницу, которая кодирует каждый из 256 символов, которые он понимает как один байт каждый. В байтах ссылаются в точках заголовка к нему.
Деннис
О, круто! Я еще не специалист по кодам, поэтому я не знаю об этих уловках, извините за вопрос.
Фабио Иотти
4
@ bruce965 Для справки, на самом деле это не уловка: язык с таким же успехом может использовать ISO 8859-1 (или некоторую другую существующую однобайтовую кодировку) и быть столь же мощным, но использование пользовательской кодовой страницы позволяет вам использовать больше легко вводимые символы и лучшая мнемоника, чем, например, если бы вам приходилось кодировать контрольными символами. В конце концов, это просто поток байтов, где каждому байту было присвоено какое-то значение.
Мартин Эндер
2
Хорошо, «трюк» мог звучать с плохой коннотацией, я должен был сказать «уловка» или что-то в этом роде. Я не мог найти лучшего слова, чем «трюк».
Фабио Иотти
3

Shell утилиты, 43 38 байт

Спасибо rexkogitans за обрезку 5 байтов!

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

Трубный ввод, вот так:

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

Если что имеет значение, я использую:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exe, поставляется с Windows 5.1.2600
  • Джо
    источник
    1
    Я никогда не отправлял ответ, используя несколько утилит, поэтому, если я делаю что-то не так, дайте мне знать.
    Джо
    Используете ли вы версии Windows утилит GNU или оболочку для Windows?
    Эрик Outgolfer
    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"сохраняет 5 байт (два добавлено trи 7 сохранено sed- это было проверено в bash). /gне требуется, так как обрабатывается построчно.
    Rexkogitans
    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, я использую порты Windows утилит GNU.
    Джо
    @rexkogitans, спасибо! Я забыл о []; моя первая попытка сделать это выглядела примерно так \(\.|!\).
    Джо
    2

    Perl 5.10, 21 18 байт (с флагом -n )

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

    Простая реализация вопроса.

    Попробуй это здесь!

    Пол Пикард
    источник
    Вы можете избавиться от ведущего mвашего регулярного выражения, и тогда вы сможете удалить пространство между sayи/
    Dada
    2

    Ruby 1,9, 17 байт

    $_=$F
    

    5-байтовая программа, которая должна вызываться со следующими параметрами командной строки:

    paF[^?]*[.!]
    
    xsot
    источник
    Я не знал, что с флагами Руби можно бороться таким образом, +1! Хотя это кажется странным, поскольку последовательные вопросы будут объединены в одну строку в этом массиве, в то время как другие вопросы разделены, верно? Если нет какой-то причуды Ruby 1.9, о которой я не знаю.
    Value Ink
    @ValueInk Содержимое массива будет объединено, поэтому программа выведет одну строку, а не литерал массива. Вы можете попробовать это по адресу golf.shinh.org/check.rb, где есть ruby ​​1.9. Флаги могут быть установлены в Шебанге.
    xsot
    Ага, это объясняет, почему вам нужна версия 1.9, начиная с 2.0, и выше, чтобы она выглядела как реальный массив.
    Value Ink
    1

    Пакет, 174 байта

    @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
    

    Чтение строки из STDIN на байт короче, чем использование set s=%*.

    Нил
    источник
    1

    PowerShell v4 +, 43 байта

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

    Действительно просто. Принимает ввод $argsи передает его в качестве первого параметра [regex]::Matches(...)статической функции .NET . Регулярное выражение, с которым мы сопоставляем, [^?!.]*\?- это любое количество символов, не заканчивающихся предложением, за которыми следует знак вопроса. Статическая функция возвращает массив объектов, детализирующих, какую группу захвата, индекс и т. Д., Но нам нужны только .Values, поэтому возвращаемое значение инкапсулируется в скобках, и мы вызываем это свойство. Здесь вступает в действие требование v4 +, так как в предыдущих версиях вам вместо этого нужно было сделать что-то вроде цикла |%{$_.Value}или |Select Valueполучить соответствующие свойства.

    Пример без паренов и .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?
    

    Пример с паренсом и .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
    источник
    1

    Python 3, 91 байт

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

    Сохраняет 1 байт в 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]
    
    Даниил
    источник