预测是否以50个字节加注星标


41

给定一个输入字符串,该字符串包含来自我们的网站聊天室的任何消息,该消息取自以下描述和链接的列表,请输出真实值或虚假值,以尝试预测该消息是否以50个字节或更短的距离加注星标。

您可以使用任何真实或虚假值,但它们必须相同(即,应该只有两个可能的输出,一个真实和一个虚假)。输入将以原始HTML格式给出,其中删除了换行符,并且其中可能包含非ASCII Unicode字符。如果您需要输入UTF-8以外的内容,请在回答中说出来。

从下面的链接列表中,可以正确地预测出聊天消息的最高百分比的人将是对此挑战的胜出者。如果两个给定的提交成功率相同,则较短的提交将获胜。

请提供有关在整个消息集上运行代码并计算正确百分比的说明。理想情况下,这应该是一些样板代码(不计入您的50个字节),这些代码循环遍历肯定的测试用例,并输出您的代码中有多少是正确的,然后对否定的测试用例执行相同的操作。(然后可以通过手动计算总得分(correctPositive + correctNegative) / totalMessages。)

为了使您的代码合理地可测试,必须在5分钟或更短的时间内完成代码,以在合理的现代硬件上完成整个聊天消息列表。

聊天消息的完整列表可以在此处找到,它由1000个最新的已加星标消息(如真实测试用例)和1000个最新的未加星标消息(如虚假测试用例)组成。注意要点中有两个文件。向下滚动约一半以查看未加注星标的消息。


4
了解了聊天的行为,我认为下面的Pyth就足够了:O2
Arcturus

9
考虑到过去Don'?t star
加注

11
如果在输入中还为您提供了用户,这将容易得多。
Mama Fun Roll

3
在某些时候,我会回答正则表达式,2个字节 \^
PurkkaKoodari,2016年

14
我认为您应该在接下来的1000条消息中再次运行此命令,然后看看哪一个真正预言了星光
大约

Answers:


29

视网膜,50字节,71.8% 72.15%

