代码高尔夫:决策树

18
在Google Code Jam 2009年的1B轮比赛中,有一个名为"决策树"的问题,它适合采用非常创造性的解决方案。

发布你的最短解决方案;我会定期更新已接受的答案,将其更新为当前最短的条目,但前提是你没有刚刚创建一种新语言来解决这个问题。 :-P

当前排名:


22
虽然http://meta.stackexchange.com/questions/20912/so-weekly-code-golf目前显示对于代码高尔夫有一定的共识,但我不喜欢这里的表述。至少我建议在本地复制规范。 - dmckee --- ex-moderator kitten
1
我同意,我认为你需要在这里重新创建问题,使其类似,但不是与Google Code Jam问题措辞完全相同。 - pdavis
2
对dmckee的回复有点离题;我没有发布本周的代码高尔夫,因为我看到我的最新问题排名不高。我想人们需要在高尔夫之间放松一下 :) - LiraNuna
http://code.google.com/codejam/contest/scoreboard?c=186264 前50名竟然没有来自美国的选手?! - Chris S
有没有一种代码高尔夫比赛,其中Perl没有获胜?应该有更好的方法来决定获胜者,而不是根据字符数。 - Rook
显示剩余3条评论
23个回答

0

Haskell,514字节(我很菜?)。

基于quibble的解决方案

import Control.Monad
import Text.ParserCombinators.Parsec
data F=N|F String(Float,F)(Float,F)
r=return
f=many1 letter>>= \i->w>>d>>= \t->d>>=r.F i t
d=char '('>>w>>many1(oneOf".0123456789")>>= \g->w>>(f<|>r N)>>= \p->char ')'>>w>>r(read g,p)
w=many$oneOf" \n"
g=getLine
l=readLn
m=replicateM
main=l>>= \n->forM_[1..n]$ \t->putStrLn("Case #"++show t++":")>>l>>=(`m`g)>>=(\(Right q)->l>>=(`m`p q)).parse d"".join
z(p,f)=(p*).y f
y N _=1
y(F n t f)x=z(if n`elem`x then t else f)x
p q=fmap(drop 2.words)g>>=print.z q

你确定所有这些前导定义都能让你的代码更短吗?其中一些似乎是不必要的。 - Chris Lutz
你想使用哪些?从导入中,Control.Monad需要用于forM_、replicateM和join,Parsec则需要用于几乎所有其他内容。从顶层来看,它们似乎都可以节省一些字符。 - JB.
你考虑使用 Text.Parsec 吗? - fuz

0

仅 489 字节的 C 代码

代码每行限制在 80 个字符,实际上只有 3 行。

保存在 a.c 文件中,并使用以下命令进行编译:gcc -w a.c -o a

#define S int I,N;scanf("%d\n",&N);for(I=-1;++I<N;)
#define M 1000
char B[M],Z[M],Q[M]={' '},*F[M],*V;float W[M],H;int J,C,L[M],R[M];t(){V=strtok(0
," \n()");}p(){int U=C++;F[U]=0;if(!V)t();sscanf(V,"%f",W+U);t();if(V&&*V>='a')s
trcpy(Q+1,V),V=0,F[U]=strdup(strcat(Q," ")),L[U]=p(),R[U]=p();return U;}main(){S
{printf("Case #%d:\n",I+1);*B=0;{S strcat(B,gets(Z));}V=strtok(B," \n(");C=0,p()
;{S{strcat(gets(B)," ");for(J=0,H=W[0];F[J];J=strstr(B,F[J])?L[J]:R[J],H*=W[J]);
printf("%f\n",H);};}}}

0

在280字节内的R

注意:在标准的R发行版(截至v.2.9.2),此程序无法通过大输入,并且仅在第28个案例(嵌套到99级)失败,生成“contextstack溢出”。要修复此问题,请修改src/main/gram.c中的行:

#define CONTEXTSTACK_SIZE 50

将50替换为类似500的内容,然后重新编译。Et voilà!

n=0
g=gsub
eval(parse(text=g('[^
]* [0-9]+( [^
]*|
)','f=c(\\1)
cat(eval(d),"
")
',g('
\\(','
cat("Case #",n<-n+1,":
",sep="")
d=expression(',g('" "','","',g(')\\s*\\(',',',g(' *("[a-z]+")\\s*\\(','*ifelse(\\1%in%f,',g('([a-z]+)','"\\1"',paste(readLines('A'),collapse='
')))))))))

使用方法(需要将输入文件重命名):cp input.in A; R -q --slave -f thisfile.R >output.out

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接