Яке саме було ваше запитання?


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?

Це можна зробити, розділивши текст на речення. Речення завжди закінчуватиметься одним із таких розділових символів: .?!(з іншими не потрібно звертатися). Інші символи, крім них, є частиною речення.


Завдання

Дано рядок тексту, що складається тільки

  • літери (A-Za-z)
  • числа (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
.?!З іншими не слід звертатися, як зазначено у ваших правилах, але ви сказали, що з іншими не потрібно звертатися.
Ерік Аутгольфер

Немає тесту з більш ніж одним питанням?
edc65

@ edc65 У першому тестовому випадку є 2 питання, але я додам ще один тестовий випадок.
Аднан

Відповіді:



5

Пітон, 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 байти, збігаючи все, що не є "!", "?" або "." (Наближаючись до рішень оболонки, але я сумніваюся, що міг би значно більше зекономити)


1
Ласкаво просимо до головоломки програмування та коду для гольфу! Дуже приємна перша відповідь :).
Аднан

Я не думаю, що тобі це взагалі не потрібно, і ні для того, щоб ти робив [\w,:; ]*ускрежене (тому що ця група ніяк не може пройти повз знаків пунктуації), і тоді також не потрібно робити додаток .до свого вводу. Ви можете скоротити решта класів символів до [^.!?].
Мартін Ендер

Дякую, Мартіне! Я трохи пробував це, але очевидного не бачив.
KarlKastor

4

JavaScript, 35 24 байти

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

Повертає всі підрядки, які починаються після a ., ?або !(або початку тексту) і закінчуються в a ?.


Урх. І я подумав, що зробив добре 40 байт. Good Job 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 '!'

На щастя, обробка нових рядків або перевірка всіх тестових випадків не додають жодних байтів.


3

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/.\+/&?/"

Якщо це важливо, я використовую:

  • ГНУ tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exeпостачається з Windows 5.1.2600

  • 1
    Я ніколи не надсилав відповіді, використовуючи кілька утиліт, тому, якщо я щось роблю не так, дайте мені знати.
    Джо

    Чи використовуєте Windows версії GNU utililties або оболонку для Windows?
    Ерік Аутгольфер

    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"економить 5 байт (два додані в trі 7 збережені в sed- це було випробувано в баші). /gне є необхідним, оскільки він обробляється по рядку.
    rexkogitans

    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, я використовую порти Windows утиліти GNU.
    Джо

    @rexkogitans, дякую! Я забув []; моя перша спроба зробити це виглядало приблизно так \(\.|!\).
    Джо

    2

    Perl 5.10, 21 18 байт (з прапором -n )

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

    Безпосередня реалізація питання.

    Спробуйте тут!


    Ви можете позбутися провідних mсвоїх регулярних виразів, і тоді ви зможете видалити пробіл між sayі/
    Dada

    2

    Рубін 1,9, 17 байт

    $_=$F
    

    Програма на 5 байтів, до якої потрібно викликати такі параметри командного рядка:

    paF[^?]*[.!]
    

    Я не знав, що з Рубі прапорами можна боротися таким чином, +1! Хоча це дивно, оскільки послідовні запитання будуть разом як один рядок у цьому масиві, тоді як інші питання окремі, правда? Якщо тільки не є примх Ruby 1.9, про які я не знаю.
    Значення чорнила

    @ValueInk Вміст масиву буде об'єднано, тому програма виводить одну рядок, а не літерал масиву. Ви можете спробувати це на golf.shinh.org/check.rb, який має рубін 1.9. Прапори можна встановити в шебангу.
    xsot

    Ага, це пояснює, чому вам потрібно 1.9 з 2.0 і виводити його вище, щоб виглядати як фактичний масив.
    Значення чорнила

    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 . Регекс, який ми співставляємо, [^?!.]*\?- це будь-яка кількість символів, що не закінчуються реченням, за якими слідує знак питання. Статична функція повертає масив об'єктів, де деталізується група захоплення, індекс тощо, але ми хочемо лише те.Value s, тому повернення інкапсульовано в паренах і ми називаємо це властивість. Тут грає вимога 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?
    

    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]
    
    Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
    Licensed under cc by-sa 3.0 with attribution required.