代码高尔夫:Triforce
这是从这个线程的启发/ http://www.allegro.cc/forums/thread/603383
问题
假设用户给你一个从1到7的数字input。input应该从控制台中获取,参数不太可取。
当input为1时,打印下列内容:
*********** ********* ******* ***** *** *
大于1的值应该生成多个模式,以上面的结尾,但对称堆叠。 例如,3应该打印以下内容:
*********** *********** *********** ********* ********* ********* ******* ******* ******* ***** ***** ***** *** *** *** * * * *********** *********** ********* ********* ******* ******* ***** ***** *** *** * * *********** ********* ******* ***** *** *
如果您打印反面,也可以获得奖励积分。
*********** *********** ********* ********* ******* ******* ***** ***** *** *** * * *********** ********* ******* ***** *** * * *** ***** ******* ********* *********** * * *** *** ***** ***** ******* ******* ********* ********* *********** ***********
我们可以尝试并保持每种语言一个答案,我们都在改进?
汇编,165字节组装
构build说明
- 从这里下载A86
- 将A86可执行文件的引用添加到DOSsearchpath中
- 将下面的代码粘贴到一个文本文件中(例如:
triforce.asm
) - 调用汇编器:
a86 triforce.asm
- 这将创build一个名为
triforce.com
的.COM文件 - 键入
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