说真的,GolfScript,CJam还是Pyth?


56

前段时间,有人问了以下问题:GolfScript,CJam或Pyth? 仅基于标题,我认为这将是一个非常好的挑战,但不幸的是,事实证明这是一个要求提示的问题。这是我想阅读的挑战:

谁说高尔夫语言在现实世界中没有使用?众所周知,独立于所使用的编程语言,每行代码的错误比率是相同的,因此,存在明显的机会来减少使用这些语言的调试和维护成本。最终,您的公司看到了曙光,并决定使用Golfscript,CJam和Pyth来开发其产品。

不幸的是,几个月后,您的硬盘上到处都是代码片断,甚至您都不知道用哪种语言编写了哪些代码(您甚至怀疑某些使用Perl的程序员)。

您必须编写一个工具来检测编写程序所用的语言是CJam,Golfscript或Pyth。情况很危急,您可以使用所需的任何语言,但请保持简短(数据存储非常昂贵:我们使用的字节越多,成本就越高)。

一般

  • 最短代码赢
  • 标准漏洞等
  • 不要使用在线口译员
  • 您可以编写函数或程序
  • 您可以使用eval来检测自己的语言

输入项

  • 您的输入来自标准输入流或字符串
  • 输入仅包含ASCII可打印字符和换行符
  • 输入的大小最大为256个字节

输出量

  • 输出被打印到输出流或作为字符串/符号序列返回
  • 如果输入的是无疑是一个有效的X程序,打印或返回XX ∈{CJam,Pyth,Golfscript}

    备注:“毫无疑问”并不意味着您可以使用始终无法检测到任何语言的愚蠢分析器进行回答。对于Pyth,我希望可以识别简单程序(但不能进行硬编码)。这同样适用于CJam备忘单实施例)和Golfscript实施例)。前面的链接指向每种语言的规范。如果使用模糊/贝叶斯方法,则“毫无疑问”意味着具有很高的置信度(例如,您的分类得分为99%)。 请参阅下面的实际测试套件。

  • 如果输入使用多种语言有效,则应打印/返回每种检测到的语言。打印时,多个输出之间必须有分隔符(例如,空格,换行符,逗号...)。

  • 语言尝试的顺序无关紧要
  • 我不关心大小写(CJam,cjam,CJAM,SPAM)[1]
  • 如果未检测到以上任何一种语言,则打印Probably Perl。多亏了mbomb007的注释,在上述情况下,您还可以输出“ Seriously”,罚金为4个字节(两个字符串之间的差)。

[1]请注意,垃圾邮件无效

例子

  • 输入项

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • 输出(多个返回值的示例)

    ["Golfscript", "Cjam"]
    
  • 输入项

    3
    
  • 输出(标准输出示例)

    golfscript
    cjam
    pyth
    
  • 输入项

    if {} aazd
    
  • 输出量

    Probably Perl
    

在最后一种情况下,输入程序 所有 三个在线解释器中产生错误。

得分,获胜标准

最短的代码获胜。如果输出“ Seriously”,则添加4个字节。然后,应用奖金。

测试失败

以下是不能被识别为以上三种语言中的任何一种的摘录。

一线(即每行一个条目)
$^X=~/([a-z]+)[^\/]+$/;print$1,$/
<>;map($s-=(-1)**$_/(2*$_-1),1..$_),$s=!print$s,$/for<>
((THIS IS LISP HAIKU) (TRULY THIS IS LISP HAIKU) (THIS IS LISP HAIKU))
(format t"~@(~{~R~^, ~}~).~%~:*~@(~{~:R~^, ~}~)."(loop for i to 99 collect(1+ i)))
print sum(ord(c) for c in 'Happy new year to you!')
脑干
>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++++++++++++++++++++++++++++++++++++++++++++.
-----------------.
++++++++.
+++++.
--------.
+++++++++++++++.
------------------.
++++++++.
佩尔
@list=( "aaaa", 
        "aaaaaaaa", 
        "aaaaaaaaaaaaaaa", 
        "aaaaaaaaaaaaaaaa", 
        "aaaaaaaaaaaaaaaaaaaaaaa", 
        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

while (@list) {
    for($i=0;$i<6;$i++){
        print length($list[$i])." ";
    }
    print "\n";
}
#ifndef __linux
#include "x.h"
#define X/*\
a=1 set -e
+++++++++++++++++++++_+++++++++++++....Hello World!?:Q:
#endif
    echo "Hello, World!"
    int m(){}

基本测试套件

这些是必须通过的测试。初级讲座是单行为你的程序必须检测它正在编写语言每种语言(我没有检查其中哪些是多语种)。

腐霉菌

*2Q
FNrZTN
FNrZhTN
FNUhTN
VhTN
FNr1hQN
=N5N
K5K
K1FNr1hQ=K*KN
K1FNr1hQ=K*KNK
K1FNr1hQ=K*KN;K
DhZK*3ZRK
L?b*bytb1yQ
A(Z1)VQHA(H+HG

高尔夫脚本

;'2706 410'~{.@\%.}do;
;''6666,-2%{2+.2/@*\/10.3??2*+}*`50<~\;
'Hello, world!'
1 2 [\]

贾姆

"Hello, world"
{`"_~"}_~
"`_~"`_~
T1{_2$+}A*]`
{__'`>\'x>26*2-*-}/
Y38#
N/s:X,8-,{X>9<__{'a<},,\4%{'Z>},,*I={4=}{;}?}/

银奖:字节数* 0.6

之前的所有测试必须通过,而以下几条测试必须通过。所有这些摘录均摘自CodeGolf的实际答案。

腐霉菌

VzJ:zZhZpkJ~Zhy}rJ0-G"aeoui
Vzjdm?@zd}N,dt-lzd\ Uz
jd.iSQs*RtQ,\?":0
rsXOtQmO*-GJ"aeiou"J/Q2*%Q2O"hy"4
VhQIq`N_`NN
s["$$\\varphi=1+"*Q"\cfrac1{1+"\\<\dQ"dots"*Q\}"$$
@c"weak trick fair"d-!JlfhT-M.:us_cG.u+NYtKrH7-52hK.zU52 2>J26

