猜语言


23

介绍

这个站点正在迅速建立庞大的代码片段数据集,所以让我们来做点什么吧!

这是一个数据文件。它包含用于113种语言的9,066个唯一的语言+代码段对,所有这些对均来自本网站。格式以制表符分隔(语言TAB片段),摘要中的所有换行符均替换为<LF>,所有制表符均替换为4个空格。每种语言至少有5个摘要。

[更新:我对数据文件做了微小的更改,以合并以前错过的一些Python和RegExp版本-上面的链接已更新]

挑战

编写一个带有代码段并输出其编写语言的程序或函数(有关详细信息,请参见下文)。源+您需要的任何数据的总大小必须为300字节或更小,并且在给定其自己的源代码时,程序必须输出正确的语言。最高的准确性(上述数据集上最正确的答案)获胜。

规则

  • 源代码,资源和任何必需的编译/运行时标志的总大小不得超过300个字节。
  • 您的答案将根据上面的数据集进行测试;系统会根据数据集将“摘要”值之一作为输入,并将其输出与“正确”输出进​​行比较。将对数据集中的所有条目重复此操作,正确答案的最终数量是您的分数。
  • 您可以选择输入编码-我假设使用UTF-8,因此,如果您需要其他编码,请在答案中指定它。
  • 您不需要将<LF>换行符用于换行符;如果您的条目希望接收换行符作为文字换行符(字符10),请在您的答案中指定它。
  • 您的条目必须输出认为输入代码段所用的语言。为避免压缩大量语言字符串,我将允许映射(如果您要为“ Java”输出3,就可以了)。只需记下答案中的映射即可。
  • 每种语言只能有1个输出映射(即,如果3表示“ Java”,则也不能有4表示“ Java”)。
  • 当给出其自己的源代码时,您的程序必须产生正确的答案(必须输出其编写语言)。
  • 您不需要支持数据集中的所有语言,并且可以根据需要支持其他语言(例如,如果您输入的内容不是数据集中的一种语言)。
  • 您的程序必须是确定性的(两次提供相同的输入必须产生相同的输出)。

打破领带

  • 将通过减少数据集直到赢得一项来决定联系。通过删除最流行语言的所有代码片段(例如,由于稀有语言的准确性而导致的联系中断),将减少数据集。例如,如果A和B在整个数据集中的得分为70%,则所有Python代码段都将被删除。如果A和B现在都获得60%的分数,则将删除CJam。如果A现在得分50%,而B得分55%,则B是赢家。
  • 如果达到100%的准确性,则将使用包含相同语言的更多样本的第二个(盲)数据集来确定联系。

例子1

Python脚本:

print("python")

如果提供了自己的源代码,此脚本会成功生成“ python”,因此它是有效的。在数据集上,它的得分为1008/9066 = 11.1%

例子2

JavaScript函数:

function f(s){return /function/.test(s)?1:2}

使用映射1→javascript,2→python。再次,它成功为其自己的源生成了1(“ javascript”),并且在数据集上的得分为1092/9066 = 12.0%


数据来自哪里?

我创建了SEDE查询,以从此站点的[code-golf]挑战中抽取样本。从得到的10,000个答案中,我使用了一个被黑的python脚本来查找每个脚本的代码和语言名称,然后用少于5个示例过滤掉任何语言。数据不是100%干净的(我知道它提取了一些非代码片段),但应该足够好。


受到今年早些时候的挑战的启发:谁这么说?2016年总统选举

还与什么是语言有关?


3
在300字节中似乎很难做到。也许分配更多的字节?
Rohan Jhunjhunwala

1
@RohanJhunjhunwala是的,我想这将是一个很大的挑战!我并不期望任何人都能获得100%的准确性;挑战是要变得更高。在“谁说的?”中 我所面临的挑战,我们的准确性都达到了30%的峰值。我试图设置字节数限制,以便在此处可以达到50–70%。希望我的平衡正确。当然,如果您找到了一个使用更多字节的出色解决方案,请发布它!它只是不会竞争(您可以将其缩减为竞争版本)。
戴夫

您是否已从数据集中删除了多面体,还是只是“陷阱”?
Geobits's

9
很难区分golflangs ...
busukxuan

2
有趣的事实:20种最常用的语言(至少在您的数据集中)占数据集的81%,而10种最常用的语言占61%。即使仅检测Javascript,Pyth,CJam和Python之间的差异也足以获得35%的收益。
helloworld922

Answers:


17

C,297字节,匹配43.194351%(v2)

这是我参加的第一个非高尔夫挑战赛。令人惊讶的是,高尔夫语言实际上相当容易分离,每种语言的匹配精度约为60%。

该代码要求输入为UTF-8字符串,结果基于提供的数据集的版本2。不需要<LF>用实际的换行符替换此代码。

#define S(x)!!strstr(p,#x)
f(char*p){return S(#d)?:S(voi)?0:S(mai)|S(utc)?:S(mbd)|S(impor)|S(input)|S(def)|S(rang)?2:S(log)|S(fun)|S(=>)|S(lert)?3:S(<?)?4:S(echo)|S(sed)?5:S(+++)?6:S(<-)?7:S($_)|S(say)?8:S(\342)|S(\303)?9:S(->)|S(map)?10:S(@#)|S(]])|S([#)?11:S(V)|S(Q)?12:S(Z)|S(Y)?13:S(.)?14:15;}

映射表:

 0. java
 1. c
 2. python
 3. javascript
 4. php
 5. bash
 6. brainf*
 7. haskell
 8. perl
 9. apl
10. ruby
11. wolfram
12. pyth
13. matl
14. golfscript
15. cjam

百分比是根据我的点击次数/总计算得出的:3916次点击/ 9066总。


有了一个良好的开端;那很快!至于“我的测试代码和文本编辑器出于某些原因看到9068条目而不是9065条目”-您是否跳过了标题和末尾的空白行?那将占额外的2行。
戴夫

抱歉; 这没有通过规则7(必须为自己的源代码输出正确的答案):现在它说0,这是Python(我想重新排序检查以解决该问题不会花费太多的工作)
戴夫

您可能会失去后面的空间,define S(x)而无论那里有1 ?1
feersum '16

谢谢!我不知道这个?1窍门,而忘记了另一个。;-)
owacoder

哇,情况一直在悄然改善!验证了最新的43.19%:)
戴夫

2

Python 3中,271个 278字节,25.049636%匹配(V2,未经验证的)

def f(c):
 try:compile(c,'','exec');return 5
 except:
  for j in range(9):
   if any(l in c for l in [['echo'],['require'],['Main','string'],['document','alert','var ','function'],['String'],['def ','lambda','print '],['main','int','char'],['+++','<<<'],[]][j]):break
 return j

地图:

0 = bash
1 = ruby
2 = c#
3 = javascript
4 = java
5 = python
6 = c
7 = brainf*
8 = cjam

打高尔夫球好得多(可能仍然不是很好),最后突破了25%的障碍!输入已<LF>替换为换行符(\n


我喜欢exec尝试。顺便说一句,您可以要求输入已用<LF>预先替换\n,因此您可以在那里保存一些字节以潜在地添加一些微调。
戴夫

终于经过验证。由于某种原因,我只看到2103(23.19%)-知道为什么会有区别吗?
戴夫

嗯...我不确定。也许与您如何提供输入有关?我decode('utf-8')先将原始输入字节数组转换为原生Python 3 Unicode(utf-16?)字符串,然后再将其提供给函数。
helloworld922

喔好吧。可能是编码问题;我只是依靠fileinput.input()在后台执行的任何操作。我会调查
戴夫
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.