删除称呼


11

挑战

嗨,给定一个字符串作为输入,请删除在字符串开头找到的所有称呼

在50字节以下执行最正确替换的程序将获胜。

称呼

嘿,称呼定义为以下单词之一:

  • 你好
  • 你好
  • 问候
  • hai
  • 伙计们
  • i
  • 你好
  • iya
  • 干草
  • ya
  • 你好
  • 称呼

首字母可以大写。

称呼之后总会有一个逗号和/或一个空格,必须将其删除。逗号和空格可以按任何顺序(,<space><space>,)都应删除。

问候语和后面的单词将永远只用逗号和/或单个空格分隔。

然后,您必须在称呼之后大写单词的第一个字母。即使未进行替换,您仍应将输出的第一个单词大写。

大写字母仅适用于小写字母字符(abcdefghijklmnopqrstuvwxyz)。您应该保留其他任何字符。

称呼将始终在字符串的开头。你不应该取代称呼是不是在开头。

不一定总有称呼。

您的代码必须少于50个字节。

例子

Input > Output

Salutations, what's going on? > What's going on?
hello i have quetions how does juice an avocado > I have quetions how does juice an avocado
How d'you do > How d'you do
Hey,You! > You!
hola cows eat hay > Cows eat hay
hey Hi there! > Hi there!
hihi ,guys > Guys

测试电池

Hola,总共有1000种不同的输入:

一个Bash命令来检索以上两者是

wget https://raw.githubusercontent.com/beta-decay/Remove-Substitutions-Battery/master/{inputs,replaced}.txt

获奖

Howdy,从上述1000个输入中最正确替换的程序获胜。

您必须将程序正确处理的输入百分比放在标题中,如下所示:

# Language Name, percentage%

我不确定杰夫为什么要这么做,但这仍然是一个不错的挑战。


3
s=>System.Text.RegularExpressions.Regex.Replace();在指定模式之前50个字节,然后就是C#。(当然使用正则表达式方法)
TheLethalCoder

1
Python也出(与正则表达式):(
的Gabor菲克特

您总是可以返回给定输入的31.3%分数。
伊恩·米勒

在挑战开始之初,敦促编辑称呼。;)
Draco18s不再信任SE

2
有趣的轶事:我最初在PPCG上发表的第一篇文章是 “ Hello,world!:)”,但是当我发布它时,立即注意到SE删除了除“ :)”之外的所有内容。当然,我为自己做错了事而感到and恼,并立即删除了笑脸。在修订历史中没有留下任何痕迹,直到今天,您和我是唯一知道这件事的人……
ETHproductions '17

Answers:


8

GNU sed,78% 100%

/^\w*[wd]\b/!s/^[dghs][eruaio]\w*\W\+//i
s/./\U&/

(49个字节)

测试电池非常有限:我们可以计算出每行中最先出现的单词:

$ sed -e 's/[ ,].*//' inputs.txt | sort | uniq -ic
 40 aight
 33 alright
 33 dear
 33 g'd
 41 good
 36 greetings
 35 guys
 31 hai
 33 hay
 27 hello
 33 hey
 37 heya
 43 hi
 34 hihi
 29 hii
 35 hiya
 45 hola
 79 how
 37 howdy
 33 kowabunga
 39 salutations
 32 speak
 34 sweet
 40 talk
 36 wassup
 34 what's
 38 yo

要移除的问候首先dghs(或大写版本物); 以这些字母开头的非敬语是

 33 g'd
 41 good
 79 how
 32 speak
 34 sweet

忽略单独出现的行,即220个假阳性。因此,让我们删除以这四个字母中的任何一个开头的初始单词。

当我们看到以任何一个(/ ^[dghs]\w*)开头,不区分大小写(/i)且之后至少有一个非单词字符(\W\+)的初始单词时,请替换为空字符串。然后,将第一个字符替换为大写字母(s/./\U&/)。

那给了我们

s/^[dghs]\w*\W\+//i
s/./\U&/

现在,我们可以对此进行一些改进:

  • 假阳性的最大集合是how,因此我们以否定测试为前缀来作为替换的条件:

     /^[Hh]ow\b/!
  • 我们还可以筛选的第二个字母,消除g'dspeak以及sweet

    s/^[dghs][eruaio]\w*\W\+//i
  • 这仅good是误报。我们可以调整前缀测试以消除以w或结尾的单词d

    /^\w*[wd]\b/!

示范

$ diff -u <(./123478.sed inputs.txt) replaced.txt | grep ^- | wc -l
0

9

视网膜68% 72.8%(旧)74.8% 77.5%(新测试电池)

i`^h(a[iy]|eya?|i(h?i|ya|)|ello)[ ,]+

T`l`L`^.

在线尝试!编辑:在@MartinEnder提示的帮助下,获得了4.8%(旧)2.7%(新)的覆盖率。


1
我认为您可以[ ,]+ 挤出更多字节。您也可以h从交替中提取。
马丁·恩德

不确定,但i`^h(a[iy]|eya?|i(h?i?|ya))[ ,]+可能有效,这意味着您有8个字节可备用
ASCII码,仅ASCII

@ ASCII-only h?i?不会保存任何内容,h?i|并且会匹配hih(尽管我不知道在测试案例中是否也是如此)。
马丁·恩德

实际上,如果这样做,确实会节省一个字节ih?i?|iya
马丁·恩德

或许i`^h(a[iy]|eya?|ih?i|iya|ola|ello)[ ,]+然后
ASCII-仅


4

Vim,55.4% 44.4%

df,<<vgU

说明:

df,    Delete until and including the first comma
<<     Remove leading spaces
vgU    Uppercase first letter

嘿,我换了新的测试电池,可以用新分数更新答案吗?谢谢
Beta衰减,
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.