代码高尔夫:沙漏

挑战

按字符计数的最短代码根据用户input输出沙漏。

input由两个数字组成:第一个数字是大于1的整数,表示灯泡的高度,第二个数字是沙漏容量的百分比(0-100)。

沙漏的高度是通过向沙漏灯泡添加更多线条来实现的,所以2号(最小可接受的尺寸)是:

_____ \ / \ / / \ /___\ 

大小3将增加更多的线,使灯泡能够适应更多的“沙”。

沙将使用字符x绘制。 顶部的灯泡将含有N%的“沙子”,而底部的灯泡将含有(100-N)%的沙子,其中N是第二variables。

“容量”是由空间量( )沙漏包含。 如果百分比不准确,则应该向上取整。

沙从外部拉入,在案例百分比结果均匀的情况下给予优先权。

testing用例

 Input: 3 71% Output: _______ \x xx/ \xxx/ \x/ / \ / \ /__xx_\ 

 Input: 5 52% Output: ___________ \ / \xx xx/ \xxxxx/ \xxx/ \x/ / \ / \ / \ / xxx \ /xxxxxxxxx\ 

 Input: 6 75% Output: _____________ \xx/ \xxxxxxxxx/ \xxxxxxx/ \xxxxx/ \xxx/ \x/ / \ / \ / \ / \ / \ /_xxxxxxxxx_\ 

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

Golfscript – 136字符(适合在鸣叫)

确保在input的%之后不要有换行符
例如
$ echo -n 3 71%|./golfscript.rb hourglass.gs

你可以像这样animation沙漏:

$ for((c=100;c>=0;c--));do echo -n "15 $c%"|./golfscript.rb hourglass.gs;echo;sleep 0.1;done;

