代码高尔夫:蜘蛛网

挑战

按字符计数的最短代码输出一个蜘蛛网,其中环等于用户的input。

蜘蛛网是通过重build中心环开始的:

\_|_/ _/ \_ \___/ / | \ 

然后join等于用户input的金额。 戒指是由\ / |制作的“蜘蛛圈”的另一个级别 和_ ,并包装中心圈。

input总是保证是一个单一的正整数。

testing用例

 Input 1 Output \__|__/ /\_|_/\ _/_/ \_\_ \ \___/ / \/_|_\/ / | \ 

 Input 4 Output \_____|_____/ /\____|____/\ / /\___|___/\ \ / / /\__|__/\ \ \ / / / /\_|_/\ \ \ \ _/_/_/_/_/ \_\_\_\_\_ \ \ \ \ \___/ / / / / \ \ \ \/_|_\/ / / / \ \ \/__|__\/ / / \ \/___|___\/ / \/____|____\/ / | \ 

 Input: 7 Output: \________|________/ /\_______|_______/\ / /\______|______/\ \ / / /\_____|_____/\ \ \ / / / /\____|____/\ \ \ \ / / / / /\___|___/\ \ \ \ \ / / / / / /\__|__/\ \ \ \ \ \ / / / / / / /\_|_/\ \ \ \ \ \ \ _/_/_/_/_/_/_/_/ \_\_\_\_\_\_\_\_ \ \ \ \ \ \ \ \___/ / / / / / / / \ \ \ \ \ \ \/_|_\/ / / / / / / \ \ \ \ \ \/__|__\/ / / / / / \ \ \ \ \/___|___\/ / / / / \ \ \ \/____|____\/ / / / \ \ \/_____|_____\/ / / \ \/______|______\/ / \/_______|_______\/ / | \ 

代码计数包括input/​​输出(即完整程序)。

Golfscript – 124个字符

