Code Golf:Triforce

Gra*_*aul 48 language-agnostic code-golf rosetta-stone

这是受到这个主题的启发:http://www.allegro.cc/forums/thread/603383

问题

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

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

***********
 ********* 
  *******    
   *****   
    ***    
     *     
Run Code Online (Sandbox Code Playgroud)

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

*********** *********** ***********
 *********   *********   ********* 
  *******     *******     *******  
   *****       *****       *****   
    ***         ***         ***    
     *           *           *     
      *********** ***********
       *********   ********* 
        *******     *******  
         *****       *****   
          ***         ***    
           *           *     
            ***********
             ********* 
              *******  
               *****   
                ***    
                 *     
Run Code Online (Sandbox Code Playgroud)

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

      *********** ***********
       *********   ********* 
        *******     *******  
         *****       *****   
          ***         ***    
           *           *     
            ***********
             ********* 
              *******  
               *****   
                ***    
                 *     
                 *     
                ***    
               *****   
              *******  
             ********* 
            ***********
           *           *     
          ***         ***    
         *****       *****   
        *******     *******  
       *********   ********* 
      *********** ***********
Run Code Online (Sandbox Code Playgroud)

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

Ski*_*izz 38

汇编程序,165字节组装

构建说明

  1. 这里下载A86
  2. 将A86可执行文件的引用添加到DOS搜索路径中
  3. 下面的代码粘贴到一个文本文件(例如:triforce.asm)
  4. 调用汇编程序: a86 triforce.asm
  5. 这将创建一个名为.COM的文件 triforce.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
Run Code Online (Sandbox Code Playgroud)

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

  • **但是**,我们正在使用代码而不是二进制代码.;) (13认同)
  • 如果你愿意,我可以发布一个Base64编码的机器代码块;) (10认同)
  • @Kamarey:不,我认为编码高尔夫比这更重要.一个语言比较.展示你的编程技巧(你能告诉我一个没有编程的程序员吗?).聪明的实施.编写python解释器的人如果发布了python版本,是否必须包含该代码?我可以创建一个新的语言,例如,有一个单字母命令实现这个问题的解决方案 - 我应该包括语言代码还是我可以声称1个字符的结果(golfscript任何人?)在这个网站上,我认为规模不那么重要.但我知道什么? (4认同)
  • Skizz,不是汇编而不是汇编程序的语言吗? (3认同)
  • @Bruno:我不认为它真的是一种语言.该文本只是汇编程序转换为机器代码的机器代码助记符列表.虽然这通常被称为汇编语言,但没有标准的描述方式,即使在单个CPU上也可以用多种形式编写.例如,Intel将助记符指定为"op dest,src",而gcc列表则为"op src,dest".维基百科有一个关于术语的部分:http://en.wikipedia.org/wiki/Assembly_language#Related_terminology.它说调用汇编程序是汇编的同义词,但可能导致混淆. (3认同)
  • 恕我直言,代码高尔夫的关键是如何用最少的代码完成任务,你写的.因此,请计算您编写的代码,而不是编译的代码.或者编写已编译的代码. (2认同)

Joh*_*ooy 23

GolfScript - 43个字符

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

~:!6*,{:^' '*'*'12*' '^6%.+)*+-12>!^6/-*n}/
Run Code Online (Sandbox Code Playgroud)

48个奖金

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

~:!6*,.-1%+{:^' '*'*'12*' '^6%.+)*+-12>!^6/-*n}/
Run Code Online (Sandbox Code Playgroud)

  • 我恨你.对不起. (13认同)
  • 但是这是什么意思? (3认同)

Joh*_*ooy 17

Python - 77个字符

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)
Run Code Online (Sandbox Code Playgroud)

89奖金的奖金

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

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]
Run Code Online (Sandbox Code Playgroud)

Unk Chars全部在一个声明中,应该工作w/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))))
Run Code Online (Sandbox Code Playgroud)

又一种方法

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())
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 13

Ruby - 74 Chars

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


Joh*_*ooy 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.
Run Code Online (Sandbox Code Playgroud)

K可以返回到组级别之外.对于没有VALUE子句的数字,初始值为零依赖于编译器实现,因为字母数字字段的空间的初始值(W已经解决了这个问题,没有额外的字符成本).向后移动K将保存两个字符.-free也是编译器相关的,所以我可能过于挑剔了.

  • 在你的生活中没有足够的挑战,或者只是自虐? (7认同)

Kir*_*now 9

sed,117个字符

s/$/76543210/
s/(.).*\1//
s/./*********** /gp
:
s/\*(\**)\*/ \1 /gp
t
:c
s/\* {11}\*/ ************/
tc
s/\*  /   /p
t
Run Code Online (Sandbox Code Playgroud)

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

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


Gde*_*lin 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)}}
Run Code Online (Sandbox Code Playgroud)


Dus*_*ett 7

Perl - 72个字符

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

78个字符

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

87个字符

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

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)


Dan*_*bić 6

Powershell,78个字符

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

奖金,92个字符

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

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


Mtn*_*ark 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
Run Code Online (Sandbox Code Playgroud)

这一个目前更长(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
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 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
Run Code Online (Sandbox Code Playgroud)

奖金为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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)