代码高尔夫:Triforce

这是从这个线程的启发/ http://www.allegro.cc/forums/thread/603383

问题

假设用户给你一个从1到7的数字input。input应该从控制台中获取,参数不太可取。

当input为1时,打印下列内容:

*********** ********* ******* ***** *** * 

大于1的值应该生成多个模式,以上面的结尾,但对称堆叠。 例如,3应该打印以下内容:

 *********** *********** *********** ********* ********* ********* ******* ******* ******* ***** ***** ***** *** *** *** * * * *********** *********** ********* ********* ******* ******* ***** ***** *** *** * * *********** ********* ******* ***** *** * 

如果您打印反面,也可以获得奖励积分。

  *********** *********** ********* ********* ******* ******* ***** ***** *** *** * * *********** ********* ******* ***** *** * * *** ***** ******* ********* *********** * * *** *** ***** ***** ******* ******* ********* ********* *********** *********** 

我们可以尝试并保持每种语言一个答案,我们都在改进?

汇编,165字节组装

构build说明

  1. 从这里下载A86
  2. 将A86可执行文件的引用添加到DOSsearchpath中
  3. 将下面的代码粘贴到一个文本文件中(例如: triforce.asm
  4. 调用汇编器: a86 triforce.asm
  5. 这将创build一个名为triforce.com的.COM文件
  6. 键入triforce运行

这是使用标准的WinXP DOS框(开始 – >程序 – >附件 – >命令提示符)开发的。 它应该与其他DOS模拟器一起工作。

使用A86进行组装,并要求WinXP DOS框运行它生成的.COM文件。 按'q'退出,键1-7画出输出。

  l20:mov ah,7 int 21h cmp al,'q' je ret sub al,'0' cmp al,1 jb l20 cmp al,7 ja l20 mov [l0-1],al mov byte ptr [l7+2],6 jmp $+2 mov ah,2 mov ch,0 mov bh,3 l0:mov bl,1 l1:mov dh,0 l3:cmp dh,ch je l2 mov dl,32 int 21h inc dh jmp l3 ret l2:mov dh,bh l6:mov cl,12 l5:mov dl,42 cmp cl,bl ja l4 mov dl,32 cmp dh,1 je l21 l4:int 21h dec cl jnz l5 l21:dec dh jnz l6 mov dl,10 int 21h mov dl,13 int 21h l10:inc ch l9:add bl,2 l7:cmp ch,6 jne l1 l13:add byte ptr [l7+2],6 l11:dec bh l12:cmp bh,0 jne l0 xor byte ptr [l0+1],10 xor byte ptr [l9+1],40 xor byte ptr [l10+1],8 xor byte ptr [l13+1],40 sub byte ptr [l7+2],12 mov dh,[l0-1] inc dh xor [l12+2],dh xor byte ptr [l11+1],8 xor byte ptr [l1+1],1 inc bh cmp byte ptr [l0+1],11 je l0 jmp l20 

它使用了大量的自修改代码来完成triforce及其镜像,甚至修改了自修改代码。

GolfScript – 43个字符

 ~:!6*,{:^' ' *'*'12*' ' ^6%.+)*+ -12>!^ 6/-* n} / ~:!6*,{:^' '*'*'12*' '^6%.+)*+-12>!^6/-*n}/ 

48奖金的字符

 ~:!6*,.-1%+{ :^' '*'*'12 *' '^6%.+ )*+-12> !^6/- *n} / ~:!6*,.-1%+{:^' '*'*'12*' '^6%.+)*+-12>!^6/-*n}/ 

Python – 77个字符

 n=input() for k in range(6*n):print' '*k+('*'*12+' '*(k%6*2+1))[-12:]*(nk/6) n=input() for k in range(6*n):j=1+k%6*2;print' '*k+('*'*(12-j)+' '*j)*(nk/6) 

89奖金

 n=input();R=range(6*n) for k in R+R[::-1]:print' '*k+('*'*11+' '*11)[k%6*2:][:12]*(nk/6) 

114字符版本只使用stringreplace

 u,v=' *';s=(v*11+u)*input() while s.strip():print s;s=u+s.replace(*((v*2+u,u*3),(v*1+u*10,v*11))[' * 'in s])[:-2] 

Unk Chars在一个声明中,应该工作瓦特/ 2.x和3.x. 枚举()允许单个input()在两个需要使用它的地方工作。

 print ('\n'.join('\n'.join(((' '*(6*n))+' '.join(('%s%s%s'%(' '*(5-x),'*'*(2*x+1),' '*(5-x)) for m in range(i + 1)))) for x in range(5,-1,-1)) for n, i in enumerate(range(int(input())-1,-1,-1)))) 