^.*([[CE;ಠ-ﭏ]|tar|ol|l.x|eo|a.u|pin|nu|o.f|"$)

在@MartinBüttner的建议下尝试了一些正则表达式高尔夫。这与704个已加星标的邮件匹配,而与739个未加星标的邮件匹配。

^.*( ... )是确保始终有0或1的匹配,因为视网膜输出默认匹配的数量。您可以通过m`在多行模式前添加前缀,然后运行来对输入文件进行程序评分

Retina stars.retina < starred.txt

也是一样unstarred.txt


分析/说明

我使用程序生成了以上代码段(以及更多代码段),然后手动选择了我想要的代码段。以下是上述片段为何起作用的一些直觉:

  • C:比赛PPCG@CᴏɴᴏʀO'Bʀɪᴇɴ
  • E:比赛@ETHproductions@El'endiaStarman
  • ;:由于测试用例是HTML,因此可以匹配&lt;&gt;
  • ಠ-ﭏ:匹配一系列Unicode字符,最主要用于ಠ_ಠ@Doorknob冰
  • tar:匹配star@El'endiaStarman(再次)的变体,并且也gravatar出现在新帖子机器人发布的Onebox中
  • ol:匹配rel="nofollow"许多链接和单一框
  • l.x:比赛@AlexA.@trichoplax
  • eo:主要是比赛people,但也有3种情况@Geobits
  • a.u:主要匹配graduationstatusfeatureabuse
  • pinping以结尾的匹配项和单词ping。还与有关的讨论中的一些帖子匹配pineapple,作为过度拟合的示例。
  • nu:匹配混合单词,其中最常见的是 number
  • o.f:比赛golfconf(irm|use)
  • "$:匹配双引号作为最后一个字符,例如 @phase He means "Jenga."

[是没有什么特别的-我只是一个字符遗留下来的,所以我想我可以用它来搭配更多的情况。


(我尚未发布测试代码,因为它似乎运行得很慢,我想弄清楚为什么。不过现在为时已晚。)
Sp3000

1
每个测试用例执行一次Retina会花费很长时间。多行模式几乎立即报告要求的分数。
丹尼斯

@丹尼斯谢谢,我完全忘记了我可以做到的。
Sp3000

3
大声笑,现在我的名字是星星磁铁吗?
ETHproductions 2016年

18

JavaScript ES6,50字节,71.10%

正确识别670个已加星标和752个未加星标。

x=>/ .[DERv]|tar|a.u|l.x|<i|eo|ol|[C;ಠ]/.test(x)

现在跨越70%的关卡,并击败除视网膜之外的所有人!

返回true消息是否包含以下任何内容:

  • 一个字,其中的第二个字母是DER,或v;
  • tar(通常star);
  • au在它们之间一个字符;
  • l并且x介于两者之间(通常是alex);
  • 斜体文字;
  • eool;
  • a C,分号或a

这是一些更富有成效的比赛,似乎不值得摆脱其他比赛:

  • nf
  • nu
  • yp
  • n.m

这越来越接近视网膜的答案,但是我发现大多数改进都是我自己完成的。

在以下页面之一的控制台中对其进行测试:星号文本无星号文本

var r=document.body.textContent.replace(/\n<br/g,"<br").split("\n").slice(0,-1);
var s=r.filter(function(x){return/ .[DERv]|tar|a.u|l.x|<i|eo|ol|[C;ಠ]/.test(x)}).length;
console.log("Total:",r.length,"Matched:",s,"Not matched:",r.length-s);

这是替代版本。/a/.test从技术上讲是一个函数,但不满足我们的标准

/ .[ERv]|a.u|l.x|<i|eo|yp|ol|nf|tar|[C;ÿ-ff]/.test

得分71.90%(697星,741星)。


我一直在列表上进行一些分析,以查看哪些正则表达式组与已加注星标最多和未加注星标最少的帖子匹配。分析可以在本要点中找到。到目前为止,我已经检查aaa.a匹配。a.u以28分的成绩排名第50位,但这是其格式中最有效的匹配...


只有1000条消息...?
科纳·奥布莱恩

2
@CᴏɴᴏʀO'Bʀɪᴇɴ有些是多行的,在代码段中没有考虑到。此问题已解决。
ETHproductions 2016年

为什么没人使用/regexp/.test()?我认为有可能在其他情况下进行挤压。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

8
今天,我学会了只要说出自己的名字就能获得聊天明星。
Alex A.

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳谢谢,不知道我怎么没想到
ETHproductions 2016年

15

Pyth,50字节,67.9%

0000000: 21 40 6a 43 22 03 91 5d d3 c3 84 d5 5c df 46 69 b5 9d  !@jC"..]....\.Fi..
0000012: 42 9a 75 fa 74 71 d9 c1 79 1d e7 5d fc 25 24 63 f8 bd  B.u.tq..y..].%$c..
0000024: 1d 53 45 14 d7 d3 31 66 5f e8 22 32 43 7a              .SE...1f_."2Cz

这会将输入散列到322个存储桶之一中,并根据该存储桶选择布尔值。

计分

$ xxd -c 18 -g 1 startest.pyth
0000000: 72 53 6d 21 40 6a 43 22 03 91 5d d3 c3 84 d5 5c df 46  rSm!@jC"..]....\.F
0000012: 69 b5 9d 42 9a 75 fa 74 71 d9 c1 79 1d e7 5d fc 25 24  i..B.u.tq..y..].%$
0000024: 63 f8 bd 1d 53 45 14 d7 d3 31 66 5f e8 22 32 43 64 2e  c...SE...1f_."2Cd.
0000036: 7a 38                                                  z8
$ echo $LANG
en_US
$ pyth/pyth.py startest.pyth < starred.txt
[[345, False], [655, True]]
$ pyth/pyth.py startest.pyth < unstarred.txt
[[703, False], [297, True]]

14

CJam,45字节,65.55%

l_c"\"#&'(-.19<CEFHIJLMOPSTXY[_qಠ"e=\1b8672>|

这将检查第一个字符是否在特定列表中,或者所有代码点的总和是否大于8,672。

计分

$ cat startest.cjam
1e3{l_c"\"#&'(-.19<CEFHIJLMOPSTXY[_qಠ"e=\1b8672>|}*
$ java -jar cjam-0.6.5.jar startest.cjam < starred.txt | fold -1 | sort | uniq -c
    308 0
    692 1
$ java -jar cjam-0.6.5.jar startest.cjam < unstarred.txt | fold -1 | sort | uniq -c
    619 0
    381 1

+1教我有关fold命令以及实际答案的信息。
Doorknob

6

Matlab / Octave,17字节60.15%

正确地将490条消息分类为已加注星标,将713条消息分类为未加注星标

当前版本:

只是检查长度。

f=@(w)numel(w)>58

旧版本:

可以翻译成任何其他语言。它只是检查消息中是否包含星号score: 59/911/52.5%

f=@(w)nnz(strfind(lower(w),'star'))>0 %

使用以下代码的测试用例的结果:

slCharacterEncoding('UTF-8');

fid = fopen('codegolf_starred_messages_starred.txt');
line = fgetl(fid);
starred = 0;
while ischar(line)
    if f(line);
        starred = starred +1;
    end

    disp(line)
    line = fgetl(fid);
end
fclose(fid);


fid = fopen('codegolf_starred_messages_unstarred.txt');
line = fgetl(fid);
unstarred = 0;
while ischar(line)
    if ~f(line);
        unstarred = unstarred +1;
    end

    disp(line)
    line = fgetl(fid);
end
fclose(fid);

disp(['  correctly classified as *ed: ',num2str(starred)])
disp(['correctly classified as un*ed: ',num2str(unstarred)])
disp(['                  total score: ',num2str((starred+unstarred)/20),'\%'])

3

CJam,32个字节,总得分0.5605(56%)。

正确识别428个已加星标的邮件和693个未加星标的邮件。总分是(360+730)/2000=0.545

l_el"sta"/,1>\,)4%!|

不期望赢,我会看看它的表现。上面是单个消息的代码,要与多个消息一起运行,请使用此修改后的版本,该函数返回加星标的消息的数量:

1000{l_el"star"/,1>\,)6%!|}fA]:+

只需将STDIN作为任一文件的原始文本进行测试即可。如果消息包含“ star”或,则返回true length + 1 mod 4 = 0


2
那么...如果四分之二比消息的长度多一分,那么它就有可能被加注星标吗?
科纳·奥布莱恩

2
@CᴏɴᴏʀO'Bʀɪᴇɴ是的,但它的得分很高
GamrCorps

3

JavaScript ES6,0.615 = 61.5%

342正确地标识为已加星标,888正确地标识为未加星标, (342+888)/2000 = 0.615

x=>-~x.search(/(bo|le)x|sta|ಠ|ツ/i)

这个这个上像这样测试:

r=document.body.innerHTML.replace(/<\/*pre>/g,"").split`
`.filter(x=>-~x.search`(bo|le)x|sta|ಠ|ツ`).length

我仍然可以让你,我的漂亮!


1
我现在有你;)
ETHproductions 2016年

@ETHproductions GG。我将寻找一些更常见的模式。
Conor O'Brien

3

视网膜,46字节,68.55

^.*([zj_C;&¡-ff]|sta|san|soc|bo|eo|xk|l.x|<.>)

679星:692星

切换到Retina以获得更多正则表达式。。。仍然没有完成。


哦,是的,忘记了这一点。我会解决的。
Mama Fun Roll

1

C#6.0(.NET Framework 4.6),50字节,63,60%

bool s(string i)=>Regex.IsMatch(i,"ol|tar|l.x|ಠ");

我用于测试目的的程序:

void Main()
{
    var starred = @"C:\starred.txt";
    var unstarred = @"C:\unstarred.txt";

    var linesStarred = File.ReadAllLines(starred);
    var linesUnstarred = File.ReadAllLines(unstarred);

    var cls = linesStarred.Count();
    var clsc = 0;

    foreach (var line in linesStarred)
    {
        if ( s(line) ) clsc++;
    }

    var clu = linesUnstarred.Count();
    var cluc = 0;

    foreach (var line in linesUnstarred)
    {
        if (!s(line)) cluc++;
    }

    $"Starred {clsc}/{cls} correct ({(clsc/cls*100):0.00}%)".Dump();
    $"Unstarred {cluc}/{clu} correct ({(cluc /clu*100):0.00}%)".Dump();
    $"{(((clsc+cluc)/(decimal)(cls+clu))*100):0.00}".Dump();
}

bool s(string i)=>Regex.IsMatch(i,"ol|tar|l.x|ಠ");
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.