你到底是什么问题?


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)
  • 空格
  • 标点符号(,.;:?!(句子不能以其中之一开头)。

以任何合理的格式输出文本中的问题。您可能会认为文本始终至少有一个问题。输出拖尾领先的前,后一个问题是容许空间。

重要提示:在标点符号旁边,将永远不会再有其他标点符号(例如??,无效且不需要处理)。


测试用例

格式:

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 '16

@ edc65第一个测试用例有2个问题,但是我将添加另一个测试用例。
阿德南

Answers:



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字节 要么 ”。” (接近shell解决方案,但我怀疑我可以节省更多)


1
欢迎来到编程难题和Code Golf!非常好的第一个答案:)。
阿德南

我认为您根本不需要[\w,:; ]*后面的内容,也不需要使人感到不愉快(因为该组无论如何也不能越过标点符号),那么您也不需要先.输入。您也可以将剩余的字符类缩短为[^.!?]
Martin Ender

谢谢马丁!我对此进行了一些尝试,但没有发现明显的问题。
KarlKastor '16

4

JavaScript,35个 24字节

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

返回所有以.,,?!(或文本的开头)开始并以结束的子字符串?


嗯 而且我以为40字节做得很好。好工作OP和@MartinEnder
市长蒙蒂2016年

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

果冻,16 字节

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

在线尝试!验证所有测试用例


28个字节,不是吗?(16个UTF-8字符)
Fabio Iotti '16

6
@ bruce965 Jelly使用一个自定义代码页,该页将它理解为每个字节的256个字符进行编码。标头中的字节链接指向它。
丹尼斯

哦,太酷了!我还不是代码窃贼,所以我不知道这个技巧,对此问题表示抱歉。
法比奥·伊奥蒂

4
@ bruce965并不是一个真正的技巧:语言可以使用ISO 8859-1(或其他一些现有的单字节编码)并且功能强大,但是使用自定义代码页可以使您使用更多代码比起您必须使用控制字符进行编码,它更容易键入字符并具有更好的助记符。归根结底,这只是字节流,每个字节都被赋予了一定的含义。
Martin Ender

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
  • cmd.exeWindows 5.1.2600随附的Microsoft的

  • 1
    我以前从未使用多个实用程序提交过答案,因此,如果我做错了什么,请告诉我。

    您使用Windows版本的GNU实用程序,还是Windows的外壳?
    暴民埃里克

    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"保存5个字节(添加了2个字节tr,保存了7 个字节sed-已在bash中进行了测试)。/g不需要,因为它是逐行处理的。
    rexkogitans '16

    @EʀɪᴋᴛʜᴇGᴏʟғᴇʀ,我正在使用GNU实用程序的Windows端口。

    @rexkogitans,谢谢!我忘记了[]; 我第一次尝试这样做看起来像\(\.|!\)


    2

    Ruby 1.9,17个字节

    $_=$F
    

    一个5字节的程序,必须使用以下命令行选项来调用:

    paF[^?]*[.!]
    

    我不知道Ruby标志可以用+1的方式摔跤!但是,感觉有点奇怪,因为连续的问题将作为一个字符串组合在一起,而其他问题是分开的,对吧?除非有Ruby 1.9怪癖,否则我不知道。
    价值墨水

    @ValueInk将连接数组的内容,因此程序将输出单个字符串,而不是数组文字。您可以在具有ruby 1.9的golf.shinh.org/check.rb上进行尝试。可以在shebang中设置标志。
    xsot

    啊哈,这解释了为什么从2.0开始需要1.9,然后将其输出以看起来像一个实际的数组。
    价值墨水

    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并将其作为.NET [regex]::Matches(...)静态函数的第一个参数输入。我们要匹配的正则表达式是[^?!.]*\?-即,任意数量的无句号字符后跟一个问号。静态函数返回一个对象数组,详细说明捕获组,索引等,但是我们只需要.Values,因此返回值封装在parens中,我们将其称为属性。这是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])
    

    在Python 2中节省1个字节:

    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]
    
    By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
    Licensed under cc by-sa 3.0 with attribution required.