另一种方法

 def f(n): print '\n'.join(' '*6*(nr)+(' '*(5-l)+'*'*(l*2+1)+' '*(5-l)+' ')*r for r in xrange(1, n+1) for l in xrange(6)) f(input()) 

ruby – 74个字符

 (6*n=gets.to_i).times{|k|puts' '*k+('*'*(11-(j=k%6*2))+' '*(j+1))*(nk/6)} 

COBOL – 385个字符

 $ cobc -free -x triforce.cob && echo 7| ./triforce PROGRAM-ID.P.DATA DIVISION.WORKING-STORAGE SECTION. 1 N PIC 9. 1 M PIC 99. 1 value '0100***********'. 2 I PIC 99. 2 K PIC 99. 2 V PIC X(22). 2 W PIC X(99). PROCEDURE DIVISION.ACCEPT N COMPUTE M=N*6 PERFORM M TIMES DISPLAY W(1:K)NO ADVANCING PERFORM N TIMES DISPLAY V(I:12)NO ADVANCING END-PERFORM DISPLAY '' ADD 2 TO I IF I = 13 MOVE 1 TO I ADD -1 TO N END-IF ADD 1 TO K END-PERFORM. 

K可以返回到组级别之外。 对于没有VALUE子句的数字,初始值为零与编译器实现相关,因为字母数字字段的空间初始值(W已经被固化,没有额外的字符成本)。 向后移动K将保存两个字符。 免费也是编译器相关的,所以我可能是过分挑剔。

sed,117个字符

 s/$/76543210/ s/(.).*\1// s/./*********** /gp : s/\*(\**)\*/ \1 /gp t :c s/\* {11}\*/ ************/ tc s/\* / /p t 

用法: $ echo 7 | sed -rf this.sed $ echo 7 | sed -rf this.sed

第一次尝试; 可能可以改进…

ruby1.9 – 84个字符:

 v=gets.to_i v.times{|x|6.times{|i|puts' '*6*x+(' '*i+'*'*(11-2*i)+' '*i+' ')*(vx)}} 

Perl – 72个字符

 die map$"x$_.("*"x(12-($l=1+$_%6*2)).$"x$l)x($n-int$_/6).$/,0..6*($n=<>) 

78个字符

 map{$l=$_%6*2;print$"x$_,("*"x(11-$l).$"x$l.$")x($n-int$_/6),$/}0..6*($n=<>)-1 

87个字符

 $n=<>;map{$i=int$_/6;$l=$_%6*2;print$"x$_,("*"x(11-$l).$"x$l.$")x($n-$i),$/}(0..6*$n-1) 

97个字符

 $n=<>;map{$i=int$_/6;$l=$_%6;print$"x(6*$i),($"x$l."*"x(11-2*$l).$"x$l.$")x($n-$i),$/}(0..6*$n-1) 

108个字符

 $n=<>;map{$i=int$_/6;$l=$_%6;print ""." "x(6*$i),(" "x$l."*"x(11-2*$l)." "x$l." ")x($n-$i),"\n";}(0..6*$n-1) 

PowerShell,78个字符

 0..(6*($n=read-host)-1)|%{" "*$_+("*"*(12-($k=1+$_%6*2))+" "*$k)*(.4+$n-$_/6)} 

奖金,92个字符

 $a=0..(6*($n=read-host)-1)|%{" "*$_+("*"*(12-($k=1+$_%6*2))+" "*$k)*(.4+$n-$_/6)} $a $a|sort 

输出存储在一个string数组$a ,反之则通过对数组进行sorting来创build。 当然,我们可以颠倒这个数组,但是会更多的字符来input:)

哈斯克尔 – 131 138 142 143字符

 (⊗)=replicate zo=[concat$(6*n+m)⊗' ':(on)⊗((11-mm)⊗'*'++(1+m+m)⊗' ')|n<-[0..o-1],m<-[0..5]] main=getLine>>=mapM_ putStrLn.z.read 

目前这一个更长(146 148个字符),但是一个有趣的,交替的攻击线:

 (⊗)=replicate a↑b|a>b=' ';_↑_='*' zo=[map(k↑)$concat$(6*n)⊗' ':(on)⊗"abcdefedcba "|n<-[0..o-1],k<-"abcdef"] main=getLine>>=mapM_ putStrLn.z.read 

FORTRAN – 97个字符

