Search code examples
language-agnosticcode-golfrosetta-stone

Code Golf: Triforce


This is inspired by/taken from this thread: http://www.allegro.cc/forums/thread/603383

The Problem

Assume the user gives you a numeric input ranging from 1 to 7. Input should be taken from the console, arguments are less desirable.

When the input is 1, print the following:

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

Values greater than one should generate multiples of the pattern, ending with the one above, but stacked symmetrically. For example, 3 should print the following:

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

Bonus points if you print the reverse as well.

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

Can we try and keep it to one answer per language, that we all improve on?


Solution

  • Assembler, 165 bytes assembled

    Build Instructions

    1. Download A86 from here
    2. Add a reference to the A86 executable into your DOS search path
    3. Paste the code below into a text file (example: triforce.asm)
    4. Invoke the assembler: a86 triforce.asm
    5. This will create a .COM file called triforce.com
    6. Type triforce to run

    This was developed using the standard WinXP DOS box (Start->Programs->Accessories->Command Prompt). It should work with other DOS emulators.

    Assemble using A86 and requires WinXP DOS box to run the .COM file it produces. Press 'q' to exit, keys 1-7 to draw the output.

      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
    

    It uses lots of self-modifying code to do the triforce and its mirror, it even modifies the self-modifying code.