所有的空白是显着的! 如果你不小心添加了一个换行符,那么在输出结尾会有一个额外的_

 ~):@,{@\:&-:0' ': *& '/':/+*'\\':~'_': 0*.'|':|\/~ +&*n}% /+@* ~ +@*n ~+@* @/ +*n@,{):& *@&-:( ~+*/[ ](!=&*.|\~/ +(*n}% 

Golfscript – 129个字符

 ~):@,{@\:&-:0' ': *&' /'*'\\':~'_': 0*.'|'\'/'~ +&*n}%'_/'@* '\_'@*n ~+@* @'/ '*n@,{):& *@&-:( ~+*'/'[ ](!=&*.'|'\~'/ '(*n}% 

Golfscript – 133个字符

 ~):@,{@\:&-:0' ': *&' /'*'\\':~'_': 0*.'|'\'/'~ +&*n}%'_/'@*3 *'\_'@*n' \\'@*3 *@'/ '*n@,{):& *@&-:( ~+*'/''_ '1/(!=&*.'|'\~'/ '(*n}% 

Perl,164个字符

195 184 171 167 164

 print@o=((map{$z=_ x($x=1+$N-$_);$"x$x." /"x$_."\\$z|$z/".'\ 'x$_.$/}0..($N=<>)), "_/"x++$N." ".'\_'x$N.$/); y'/\\'\/',@o||y#_# #,$t++||y#_ # _#,print while$_=pop@o 

第一条语句打印出蜘蛛网的上半部分。 第二个声明使用音译操作来创build上半部分的反映。

这下一个重314字(生产代码),但更多的是在本赛季的精神。

  ; " Tr Ic K| |t Re aT ", "H av e A: - )H AL LO W ee N" ," En jo y_ Yo ur _ C&& y"; ## &I (); $N= 1+ <>; $,= $/;@O =(( map $" x($ X=$N-$_). ${ f}x$_.$ B.${U}x$X.$P.${U}x$X.$ F.${b}x$_,0..$N-1),${g}x$N.(${S} x3).${c}x$N);sub I{($F,$B,$U, $P) =qw (/ \\ _ |);; ${ S}= " ";$f=$S.$F;$g=$ U. $F ;$b=$B.$S;$c=$B.${U};}@{ P}= @{ O}; while($_=pop@{P} ){ @{ P} || y:_: :;$spooky++ || 0| 0 || y@_ @ _@;y:/:8:; ; ; ; ;; y:\\:/:;y:8:\\:; @O = ( @O ,$_);}print@O; q{ Do !Discuss:Rel ig io n,Politi cs ,& &T heG rea tP ump ki n} 

帽子提示http://www.ascii-art.de/ascii/s/spider.txt

我手动构build了蜘蛛形代码,但是请参阅CPAN上的Acme :: AsciiArtinator模块,以获取有关自动化(或至less半自动化)任务的帮助。

Python – 212个字符

 n=input()+1;b,f,p,u,s='\/|_ ' a=[s*(ni)+' /'*i+b+u*(ni)+p+u*(ni)+f+'\ '*i+s*(ni)for i in range(n)] print"\n".join(a+['_/'*n+s*3+'\_'*n,' \\'*n+u*3+'/ '*n]+[x[::-1]for x in a[:0:-1]]+[a[0][::-1].replace(u,s)]) 

Perl:161个字符

请注意,此代码包含源代码中的起始网页。 (最后加倍的反斜杠是一个耻辱,早期的版本没有这个)。

 $_=' \_|_/ _/ \_ \___/ /_|_\\'; for$x(1..<>){ s|(.\S).*([/\\].)|$1$&$2|g; s|\\(.*)/| \\_$1_/$` /$&\\ |; s|(\s+)\K/(.*).$| \\$&/$1 /_$2_\\| } s|_(?=.*$)| |g; print 

$_的空格是显着的(当然),但其余的都不是。 如果你有一个小的build议,改善这一点,请随时编辑我的代码。 例如, Kinopiko已经很好地削减了6个字符!

根据你如何计算命令行开关,这可能会更短(如果我可以正确计数,通常Perl高尔夫规则是154):

 #!perl -ap $_=' \_|_/ _/ \_ \___/ /_|_\\'; s|(.\S).*([/\\].)|$1$&$2|g, s|\S(.*).| \\_$1_/$` /$&\\ |, s|(\s+)\K/(.*).$| \\$&/$1 /_$2_\\|while$F[0]--; s|_(?=.*$)| |g 

Vb.net,Windows控制台,推断,严格,显式ON。

微软的话是说442个字符没有空间

它可能会减less更多,但这是我最后的更新( 尝试#2

 Module z Sub Main() Dim i = CInt(Console.ReadLine), j = i + 1, h = j * 2 + 1, w = h * 2, z = "_", b = " " For y = 0 To h For x = 0 To w Dim l = (x + y Mod 2 + i Mod 2) Mod 2, u = j + y, e = j - y, k = h + e, o = x = h Or x = h - 1 Console.Write(If(x = h, If(y = j, b, If(y = j + 1, z, "|")), "") & If(x = w, vbLf, If(y = j, If(x Mod 2 = 0 = (x < h), If(o, b, z), If(x < h, "/", "\")), If(x < k And x > u Or (x < u And x > k Or o) And y < h, z, If(x = k Or (x < u And y < j And x > e Or x > u And y > j And x < w + e) And l = 0, "/", If(x = u Or (x > k And y < j And x < h + u Or x < k And y > j And x > y - j - 1) And l = 1, "\", b)))))) Next Next End Sub End Module 

Python:240个字符

这里没什么棘手的。 只是逐行打印 – 298 280 271 266 265 261 260 254 240个字符(忽略最后2个换行符)

 u,b,f,s,a='_\/ |' m=input()+1 print'\n'.join([(mx)*s+x*' /'+b+(mx)*u+a+(mx)*u+f+x*'\ 'for x in range(0,m)]+['_/'*m+s*3+'\_'*m+'\n'+(s+b)*m+u*3+'/ '*m]+[x*s+(mx)* ' \\'+f+x*u+a+x*u+b+(mx)*'/ 'for x in range(1,m)] + [s*m+f+s*m+a+s*m+b]) 

卢阿,290

 rep(n + 1).. a ..(“\\”)n = ... s =stringr = s.reverse g = s.gsub a =“\\ | /”j =(“/” ):rep(n + 1)k = jo = k
对于i = 1,n + 1 = 1,n = 1 * n + 4 + 7。 %2_ | _%3%4“)o = k..o end
 (1)()()()()()()()() ),j,g(j,“”,“_”)),(“。”):rep(l),“%1 \ n”),a,“”),r(a) )))

Ruby1.9 – 181个字符

 n=gets.to_i+1;s=' ' a=0.upto(n-1).map{|i|s*(j=ni)+' /'*i+?\\+?_*j+'|'+?_*j+?/+'\ '*i+s*j} d=a.reverse.map{|x|x.reverse};d[-1].tr!?_,s puts a,'_/'*n+s*3+'\_'*n,' \\'*n+?_*3+'/ '*n,d 

Ruby1.8 – 185个字符
JRL的一些改进

 n=gets.to_i+1;s=' ' u='_';a=0.upto(n-1).map{|i|s*(j=ni)+' /'*i+'\\'+u*j+'|'+u*j+'/'+'\ '*i+s*j} d=a.reverse.map{|x|x.reverse} d[-1].tr!u,s;puts a,'_/'*n+s*3+'\_'*n,' \\'*n+u*3+'/ '*n,d 

Ruby – 207个字符
Ruby似乎有一些关于“\”的特殊规则

 n=eval(gets)+1 b,f,p,u,s='\/|_ '.split"" a=0.upto(n-1).map{|i|s*(j=ni)+' /'*i+b+u*j+"|"+u*j+f+"\\ "*i+s*j} puts a,'_/'*n+s*3+'\_'*n,' \\'*n+u*3+'/ '*n,a[1..-1].reverse.map{ |x|x.reverse},a[0].reverse.tr(u,s) 

Ruby 1.8,179

ruby -n运行

 n=$_.to_i+1 u,s,c=%w{_ \ \ \\} z=(1..n).map{|i|k=ni s*i+c*k+'/'+u*i+'|'+u*i+"\\"+'/ '*k+s*i} y=z.reverse.map{|a|a.reverse} z[-1].tr!u,s puts y,'_/'*n+s*3+'\_'*n,c*n+u*3+'/ '*n,z 

在下面的第一个尝试中,似乎是一个好主意,只生成一个象限(我select左下angular),然后镜像两次,以获得整个networking。 但是gnibbler得到了更好的结果,产生了两个象限(上半部分),然后产生而不是修补内部区域。 所以我修改了我的初始生成其他的下象限,镜子只有一次,也离开最里面的一排出镜子,这种收敛与其他条目。

Ruby,241

 n=$_.to_i+1 m=2*n+1 u,s,b,f=%w{_ \ \\ /} z=(0..n).map{|i|s*i+(s+b)*(ni)+(i==0?u:f)+u*i} q=z.reverse.map{|a|a.tr f+b,b+b+f} q[n].gsub!' ','_' q[n][m-1]=s z=(q+z).map{|a|a+'|'+a.reverse.tr(f+b,b+b+f)} z[n][m]=z[n+1][m]=s z[m].gsub!u,s puts z 

C,573个字符

显然它甚至没有在字符数方面的跑步。 573号码只是我的Windows机器上的文件大小,所以可能会计数几个CTRL-M的。 另一方面,也许有573个是在计算它,因为我为了节省空间而抛弃了所有#include的编译器的愤怒,所以警告会被诅咒!

但是,嘿,这是我第一次尝试其中的一种,尝试用更紧凑的方式重新expression它无疑是一个好习惯。

 #define B puts(""); #define K '\\'+'/' #define F '_'+' ' #define P(s) putchar(s); #define I int c(I s,I f){if(s){P(f)c(s-1,f);P(f)}else P('|')} w(I lw,I s,I k,I f){if(s){P(' ')P(k)w(lw,s-1,k,f);P(Kk)P(' ')}else{P(Kk)c(1+lw,f);P(k)}} h(I g,I s,I k,I f){I i;for(i=-1;i<g;++i)P(' ')w(g,s,k,f);} t(I g,I s){if(s)t(g+1,s-1);h(g,s,'/','_');B} b(I g,I s){h(g,s,'\\',s?'_':' ');B;if(s)b(g+1,s-1);} m(I s,I k,I f){if(s){P(f)P(k)m(s-1,k,f);P(Kk)P(f)}else{P(Ff)P(Ff)P(Ff)}} main(I ac,char*av[]){I s;s=atoi(av[1]);t(0,s);m(1+s,'/','_');B;m(1+s,'\\',' ');B;b(0,s);} 

Python, 340 – 309 – 269 – 250个字符

我想还有改进的空间。

 s=input()+1 f,b="/ ","\\" r=range(s) for i in r:w="_"*(si);print" "*(s+(i>=1)-i)+(f*i)[:-1]+b+w+"|"+w+"/"+"\ "*i print"_/"*s+" "*3+"\_"*s+"\n"+" \\"*s+"_"*3+f*s for i in r[::-1]:u="_ "[i<1]*(si);print" "*(s-i+(i>=1))+("\ "*i)[:-1]+"/"+u+"|"+u+b+f*i 

Python(替代版本), 250 – 246个字符

 s=input()+1;r=range(s);c="/","\\";y="/ ","\\ " def o(i,r):u="_ "[i<1 and r]*(si);print" "*(s+(i>=1)-i)+(y[r]*i)[:-1]+c[r<1]+u+"|"+u+c[r]+(y[r<1]*i)[:-1] for i in r:o(i,0) print"_/"*s+" "*3+"\_"*s+"\n"+" \\"*s+"_"*3+"/ "*s for i in r[::-1]:o(i,1) 

Python和Ruby只是偶*

我宁愿继续上面简单提到的Python和Ruby的评论线程,但我需要格式化来做到这一点。 Smashery当然是优雅的,但不必担心:事实certificate,Python和Ruby在一个度量方面是相当接近的比赛。 我回过头去把Python和Ruby进行比较,我已经input了八个代码高尔夫球。

    挑战最佳Python最佳Ruby

    浪161 99
     PEMDAS没有Python入口(默认胜利?)
    七段160 175
    钞票83(打败Perl!)87  
    蜂箱144 164
     RPN(no eval)111(157)80(107)
    多维数据集249 233
    网212 181

    胜利3 4(5?)

所以这个问题肯定还没有解决,最近当双方都开始进入gnibbler的时候,这个问题变得更加有趣了。 🙂


* 我只计算function齐全的条目。

dc – 262

dc (OpenBSD)中的“简单”解决scheme。 不是竞争者,但总是很有趣。 换行符为“可读性”

 [lcP1-d0<A]sA?sN[lK32sclAxRlNlK-l1scd0!=ARl3PlKl0sclAxRl9PlKlAxRl4PlNlK- l2scd0!=AAPR]sW95s0124s9[ /]s1[\\ ]s292s347s4lN[dsKlWx1-d0<L]dsLx [\\_][ ][_/][lN[rdPr1-d0<L]dsLxRRPlNlLxRR]dsBxAP[/ ][_ _][ \\]lBxAP[ \\]s1 [/ ]s247s392s41[dsKlWx1+dlN>L]dsLx32s032s9lNsKlWx 

样本输出

 $ dc web.dc 3 \___|___/ /\__|__/\ / /\_|_/\ \ _/_/_/ \_\_\_ \ \ \_ _/ / / \ \/_|_\/ / \/__|__\/ / \ 

Perl 264字符

通过内联子程序缩短。

 perl -E'$"="";($i=<>)++;@r=map{$p=$i-$_;@d=(" "x$_,(" ","\\")x$p,"/","_"x$_);($d="@d")=~y:\\/:/\\:;@d=reverse@d;$d.="|@d"}1..$i;say for reverse@r;$_=$r[0];y: _|:_ :;s:.(.*)\\.*/(.*).:$1_/ \\_$2:;say;y: _\\/:_ /\\:;say;$r[-1]=~y:_: :;say for grep{y:\\/:/\\:}@r;' 

扩大以提高可读性。

 perl -E' $"=""; ($i=<>)++; @r=map{ $p=$i-$_; @d=( " "x$_, (" ","\\")x$p, "/", "_"x$_ ); ($d="@d")=~y:\\/:/\\:; @d=reverse@d; $d.="|@d" }1..$i; say for reverse@r; $_=$r[0]; y: _|:_ :; s:.(.*)\\.*/(.*).:$1_/ \\_$2:; say; y: _\\/:_ /\\:; say; $r[-1]=~y:_: :; say for grep{y:\\/:/\\:}@r; ' 

这是我最小化之前的代码:

 #! /opt/perl/bin/perl use 5.10.1; ($i=<>)++; $"=""; #" # This is to remove the extra spaces for "@d" sub d(){ $p=$i-$_; " "x$_,(" ","\\")x$p,"/","_"x$_ } sub D(){ @d=d; ($d="@d")=~y:\\/:/\\:; # swap '\' for '/' @d=reverse@d; $d.="|@d" } @r = map{D}1..$i; say for reverse@r; # print preceding lines # this section prints the middle two lines $_=$r[0]; y: _|:_ :; s:.(.*)\\.*/(.*).:$1_/ \\_$2:; say; y: _\\/:_ /\\:; say; $r[-1]=~y:_: :; # remove '_' from last line say for grep{y:\\/:/\\:}@r; # print following lines 
 (&)=(++) --9 f 0=[" \\_|_/","_/ \\_"," \\___/"," / | \\"] --52 f(n+1)=[s&h&u&"|"&u&g]&w(fn)&[s&g&s&"|"&s&h]where[a,b,c,d,e]=" _/\\|";[g,h]=["/","\\"];y=n+2;[u,s]=[ryb,rya];pfsnx=let(a,b)=span(/=s)x in a&f b;i=dropWhile(==a);w[]=[];w[x]=[s&h&i(p(map(\x->if x==a then b else x))cdx)&g];w(l:e)|n==y*2-1=x%h:z|n>y=x&" "%" \\":z|n==y="_/"%"\\_":z|n<y=r(yn)a&"\\ "%" /":z where n=length e;z=we;x=r(n+1-y)a&g;(%)=(&).(&i l) --367 r=replicate --12 main=interact$unlines.f.read --29 

哈斯克尔入场权重为469个字符。 我相信有很大的改进空间。

祝你好运,试图阅读它:)

这里是一个更可读的版本。 虽然自这个版本以来有了一些变化

 spider 0=[" \\_|_/","_/ \\_"," \\___/"," / | \\"] spider n=(s++"\\"++u++"|"++u++"/"):wm(spider(n-1))++[s++"/"++s++"|"++s++"\\"] where [a,b,c,d,e]=" _/\\|" [m,y]=[y*2,n+1] x=ry [u,s]=[xb,xa] tab=map(\x->if x==a then b else x) pfsnx=let(a,b)=span(/=s)x;(c,d)=span(/=n)b in a++f c++d i=dropWhile(==a) w _[]=[] w _[x]=[s++"\\"++i(p(tab)cdx)++"/"] w(a+1)(l:e) |a==m-1=wrapline xl"\\":z |a>y=wrapline(x++" ")l" \\":z |a==y=wrapline"_/"l"\\_":z |a<y=wrapline(r(ya)' '++"\\ ")l" /":z where z=wae x=r(a+1-y)' '++"/" wrapline bla=b++i l++a r=replicate main=interact$unlines.spider.read