摆脱#define和保存8字节感谢暗示循环!

 $ f95 triforce.f95 -o triforce && echo 7 | ./triforce READ*,N DO K=0,N*6 M=2*MOD(K,6) PRINT*,(' ',I=1,K),(('*',I=M,10),(' ',I=0,M),J=K/6+1,N) ENDDO END 

125字节的奖金

 READ*,N DO L=1,N*12 K=L+5 If(L>N*6)K=N*12-L+6 M=2*MOD(K,6) PRINT"(99A)",(32,I=7,K),((42,I=M,10),(32,I=0,M),J=K/6,N) ENDDO END 

FORTRAN – 108个字符

 #define R REPEAT READ*,N DO I=0,6*N J=MOD(I,6)*2 PRINT*,R(' ',I)//R(R('*',11-J)//R(' ',J+1),NI/6) ENDDO END 

C – 177 183 个字符

 #define P(I,C)for(m=0;m<I;m++)putchar(C) main(t,c,r,o,m){scanf("%d",&t);for(c=t;c>0;c--)for(r=6;r>0;r--){P((tc)*6+6-r,32);for(o=0;o<c;o++){P(r*2-1,42);P(13-r*2,32);}puts("");}} 

C – 222 243 字符(有奖励积分)

 #define P(I,C)for(m=0;m<I;m++)putchar(C) main(t,c,r,o,m){scanf("%d",&t);for(c=t-1;-c<2+t;c-=1+!c)for(r=c<0?1:6;c<0?r<7:r>0;r+=c<0?1:-1){P((t-abs(c+1))*6+6-r,32);for(o=0;o<abs(c+1);o++){P(r*2-1,42);P(13-r*2,32);}puts("");}} 

这是我的第一个代码高尔夫提交以及!

JavaScript 1.8 – SpiderMonkey – 118个字符

 N=readline() function f(n,c)n>0?(c||' ')+f(n-1,c):'' for(i=0;i<N*6;i++)print(f(i)+f(Ni/6,f(11-(z=i%6*2),'*')+f(z+1))) 

瓦特/奖金 – 151个字符

 N=readline() function f(n,c)n>0?(c||' ')+f(n-1,c):'' function l(i)print(f(i)+f(Ni/6,f(11-(z=i%6*2),'*')+f(z+1))) for(i=0;i<N*6;i++)l(i) for(;i--;)l(i) 

用法: js thisfile.js

JavaScript – 在浏览器中 – 154个字符

 N=prompt() function f(n,c){return n>0?(c||' ')+f(n-1,c):''} s='<pre>' for(i=0;i<N*6;i++)s+=f(i)+f(Ni/6,f(11-(z=i%6*2),'*')+f(z+1))+'\n' document.write(s) 

非混淆版本(在gnarf优化之前):

 var N = prompt(); var S = ' '; function fill(c, n) { for (ret=''; n--;) ret += c; return ret; } var str = '<pre>'; for (i=0; i<N*6; i++) { str += fill(S, i); for (j=0; j<Ni/6; j++) str += fill('*', 11-i%6*2) + fill(S, i%6*2+1); str += '\n'; } document.write(str); 

下面是一个不同的algorithm,它使用replace()从一行到三angular形行的每一行的下一行:

161个字符

 N=readline() function f(n,c){return n>0?(c||' ')+f(n-1,c):''}l=0 for(i=N;i>0;){r=f(i--,f(11,'*')+' ');for(j=6;j--;){print(f(l++)+r) r=r.replace(/\*\* /g,' ')}} 

F#, 184 181 167 151 147 143 142 133个字符

 let N,r=int(stdin.ReadLine()),String.replicate for l in[0..N*6-1]do printfn"%s%s"(rl" ")(r(Nl/6)((r(11-l%6*2)"*")+(r(l%6*2+1)" "))) 

奖金, 215 212 198 166 162 158 157 148个字符

 let N,r=int(stdin.ReadLine()),String.replicate for l in[0..N*6-1]@[N*6-1..-1..0]do printfn"%s%s"(rl" ")(r(Nl/6)((r(11-l%6*2)"*")+(r(l%6*2+1)" "))) 

C – 120个字符

 main(w,i,x,y){w=getchar()%8*12;for(i=0;i<w*w/2;)y=i/w,x=i++%w,putchar(x>w-2?10:x<y|wx-1<y|(xy)%12>=11-2*(y%6)?32:42);} 

请注意,此解决scheme打印一些尾随空格(这是好的,对吧?)。 它还依赖于具有比按位或高的优先级的关系运算符,从而节省两个字符。

124字

 main(n,i,k){n=getchar()&7;for(k=0;k<6*n;k++,putchar(10))for(i=-k-1;++i<12*n-2*k-1;putchar(32+10*(i>=0&&(11-i%12>2*k%12))));} 

