Code Golf:Triforce

时间:2010-03-09 05:02:31

标签: language-agnostic code-golf rosetta-stone

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

问题

假设用户为您提供1到7之间的数字输入。应该从控制台输入,参数不太理想。

输入为1时,打印以下内容:

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

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

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

如果您也打印相反的奖励积分。

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

我们可以尝试将其保留为每种语言的一个答案,我们都会改进吗?

23 个答案:

答案 0 :(得分:38)

汇编程序,汇编165个字节

构建说明

  1. here
  2. 下载A86
  3. 将A86可执行文件的引用添加到DOS搜索路径中
  4. 将下面的代码粘贴到文本文件中(例如:triforce.asm
  5. 调用汇编程序:a86 triforce.asm
  6. 这将创建一个名为triforce.com
  7. 的.COM文件
  8. 键入triforce以运行
  9. 这是使用标准的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
    

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

答案 1 :(得分:23)

GolfScript - 43个字符

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

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

48 Chars 奖金

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

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

答案 2 :(得分:17)

Python - 77 Chars

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

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

89 Chars 奖金

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

114 Chars 仅使用字符串替换的版本

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. enumerate()允许单个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*(n-r)+(' '*(5-l)+'*'*(l*2+1)+' '*(5-l)+' ')*r for r in xrange(1, n+1) for l in xrange(6))
f(input())

答案 3 :(得分:13)

Ruby - 74 Chars

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

答案 4 :(得分:12)

COBOL - 385 Chars

$ 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将保存两个字符。 -free也是编译器相关的,所以我可能过于挑剔了。

答案 5 :(得分:9)

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

第一次尝试;可能会做出改进......

答案 6 :(得分:7)

Ruby 1.9 - 84个字符:

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

答案 7 :(得分:7)

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)

答案 8 :(得分:6)

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

输出存储在字符串数组$a中,反之则由排序数组创建。当然,我们可以反转数组,但输入的字符会更多:)

答案 9 :(得分:5)

Haskell - 131 138 142 143 Chars

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

这一个更长(146 <打击> 148 字符),但是一个有趣的,替代的攻击线:

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

答案 10 :(得分:5)

FORTRAN - 97 Chars

由于隐含循环而摆脱了#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),N-I/6)
ENDDO
END

答案 11 :(得分:4)

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(N-i/6,f(11-(z=i%6*2),'*')+f(z+1)))

w / bonus - 151 chars

N=readline()
function f(n,c)n>0?(c||' ')+f(n-1,c):''
function l(i)print(f(i)+f(N-i/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(N-i/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<N-i/6; j++)
        str += fill('*', 11-i%6*2) + fill(S, i%6*2+1);
    str += '\n';
}

document.write(str);

这是一个不同的算法,它使用replace()从一行到三角行的每一行的下一行:

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,'   ')}}

答案 12 :(得分:4)

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"(r l" ")(r(N-l/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"(r l" ")(r(N-l/6)((r(11-l%6*2)"*")+(r(l%6*2+1)" ")))

答案 13 :(得分:4)

C - 120 Chars

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|w-x-1<y|(x-y)%12>=11-2*(y%6)?32:42);}

请注意,此解决方案会打印一些尾随空格(这没关系,对吧?)。它还依赖于优先级高于按位OR的关系运算符,保存两个字符。

124 Chars

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))));}

答案 14 :(得分:3)

C - 177 183 Chars

#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((t-c)*6+6-r,32);for(o=0;o<c;o++){P(r*2-1,42);P(13-r*2,32);}puts("");}}

C - 222 243 Chars(有奖励积分)

#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("");}}

这是我第一次提交Code Golf!

答案 15 :(得分:2)

用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("*********** ",c-i,i);p(" *********  ",c-i,i);p("  *******   ",c-i,i);p("   *****    ",c-i,i);p("    ***     ",c-i,i);p("     *      ",c-i,i);}for(i=0;i<c;i++){k=c-i-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("*********** ",c-i,i);p(" *********  ",c-i,i);p("  *******   ",c-i,i);p("   *****    ",c-i,i);p("    ***     ",c-i,i);p("     *      ",c-i,i);}}

第一次发帖!

答案 16 :(得分:2)

dc 105 chars

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

答案 17 :(得分:2)

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,N-i))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,N-i))end end

答案 18 :(得分:2)

PHP ,153

<?php $i=fgets(STDIN);function r($n,$c=' '){return$n>0?$c.r($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?$c.r($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)));

答案 19 :(得分:2)

Mathematica,46个字符

答案是横向打印的。

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

答案 20 :(得分: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 n-y 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

要使用此功能,将创建卡片字段并将其设置为固定宽度字体。使用HyperCard的answer命令会显示一个包含文本的对话框,但它不起作用,因为:

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

答案 21 :(得分:0)

Common Lisp,150个字符:

(defun f(n o)(unless(= n 0)(dotimes(x 6)(format t"~v@{~a~:*~}~-1:*~v@{~?~2:*~}~%"
 o" "n"~11@: "(list(- 11(* 2 x))#\*)))(f(1- n)(+ 6 o))))

答案 22 :(得分:0)

基于gnibbler的77 char替代python解决方案:

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

令人惊讶的是,奖金也完全相同(101个字符,好吧)

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