Code Golf: Triforce

C'est inspiré par/prises de ce fil: http://www.allegro.cc/forums/thread/603383

Le Problème

Supposons que l'utilisateur vous donne une entrée numérique allant de 1 à 7. L'entrée doit être prise à partir de la console, les arguments sont moins souhaitables.

Lorsque l'entrée est 1, imprimez ce qui suit:

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

Les valeurs supérieures à un devraient générer des multiples du motif, se terminant par celui ci-dessus, mais empilés symétriquement. Exemple, 3 devrait imprimer ce qui suit:

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

Points Bonus si vous imprimez l'inverse ainsi.

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

Pouvons-nous essayer de le garder à une réponse par langue, que nous améliorons tous?

48
demandé sur Grant Paul 2010-03-09 08:02:31

23 réponses

Assembleur, 165 octets assemblés

Instructions De Compilation

  1. Télécharger A86 à partir de ici
  2. ajoutez une référence à L'exécutable A86 dans votre chemin de recherche DOS
  3. , Collez le code ci-dessous dans un fichier texte (exemple: triforce.asm)
  4. appelez l'assembleur: a86 triforce.asm
  5. cela va créer un fichier. COM appelé triforce.com
  6. Tapez triforce pour exécuter

Ceci a été développé en utilisant la boîte DOS WinXP standard (Démarrer - > Programmes - > Accessoires - > Invite De Commande). Il devrait fonctionner avec d'autres émulateurs DOS.

Assembler en utilisant A86 et nécessite WinXP dos box pour exécuter le fichier. COM qu'il produit. Appuyez sur ' q ' pour quitter, touches 1-7 pour dessiner la sortie.

  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

Il utilise beaucoup de code Auto-modificateur pour faire la triforce et son miroir, il modifie même le code auto-modificateur.

39
répondu Skizz 2010-03-10 11:19:09

GolfScript-43 caractères

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

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

48 les Caractères pour le bonus

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

~:!6*,.-1%+{:^' '*'*'12*' '^6%.+)*+-12>!^6/-*n}/
23
répondu gnibbler 2010-03-10 03:09:00

Python-77 Caractères

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 les Caractères pour le bonus

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

114 caractères Version utilisant simplement des remplacements de chaîne

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 caractères tout en une seule instruction, devrait fonctionner w / 2.x et 3.X. l'enumerate () est de permettre à la seule input () de fonctionner pour les deux endroits dont vous avez besoin pour l'utiliser.

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

Encore Une Autre Méthode

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())
17
répondu gnibbler 2010-03-10 11:43:32

Ruby-74 Caractères

(6*n=gets.to_i).times{|k|puts' '*k+('*'*(11-(j=k%6*2))+' '*(j+1))*(n-k/6)}
13
répondu John La Rooy 2010-03-09 11:18:36

COBOL-385 caractères

$ 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 pourrait être renvoyé à l'extérieur du niveau du groupe. Une valeur initiale de zéro pour une clause numérique sans valeur dépend de l'implémentation du compilateur, tout comme une valeur initiale d'espace pour un champ alphanumérique (W a été guéri de cela, sans coût de caractère supplémentaire). Déplacer K en arrière permettrait d'économiser deux caractères. - free dépend également du compilateur, donc je suis probablement trop pointilleux.

12
répondu gnibbler 2014-02-19 16:28:14

Sed, 117 caractères

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

Utilisation: $ echo 7 | sed -rf this.sed

Première tentative; des améliorations pourraient probablement être apportées...

9
répondu KirarinSnow 2010-03-09 14:56:02

Ruby 1.9-84 caractères:

v=gets.to_i
v.times{|x|6.times{|i|puts' '*6*x+(' '*i+'*'*(11-2*i)+' '*i+' ')*(v-x)}}
7
répondu Gdeglin 2010-03-09 08:03:50

Perl-72 caractères

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

78 les caractères

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

87 les caractères

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

97 les caractères

$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 les caractères