高尔夫脚本

);:|;{0):0;|$:§-1%" - "§" = ""0"4$~§~-+-4>:|n|6174`=!}do"Iterations: "0"."
'-+,/'{)))))}%
4:echo(2+2);
#undef X;A!"$%&'()*+-[,.]/0123456789:<=>?@BCDEFGHIJKLMNOPQRSTUVWYZ\^_`abcghijklmopqrstvwxyz{|}~
{`),32>^.}.~
"126,32>''+".~\-'.~\-"'-
"),@`^^32>#.~".~
...[[]]{{}}&%%++++5i
  *++..0011125::::;;;?bbbbcccc{}
"This program wasn't written in "o"GolfScript"", it was built for ""CJam"oo"!"

贾姆

"Q"c("ASSW"1$("aRD"(((T1
%\@_@){;_0}*__*)\15
"This program wasn't written in "o"GolfScript"", it was built for ""CJam"oo"!"
"P2"1e3K51_,1>K*$K*~]N*
li__,\mf:i2m1+:*/fb:+
ri:B__(^2/):G/,{_BBG/@-(#G@*G(B2/*+*}/]:+
{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~
[S'-26*N]:Z[S'|:PS24*PN]:RR'(PS5*qi:XD=X0<-X2%2*+:Y[" ^ "_" > ""(O)"" - "__]=S8*Y[" ^ ""   "" < ""(O)"" - "__]=S5*P')NRRXD=[SPS7*'oA*S7*PN]:QR?Y[[SPS5*'oSC*'oS5*PN]:T_R[SPS7*'oS8*'oS7*PN]RRR]=QY2=TR?RRZ
li4H#+2bW%32<2b
q~:R100:H*\d:T/i){R-H*HT-/m]}6*_H)<*
"JamesBdo,"YZ+/)BA*c+Y*Y%:BS@SB)))[JW:Z____)ci+*]U*

金牌奖金:前项得分* 0.8

腐霉菌