Golfscript – 136字符
确保你不保存额外的换行符或打印一个额外的数字

 );' ': /(~: ;0=~100.@- .**\/:t;'_':&& *.n ,{:y *.'\\'+{[&'x':x]0t(:t>=}:S~ (y-,{;S\+S+.}%;'/'++\+}%.{&/ *}%\-1%{-1%x/ *&/x*}%) /&[*]++n* 

Golfscript – 144字符

 );”  “:| /(〜:^ *:X
  ; 0 =〜100 @  -  X * \ /
   X'-X ':X *' _':
    @ * +:S; &&& +
     ^ * N ^ {:Y
      | * [92。
       ] + {S
        [)
        \#
       :S;]
      }:S〜^(
     ÿ - ,{; S \ +
    S +}。%; '/' +
   + \ +}%{&/ | *}
  %\  -  1%{ -  1%的x / | *&
 / X *}%)| /&[*] ++ N *

怎么运行的
首先做2n+1的下划线的顶线创build沙漏的上半部分,但是使用'_'字符而不是空格,所以我们会有3 71%的空间。

 \x__xx/ \xxx/ \x/ 

通过用“”replace“_”来完成上半部分,但保存副本以生成下半部分

下半部分是通过倒转整个事物而创build的

  /x\ /xxx\ /xx__x\ 

用“'replace所有'x',然后用'x'replace'_'

  / \ / \ / xx \ 

最后用'_'replace底部的'''

  / \ / \ /__xx_\ 

回旋处,但对我来说,代码变得比试图一次生成两半短

C / C ++,一个令人沮丧的945个字符…

作为参数input:a.out 5 52%

 #include<stdio.h> #include<memory.h> #include<stdlib.h> #define p printf int h,c,*l,i,w,j,*q,k;const char* z;int main(int argc,char**argv) {h=atoi(argv[1]);c=(h*h*atoi( argv[2])+99)/100;l=new int[ h*3];for(q=l,i=0,w=1;i<h; i++,c=(cw)&~((cw)>>31 ),w+=2)if(c>=w){*q++= 0;*q++ =0;* q++=w;} else {*q++=(c+1)/ 2;*q++=wc;*q++ =c/2;}p("_"); for(i=0;i<h ;i ++)p ( "__");p ("\n" );q = l+h *3-1; for (i= --h;i>=0; i--){p("%*" "s\\",hi,"") ; z= "x\0 \0x"; for(k=0;k<3;k++,q --,z+=2)for(j=0;j<* q;j++)p(z);q-=0;p("/" "\n");}q=l;for(i=0;i<=h ;i++){z =i==h? "_\0x\0_": " \0x\0 ";p("%*s/",hi,""); for(k=0;k<3;k++,q++,z+=2)for( j=0;j<*q;j++)p(z);p("\\\n") ;}} 

…而这个解密版本对我们来说只不过是人类:

 #include <stdio.h> #include <memory.h> #include <stdlib.h> #define p printf int h, c, *l, i, w, j, *q, k; const char *z; int main(int argc, char** argv) { h = atoi(argv [1]); c = (h*h*atoi(argv[2])+99)/100; l = new int[h*3]; for (q = l,i = 0,w = 1; i<h; i++,c = (cw)&~((cw)>>31),w += 2) { if (c>=w) { *q++ = 0; *q++ = 0; *q++ = w; } else { *q++ = (c+1)/2; *q++ = wc; *q++ = c/2; } } p("_"); for (i = 0; i<h; i++) { p("__"); } p("\n"); q = l+h*3-1; for (i = --h; i>=0; i--) { p("%*s\\",hi,""); z = "x\0 \0x"; for (k = 0; k<3; k++,q--,z += 2) { for (j = 0; j<*q; j++) { p(z); } } p("/\n"); } q = l; for (i = 0; i<=h; i++) { z = i==h ? "_\0x\0_" : " \0x\0 "; p("%*s/",hi,""); for (k = 0; k<3; k++,q++,z += 2) { for (j = 0; j<*q; j++) { p(z); } } p("\\\n") ; } } 

Perl,191个字符

205 199 191字符。

 $S=-int((1-.01*pop)*($N=pop)*$N)+$N*$N;$S-=$s=$S>++$r?$r:$S, $\=$/.$"x$N."\\".xx($v=$s/2).$"x($t=$r++-$s).xx($w=$v+.5)."/$\ ".$"x$N."/".($^=$N?$":_)x$wx x$t.$^x$v."\\"while$N--;print$^x++$r 

第二行和第三行之间需要明确的换行符。

在新的Acme :: AsciiArtinator模块的帮助下:

 $S=-int((1-.01*pop)*($N=pop ) * $ N ) + $ N *$N;( ${B},$ F,${x})=qw(\\ / x );while($N){;/l ater/g;$S-=$s =$S>++$r?$r :$S;'than you';@o =(" " x-- $ N . $ B . xx ( $ v = $ s / 2 ) .$"x($t= $ r++-$s).xx($w=$v+.5) .$F,@o,$"x$N.$F.($^=$N? $":_)x$wx x$t.$^x$v.$B); $,=$/}print$^x++$r,@o;think 

Python,213个字符

 N,p=map(int,raw_input()[:-1].split()) S=N*NN*N*(100-p)/100 _,e,x,b,f,n=C='_ x\/\n' o="" r=1 while N:N-=1;z=C[N>0];s=min(S,r);S-=s;t=rs;v=s/2;w=sv;r+=2;o=n+e*N+b+x*v+e*t+x*w+f+o+n+e*N+f+z*w+x*t+z*v+b print _*r+o 

雷布姆 :188个字符

rJ N 0% rN Wad1mpJ2 S{ \x/ }D0 Hc&[u[Z=~wA Qs^RTkW[isEL0c[skQdvK2][eEV?kQ[tlQ]]pcSeg--B0[eZ1 5]3]prRJ[si^DspSCsQfhS]eZ1[s+DcA+wMPc2no]]]Va|[mpAj**2]prSI^w{_}Ls+W2 h1tiVsb1n -1 chRVs{_}hLceVn1

尽pipe这个解决scheme实际上是以“天真”的方式解决问题的,但它与这里较短的解决scheme相比具有竞争力。 或多或less,它正在做“沙子物理”,而不是利用对称或旋转matrix或任何东西。

H定义了一个打印半个沙漏的函数,在你打印“x”字符之前,你可以通过一个数字打印多less个空格来打印。 如果你在上半部分,沙串是由交替附加到头部和尾部。 如果您在底部,则通过跳到string中间来select插入源。 评论来源可在:

http://github.com/hostilefork/rebmu/blob/master/examples/hourglass.rebmu

但是,Rebmu袖手旁观的真正伎俩是它不会破坏其主机语言(Rebol)的任何parsing规则。 只要你用小写代码,你就可以通过在中间注入普通代码来把它变成世界末日的可视化。

>> rebmu [rJ birthday: to-date (ask "When were you born? ") n: (21-dec-2012 - now/date) / (21-dec-2012 - birthday) Wad1mpJ2 S{ \x/ }D0 Hc~[u[Ze?Wa Qs^RTkW[isEL0c[skQdvK2][eEV?kQ[tlQ]]pcSeg--B0[eZ1 5]3]prRJ[si^DspSCsQfhS]eZ1[s+DcA+wMPc2no]]]Va|[mpAj**2]prSI^w{_}Ls+W2h1tiVsb1n -1 chRVs{_}hLceVn1]

 Input Integer: 10 When were you born? 23-May-1974 _____________________ \ / \ / \ / \ / \ / \ / \ / \x xx/ \xxx/ \x/ / \ / \ / xx \ /xxxxxxx\ /xxxxxxxxx\ /xxxxxxxxxxx\ /xxxxxxxxxxxxx\ /xxxxxxxxxxxxxxx\ /xxxxxxxxxxxxxxxxx\ /xxxxxxxxxxxxxxxxxxx\ 

哦,不! 🙂

(注:我能够编写和debuggingRebmu程序的一个主要原因是因为我可以在任何时候打破普通的编码来使用现有的debugging工具/等)。

哈斯克尔。 285个字符。 (副作用 – 免费的!)

 xnc=h s++'\n':reverse(h(flip s)) where hs=rw '-'++s '+' b(w-2)0 p;w=(tn);p=d(n*n*c)100 sxniop|i>0='\n':l++sxn(i-2)(o+1)(max(pi)0)|True=[] where l=ro b++'\\':f d++r(i#p)n++f m++'/':rob;fg=r(g(i-(i#p))2)x b=' ' r=replicate tn=1+2*n d=div (#)=min m=(uncurry(+).).divMod 

以例如x 5 50运行

一个c ++的答案,到目前为止是592个字符,仍然有合理的格式。

 #include<iostream> #include<string> #include<cstdlib> #include<cmath> using namespace std; typedef string S; typedef int I; typedef char C; I main(I,C**v){ I z=atoi(v[1]),c=z*z,f=ceil(c*atoi(v[2])/100.); cout<<S(z*2+1,'_')<<'\n'; for(I i=z,n=c;i;--i){ I y=i*2-1; S s(y,' '); C*l=&s[0]; C*r=&s[y]; for(I j=0;j<y;++j) if(n--<=f)*((j&1)?l++:--r)='x'; cout<<S(zi,' ')<<'\\'<<s<<"/\n"; } for(I i=1,n=cf;i<=z;++i){ I y=i*2-1; S s(y,'x'); C*l=&s[0]; C*r=&s[y]; for(I j=0;j<y;++j) if(n++<c)*(!(j&1)?l++:--r)=(i==z)?'_':' '; cout<<S(zi,' ')<<'/'<<s<<"\\\n"; } } 

如果我决定忘记合理地格式化,我可以得到它低至531

 #include<iostream> #include<string> #include<cstdlib> #include<cmath> using namespace std;typedef string S;typedef int I;typedef char C;I main(I,C**v){I z=atoi(v[1]),c=z*z,f=ceil(c*atoi(v[2])/100.);cout<<S(z*2+1,'_')<<'\n';for(I i=z,n=c;i;--i){I y=i*2-1;S s(y,' ');C*l=&s[0];C*r=&s[y];for(I j=0;j<y;++j)if(n--<=f)*((j&1)?l++:--r)='x';cout<<S(zi,' ')<<'\\'<<s<<"/\n";}for(I i=1,n=cf;i<=z;++i){I y=i*2-1;S s(y,'x');C*l=&s[0];C*r=&s[y];for(I j=0;j<y;++j)if(n++<c)*(!(j&1)?l++:--r)=(i==z)?'_':' ';cout<<S(zi,' ')<<'/'<<s<<"\\\n";}} 

Bash: 639 – 373个字符

我想我会尝试一下(没有看到太多的代码打高尔夫球)。 (我的版本: GNU bash,版本3.2.48(1)-release(i486-pc-linux-gnu)

基于Mobrule的很好的Python的答案 。

优化必须仍然可用,所以所有的build议是值得欢迎的!

从命令行开始,例如: ./hourglass.sh 7 34%

 function f () { for i in `seq $1`;do printf "$2";done; } N=$1;S=$[$1*$1-$1*$1*$[100-${2/\%/}]/100] b='\';o=$b;n="\n";r=1;while [ $N -gt 0 ];do N=$[N-1];z=" ";s=$r;[ $N -eq 0 ]&& z=_;[ $S -lt $r ]&& s=$S S=$[Ss];t=$[rs];v=$[s/2];w=$[sv];r=$[r+2] o=$n`f $N " "`$b`f $vx;f $t " ";f $wx`/$o$b$n`f $N " "`/`f $w "$z";f $tx;f $v "$z"`$b done;f $r _;echo -e "${o/\/\\\\//}" 

Java的; 661个字符

 public class M{public static void main(String[] a){int h=Integer.parseInt(a[0]);int s=(int)Math.ceil(h*h*Integer.parseInt(a[1])/100.);r(h,h-1,s,true);r(h,h-1,s,false);}static void r(int h,int c,int r,boolean t){if(c<0)return;int u=2*(hc)-1;if(t&&c==h-1)p(2*h+1,0,'_','_',true,0,false);int z=r>=u?u:r;r-=z;if(t)r(h,c-1,r,true);p(u,z,t?'x':((c==0)?'_':' '),t?' ':'x',t,c,true);if(!t)r(h,c-1,r,false);}static void p(int s,int n,char o,char i,boolean t,int p,boolean d){int f=(sn);int q=n/2+(!t&&(f%2==0)?1:0);int e=q+f;String z = "";int j;for(j=0;j<p+4;j++)z+=" ";if(d)z+=t?'\\':'/';for(j=0;j<s;j++)z+=(j>=q&&j<e)?i:o;if(d)z+=t?'/':'\\';System.out.println(z);}} 

我需要find更好的一套高尔夫球杆。

PHP – 361

 <?$s=$argv[1];$x='str_pad';$w=$s*2-1;$o[]=$x('',$w+2,'_'); $r=$s*ceil($w/2);$w=$r-($r*substr($argv[2],0,-1)/100);$p=0; $c=-1;while($s){$k=$s--*2-1;$f=$x($x('',min($k,$w),' '),$k,'x',2); $g=$x($x('',min($k,$w),'x'),$k,' ',2);$w-=$k;$o[]=$x('',$p)."\\$f/"; $b[]=$x('',$p++)."/$g\\";}$b[0]=str_replace(' ','_',$b[0]); krsort($b);echo implode("\n",array_merge($o,$b));?> 

Python – 272个字符

 X,p=map(int,raw_input()[:-1].split()) k=X*X;j=k*(100-p)/100 n,u,x,f,b,s='\n_x/\ ' S=list(x*k+s*j).pop;T=list(s*k+u*(2*Xj-1)+x*j).pop A=B="" for y in range(X): r=S();q=T() for i in range(Xy-1):r=S()+r+S();q+=T();q=T()+q A+=n+s*y+b+r+f;B=n+s*y+f+q+b+B print u+u*2*X+A+B 

Exabyte18的Java转换为C#,655字节:

 public class M {public static void Main(){int h = Convert.ToInt32(Console.ReadLine()); int s = Convert.ToInt32(h * h * Convert.ToInt32(Console.ReadLine()) / 100);r(h,h-1,s,true); r(h,h-1,s,false);Console.ReadLine();}static void r(int h, int c, int r, bool t){ if(c<0) return;int u=2*(hc)-1;if (t&&c==h-1)p(2*h+1,0,'_','_',true,0,false); int z=r>=u?u:r; r-=z;if (t)Mr(h,c-1,r,true); p(u,z,t?'x':((c==0)?'_':' '), t?' ':'x',t,c,true); if(!t)Mr(h,c-1,r,false);}static void p(int s, int n, char o, char i, bool t, int p, bool d) {int f=(sn);int q=n/2+(!t&&(f%2==0)?1:0);int e=q+f;string z="";int j;for(j=0;j<p+4;j++) z+=" ";if(d)z+=t?'\\':'/'; for (j=0;j<s;j++) z+=(j>=q&&j<e)?i:o; if(d)z+=t?'/':'\\';Console.WriteLine(z);}} 

Ruby, 297 254 (压缩之后)

ruby -a -p f.rb

 n,p = $F.map{|i|i.to_i} r="\n" y='' g,s,u,f,b=%w{x \ _ / \\} $> << u*2*n+u+r # draw initial underbar line a=u c=100.0/n/n # amount of sand a single x represents e = 100.0 # percentage floor to indicate sand at this level n.times{ |i| d=2*n-1-2*i # number of spaces at this level e-= c*d # update percentage floor x = [((p - e)/c+0.5).to_i,d].min x = 0 if x<0 w = x/2 # small half count z = xw # big half count d = dx # total padding count $> << s*i+b+g*w+s*d+g*z+f+r y=s*i+f+a*z+g*d+a*w+b+r+y a=s } $_=y 

ruby,211

这是Ruby中的mobrule的游戏 。 (仍然没有最后的换行符:-)

 m,p=$F.map{|i|i.to_i} q=m*mm*m*(100-p)/100 _,e,x,b,f=%w{_ \ x \\ /} n="\n" o='' r=1 while m>0 m-=1 z=m>0?e:_ s=q<r ?q:r q-=s t=rs v=s/2 w=sv r=r+2 o=n+e*m+b+x*v+e*t+x*w+f+o+n+e*m+f+z*w+x*t+z*v+b end $_=_*r+o