$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)
7
répondu Dustin Howett 2010-03-09 20:26:01

Powershell, 78 caractères

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

Bonus, 92 caractères

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

La sortie est stockée dans un tableau de chaînes de caractères, $a, et l'inverse est créé par tri la matrice. Nous pourrions, bien sûr, simplement inverser le tableau, mais il y aurait plus de caractères à taper :)

6
répondu Danko Durbić 2010-03-10 09:43:55

Haskell - 131 138 142 143 Les Caractères

(⊗)=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

Celui-ci est plus long (146 148 caractères) à l'heure actuelle, mais une ligne d'attaque alternative intéressante:

(⊗)=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
5
répondu MtnViewMark 2010-03-10 04:00:58

Fortran-97 caractères

S'est débarrassé du #define et a sauvé 8 octets grâce aux boucles implict!

$ 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 octets pour le bonus

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 caractères

#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
5
répondu gnibbler 2010-03-15 09:07:21

C - 177 183 Les Caractères

#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 Caractères (Avec Points Bonus)

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

C'est aussi ma première soumission de code Golf!

4
répondu Adam Maras 2010-03-09 16:12:23

JavaScript 1.8-SpiderMonkey-118 caractères

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 caractères

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)

Utilisation: js thisfile.js

JavaScript-dans le navigateur-154 caractères

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)

La version non obscurcie (avant les optimisations par 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);

Voici un algorithme différent qui utilise replace () pour passer d'une ligne à l'autre de chaque ligne d'une ligne triangulaire:

161 caractères

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,'   ')}}
4
répondu Joey Adams 2010-03-10 09:57:15

F#, 184 181 167 151 147 143 142 133 les caractères

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)" ")))

Bonus, 215 212 198 166 162 158 157 148 les caractères

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)" ")))
4
répondu m0sa 2010-03-12 13:12:34

C - 120 Caractères

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

Notez que cette solution imprime des espaces de fin (ce qui est correct, non?). Il repose également sur des opérateurs relationnels ayant une priorité plus élevée que BIT à bit ou, en sauvant deux caractères.

124 Caractères

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))));}
4
répondu gnibbler 2010-03-14 01:40:27

Écrit en C

Points Bonus (492 caractères):

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

Sans points bonus (322 caractères):

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

Première fois Affichage, aussi!

2
répondu user289480 2010-03-09 08:51:30

Lua, 121 caractères

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
2
répondu DerKuchen 2010-03-09 14:37:08

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

Avec Bonus, 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)));
2
répondu Kevin Vaughan 2010-03-10 01:05:13

Dc 105 caractères

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
2
répondu Carlos Gutiérrez 2010-03-10 06:35:32

Mathematica, 46 caractères

La réponse s'imprime latéralement.

TableForm@{Table["*",{l,#},{l},{j,6},{2j-1}]}&
2
répondu Mr.Wizard 2011-04-13 22:34:56

HyperTalk-272 caractères

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

L'Indentation n'est ni nécessaire ni comptée (HyperCard l'ajoute automatiquement).

Miscellanea:

Comme il n'y a pas de notion de console ou de moyen d'accéder aux arguments de la console dans HyperCard 2.2 (que je connais), une fonction est donnée à la place. Il peut être invoqué avec:

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

Pour l'utiliser, un champ de carte serait créé et défini sur une police de largeur fixe. L'utilisation de la commande answer D'HyperCard afficherait une boîte de dialogue avec le texte, mais ce n'est pas le cas travail parce que:

  • la police de dialogue de réponse (Chicago) n'est pas de largeur fixe.
  • la commande answer refuse d'afficher un texte long (même triforce (2) est trop long).
1
répondu Joey Adams 2010-03-11 06:03:11

Common Lisp, 150 caractères:

(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))))
0
répondu Svante 2010-03-10 01:20:01

77 char solution Python alternative basée sur gnibbler:

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

Étonnamment le bonus est sorti exactement le même aussi (101 caractères, oh bien)

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
0
répondu pat 2010-03-10 10:20:41