相比
jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb
雪人
M@GCHgc"  ___

  ___
   _"bhzgc" (_*_)
 _===_
 .....
  /_\\"bhzs[g"  \ "@z4\(g"-.oO"@z2g" ,._"@z1g"-.oO"@z3\)g"  / "@z5)s[g" < /"@z4\(gc"   
 : 
] [
> <"b@z6\)g" > \\"@z5)++" ("gc"   
 : 
\" \"
___"bez\)

贾姆

rri:Hri:Vri:Q[q~]3/_Qa3*a+_|$W%:Pf{\a#}:AH/:B0ff*
P,,[AHAW%HBz:+_W%V\V]2/
ff{~@@f=/::|1#}0Ua4*t:R;
P0f<
V{H{BI=J=_2$=
0R{"I>! I+V<J>! J+H<"4/+4/z{~~}%:&1$*\)}%);2$-|t
}fJ}fI
[P,{_La#\1$0t1$f-}*;;]
{:TR=2/~\~V\-,>\f{\_3$=@~H\-,>{Tt}/t}~}/
:~Pf=:~
~]S*N
雪人
q:Q;SS"
 _===_,___
 ....., _
  /_\,___
 (_*_)"',/0{Q=~(=}:G~N" \ "4G'(".oO-"_2G",._ "1G@3G')" / "5GN"< / "4G'(" : ] [> <   "3/6G')"> \ "5GNS'(" : \" \"___   "3/7G')

高尔夫脚本

洛普伊普森
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet est ut sem commodo scelerisque. Sed ut ultricies enim. Nam eget lectus suscipit, gravida turpis a, volutpat tellus. Cras efficitur luctus neque, at semper massa condimentum at posuere.
数码时钟
:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
生日快乐
4,{"Happy Birthday "["To You""Dear GolfScript"]@2==n}%
法雷序列
~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'

54
从标题开始,我希望其中包括一种名为“ Seriously”的新的深奥语言。
mbomb007'9

17
@ mbomb007认真地讲:一种语言,它运行在Golfscript中解释为Pyth的源结果,然后将换行符分隔的值压入CJam堆栈,最后从那里输出到STDOUT。像perl一样容易使用两次:^)
FryAmTheEggman

3
@ mbomb007我感到您很失望。我可以建议问你自己的问题吗?“不久前,有人问了以下问题……”
coredump

31
我的朋友们,这就是发明shebangs的原因。
primo

6
对于第一个有资格获得金牌奖励并根据模式匹配来验证输入的解决方案,我将给予150 rep赏金,而不是我通过解释器运行程序的简单解决方案。
Mego

Answers:


2

红宝石(135 + 4)* 0.6 * 0.8 = 66.72

它可以在Windows上运行,但我太累了,无法通过在Unix上运行来缩短它。

(a=[%w(javaw -jar cjam),%w(python pyth),%w(rubyw golfscript)].map{|c|c[-1]if system(*c,?f,'> NUL','2>','NUL')}-[nil])==[]?'Seriously':a

我做了这些事情,但是不确定是否允许:

  • 重命名cjam-[version].jarcjampyth.pypythgolfscript.rbgolfscript
  • 从文件读取f而不是获取输入。(从头IO.write(?f,gets);开始解决,新的长度为(153 + 4)* 0.6 * 0.8 = 75.36)

不幸的是,我无法对其进行测试(Windows和缺乏时间的结合)。看起来不错,您的分数也较低,所以我在打勾号。
coredump

39

的Python 2,332 * 0.6 * 0.8 = 159.36

import os
from subprocess import*
from tempfile import*
f,n,a=NamedTemporaryFile(delete=0),open(os.devnull,'w'),''
f.write(os.read(0,256))
f.close()
for l in["CJam","java","-jar","cjam.jar"],["Pyth","./pyth.py"],["Golfscript","./golfscript.rb"]:a+=(l[0]+' ')*(call(args=l[1:]+[f.name],stdout=n,stderr=n)>0)
print a or'Probably Perl'

据我所知,这是在规则之内的。在当前目录中需要Pyth,CJam和Golfscript解释器(pyth.pycjam.jargolfscript.rb),并安装了Python 3,Java和Ruby。简单测试:尝试运行该程序。如果返回0,我们很好。如果不是,则无效。$TMP由于CJam没有脚本选项,因此创建了一个命名的临时文件(例如,在中创建的文件)来保存程序。该delete=False标志对于防止关闭文件时被删除是必要的(操作系统将为我们处理)。尝试从文件中读取文件之前,必须先将其关闭(尽管手动刷新文件也可以,但这很简单)。stdoutstderr重定向到/dev/null 抑制输出/错误(请注意,这仅适用于* NIX系统)。

额外的乐趣:尝试以所有4种语言运行给定的代码,看看能得到什么:

import sys
from subprocess import*
from tempfile import*
c=["Cjam","java","-jar","cjam.jar"]
p=["Pyth","./pyth.py"]
g=["Golfscript","./golfscript.rb"]
e=["Perl","perl"]
f=NamedTemporaryFile(delete=False)
s=sys.stdin.read()
f.write(s)
f.close()
n=open('/dev/null','w+')
a=''
for l in [c,p,g,e]:
    try:
        print '%s: %s'%(l[0],check_output(args=l[1:]+[f.name],stderr=n))
    except:
        continue
n.close()

11
+1好答案。而且需要6位翻译才能运行,做得很好;-)
coredump

1
bash中,Python 2中,Python 3中,红宝石,爪哇,CJam,Pyth,Golfscript - I计数8.
迈戈

2
那就对了。有了正确的输入文件,它甚至可以擦除您的主目录。无论如何,我不介意这是一种有效的方法。
coredump

只是希望您不会遇到无穷循环或返回非零的程序。
圣保罗Ebermann

@Mego如果程序本身由于某种原因而失败(例如,打开不存在的文件时–或期望参数时,我怀疑对于实际使用的程序可能会更频繁地发生),则它应返回非零值根据那个十年的标准。这并不意味着它不属于该语言。(尽管可能不是所有的测试用例实际上都属于这种类型。)另一种情况可能是等待输入,例如cat程序……也许您至少应该尝试将/ dev / null也重定向到输入?
圣保罗Ebermann
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.