写在C

积分(492个字符):

 p(char *t, int c, int s){int i=0;for(;i<s;i++)printf(" ");for(i=0;i<c;i++)printf("%s",t);printf("\n");}main(int a, char **v){int i=0;int k;int c=atoi(v[1]);for(;i<c;i++){p("*********** ",ci,i);p(" ********* ",ci,i);p(" ******* ",ci,i);p(" ***** ",ci,i);p(" *** ",ci,i);p(" * ",ci,i);}for(i=0;i<c;i++){k=ci-1;p(" * ",1+i,k);p(" *** ",1+i,k);p(" ***** ",1+i,k);p(" ******* ",1+i,k);p(" ********* ",1+i,k);p("*********** ",i+1,k);}} 

没有奖励积分(322个字符):

 p(char *t, int c, int s){int i=0;for(;i<s;i++)printf(" ");for(i=0;i<c;i++)printf("%s",t);printf("\n");}main(int a, char **v){int i=0;int k;int c=atoi(v[1]);for(;i<c;i++){p("*********** ",ci,i);p(" ********* ",ci,i);p(" ******* ",ci,i);p(" ***** ",ci,i);p(" *** ",ci,i);p(" * ",ci,i);}} 

第一次发布也!

Lua,121个字符

 R,N,S=string.rep,io.read'*n',' 'for i=0,N-1 do for j=0,5 do X=R(S,j)print(R(S,6*i)..R(X..R('*',11-2*j)..X..S,Ni))end end 

123

 R,N,S=string.rep,io.read'*n',' 'for i=0,N-1 do for j=0,5 do print(R(S,6*i)..R(R(S,j)..R('*',11-2*j)..R(S,j)..S,Ni))end end 

PHP ,153

 <?php $i=fgets(STDIN);function r($n,$c=' '){return$n>0?$cr($n-1,$c):'';}for($l=0;$l<$i*6;){$z=$l%6*2;echo r($l).r($i-$l++/6,r(11-$z,'*').r($z+1))."\n";} 

与奖金,210

 <?php $i=fgets(STDIN);function r($n,$c=' '){return$n>0?$cr($n-1,$c):'';}$o=array();for($l=0;$l<$i*6;){$z=$l%6*2;$o[]=r($l).r($i-$l++/6,r(11-$z,'*').r($z+1));}print join("\n",array_merge($o,array_reverse($o))); 

直stream105个字符

123 129 132 139 141

 [rdPr1-d0<P]sP?sn 0sk[1lk6%2*+sj32lkd0<Plnlk6/-si [[*]12lj-d0<P32ljd0<Pli1-dsi0<I]dsIx 10Plk1+dskln6*>K]dsKx 

Mathematica,46个字符

答案打印横向。

 TableForm@{Table["*",{l,#},{l},{j,6},{2j-1}]}& 

HyperTalk – 272个字符

 function triforce n put"******" into a put n*6 into h repeat with y=0 to h-1 put" " after s put char 1 to y of s after t repeat ny div 6 get y mod 6*2 put char 1 to 11-it of (a&a)&&char 1 to it of s after t end repeat put return after t end repeat return t end triforce 

缩进既不需要也不计算(HyperCard会自动添加它)。

杂记:

由于没有控制台的概念或方式来访问HyperCard 2.2中的控制台参数(我知道),所以给出了一个函数。 它可以被调用:

 on mouseUp ask "Triforce: " put triforce(it) into card field 1 end mouseUp 

要使用这个,将会创build一个卡片字段并将其设置为固定宽度的字体。 使用HyperCard的答案命令将显示与文本对话框,但它不工作,因为:

  • 答案对话框字体(芝加哥)不是固定宽度。
  • 答案命令拒绝显示长文本(即使triforce(2)太长)。

Common Lisp,150个字符:

  (除非(= n 0)(dotimes(x 6)(format t“〜v〜{〜a〜:*〜}〜-1:*〜v〜{〜?〜2:*〜 }〜%”
  ( -  11(* 2 x))#\ *)))(f(1-n)(+ 6 o)))) 

基于gnibbler的77字符替代python解决scheme:

 n=input() k=0 exec"print' '*k+('*'*12+' '*(k%6*2+1))[-12:]*(nk/6);k+=1;"*6*n 

令人惊讶的奖金出来完全一样(101字,哦)

 n=input() l=1 k=0 s="print' '*k+('*'*12+' '*(k%6*2+1))[-12:]*(nk/6);k+=l;"*6*n exec s+'l=-1;k-=1;'+s