Imprimer la fusée rétro

13

(inspiré par cette question SO )

On vous donne en entrée un seul entier positif n .

En aussi peu de caractères que possible, sortez une fusée en art ASCII avec une tête, une queue et un corps composé de n segments. Il ne doit pas y avoir d'espaces de fin ni de nouvelles lignes.

La tête et la queue de la fusée sont toujours les mêmes pour toute valeur de n . Le corps se compose de deux types de segments différents qui alternent. Les exemples devraient clarifier la structure de la fusée.

Sortie pour n = 1:

     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\

Sortie pour n = 2:

     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
+=*=*=*=*=*=*+
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\

Sortie pour n = 3:

     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
Absinthe
la source
3
article connexe, de notre ennemi juré
Également lié.
Poignée de porte

Réponses:

6

CJam, 67 63 caractères

"дȈ鰚㒄å摒四ㄺ뎞椉ᖛⲠ줥葌⌁掗⦠춻锦䎷겲铣굛쮂먲꿡㦺좒轃汁̕뎕갴瓖邻吟㭰戔蟏㳵回㡚钦״脮烮鋉둎邫"6e4b127b:c~

Cela devrait fonctionner dans l' interpréteur en ligne .

Comment ça fonctionne

Après avoir poussé la chaîne Unicode, l'extrait de code

6e4b127b:c~

convertit la chaîne de base 60000 en base 127, convertit en chaîne et évalue le résultat.

Le code qui est exécuté est le suivant:

"..."          " A binary string of length 42.                                            ";
122b7b         " Convert from base 122 to base 7.                                         ";
"\n *./\|"f=   " Replace each digits with the corresponding character.                    ";
60/~           " Split into chunks of length 60 and dump the resulting array.             ";
               " The stack now contains the rocket's head and a body half.                ";
[_W%[\]_W%]    " Push an array of the body half and the reversed body half, a reversed    ";
               " copy of that array and collect both array into another one.              ";
Nf*Nf+         " Join each array of body halves separating by LFs and append LFs.         ";
ri:I*           " Repeat the resulting array I := int(input()) times.                     ";
I<W%           " Keep the first I bodies and reverse their order.                         ";
\a_@\++        " Prepend and append the rocket head/tail.                                 ";
'+"=*"6*'+N+++ " Push S := '+=*=*=*=*=*=*+\n'.                                            ";
*              " Join the array of parts, separating by S.                                ";
Dennis
la source
1
Vous devriez vraiment compter cela en octets, non?
Claudiu
8
@Claudiu: Et ruiner mon score? : P Les réponses sont notées par leur longueur en octets par défaut, mais la question l'emporte en disant le moins de caractères possible .
Dennis
10

CJam, 121 octets

5,{_5\-S*\)_'/*"**"@'\*N}%:A['+"+
"]"=*"6**:Lri:M{M(:M;2,{M+2%:J;3,{:I'|J@2\-'.*I'.*?_J"/\\""\/"?JI)3I-?*\++_+'|N}%}%L}*A

Essayez-le en ligne

Prend l'entrée n via STDIN.

J'ajouterai une explication à un moment donné plus tard. Fondamentalement, ce n'est qu'un tas de boucles d'une manière très naïve. Pour alterner entre les deux parties du corps différentes, j'ai une boucle imbriquée sur la partie et une boucle sur 0et 1. Ensuite, j'ajoute simplement l'itérateur externe et l'itérateur interne, et j'utilise leur parité pour choisir entre un triangle pointant vers le haut ou vers le bas.

Martin Ender
la source
J'ai obtenu une java.util.NoSuchElementExceptioncopie + coller le code (en montrant Lri)
Claudiu
@Claudiu Avez-vous entré un nombre entier dans le champ "entrée"?
Martin Ender
Oh oui, ça le ferait!
Claudiu
5

Rubis, 203

n,q=$*[0].to_i,"\\/"
h,r,m=1.upto(5).map{|i|(?/*i+"**"+?\\*i).center 14},?++"=*"*6+?+,3.times.map{|i|?|+?.*i+q*(3-i)+?.*(2*i)+q*(3-i)+?.*i+?|}*"\n"
p=m.reverse.tr q,"/\\"
puts h,([r,m,p,r,p,m]*n)[0,3*n],r,h

Non golfé

Je pense que dans ce cas, il est avantageux d'avoir une version non golfée.

n      = $*[0].to_i
head   = 1.upto(5).map { |i| ("/"*i + "**" + "\\"*i).center 14 }
ridge  = "+" + "=*"*6 + "+"
middle = 3.times.map { |i| "|" + "."*i + "\\/"*(3-i) + "."*(2*i) + "\\/"*(3-i) + "."*i + "|" }.join "\n"
piddle = middle.reverse.tr "\\/", "/\\"

puts head
puts ([ridge,middle,piddle,ridge,piddle,middle]*n)[0,3*n]
puts ridge, head

Explication

Je doute que ce soit presque efficace, mais c'était quand même amusant.

  • L'entrée provient de ARGV.
  • hcontient la "tête" et la "queue" de la fusée, rcontient les "crêtes" qui séparent les différentes parties de la fusée met psont les parties supérieure et inférieure du "corps" de la fusée.
  • Le corps est construit en parcourant Array ["ridge", "top of body", "bottom of body", "ridge", "bottom of body", "top of body"]et en prenant les premiers 3*néléments.
  • puts s'assure que tout a sa propre ligne.
britishtea
la source
3

Python, 120 + 77 + 1 = 198 caractères

Cela a fini par être la mauvaise approche, mais j'avais déjà fini quand Martin a posté sa réponse.

H,L,T,B=open("R","rb").read().decode('zip').split("X")
n=input()
for p in[H]+([B,T,L,T,B,L]*n)[:3*n][::-1]+[L,H]:print p

Nécessite un fichier R(+1 pour le nom de fichier) de 77 octets, que vous pouvez générer comme suit:

>>> open('R','wb').write('eJxNjMENwDAIA/+ZIm8i4Qm6Bw+PwvDFQRUFydwJwd5VMOO6ILqIRjE+LsEI4zw2fSKJ6Vzpmt4p\ndVlnRikoVWqrK+8s/X1ivozIJuo=\n'.decode('base64'))
Claudiu
la source
3

JS, WIP, 252b ou 173 caractères

Ce n'est pas une fonction, vous devez donc définir la valeur de n au début (3 ici), puis l'exécuter dans la console ou dans nodeJS.

Voici la version 252b:

n=3;r=a="     /**01    //**001   ///**0001  ////**00001 /////**00000";b="1+=*=*=*=*=*=*+1";for(c=[d="|0/0/0/0/0/0/|1|.0/0/..0/0/.|1|..0/....0/..|",d.split("").reverse().join("")];n--;)r+=b+c[n%2]+1+c[1-n%2];(r+b+a).replace(/0/g,"\\").replace(/1/g,"\n")

Et voici la version 173 caractères (en utilisant http://xem.github.io/obfuscatweet/ )

n=3;eval(unescape(escape('𬠽𨐽𘠠𘀠𘀠𛰪𚠰𜐠𘀠𘀯𛰪𚠰𜀱𘀠𘀯𛰯𚠪𜀰𜀱𘀠𛰯𛰯𚠪𜀰𜀰𜐠𛰯𛰯𛰪𚠰𜀰𜀰𘠻𨠽𘠱𚰽𚠽𚠽𚠽𚠽𚠽𚠫𜐢𞱦𫱲𚁣👛𩀽𘡼𜀯𜀯𜀯𜀯𜀯𜀯𯀱𯀮𜀯𜀯𛠮𜀯𜀯𛡼𜑼𛠮𜀯𛠮𛠮𜀯𛠮𯀢𛁤𛡳𬁬𪑴𚀢𘠩𛡲𩑶𩑲𬱥𚀩𛡪𫱩𫠨𘠢𚑝𞱮𛐭𞰩𬠫👢𚱣𦱮𙐲𧐫𜐫𨱛𜐭𫠥𜡝𞰨𬠫𨠫𨐩𛡲𩑰𫁡𨱥𚀯𜀯𩰬𘡜𧀢𚐮𬡥𬁬𨑣𩐨𛰱𛱧𛀢𧁮𘠩').replace(/uD./g,'')))
xem
la source
Testé en console. Cool et +1, mais généralement lorsque l'OP demande une sortie et pas seulement une valeur de retour, une instruction de sortie est demandée (comme console.log ou alert - je ne sais pas dans nodeJS).
edc65
tu as raison ... Je me suis permis de considérer la console comme une sortie. : p (aussi, nodeJS ne peut sortir que sur sa console afaik)
xem
3

JavaScript (E6) 252 257

Surutilisation de string.repeat

F=p=>{
  R=(n,s='.',a='')=>a+s.repeat(n)+a;
  for(i=f=o=m=n='';++i<6;)
    o+=f+R(6-i,' ')+R(i,u='/')+'**'+R(i,t='\\'),
    f='\n',
    i<4?m+=f+R(2,R(4-i,t+u,R(i-1)),'|',n+=f+R(2,R(i,u+t,R(3-i)),'|')):0;
  s=f+R(6,'=*','+'),
  console.log(o+s+R(p&1,q=m+n+s)+R(p/2,n+m+s+q)+f+o)
}
edc65
la source
c'est amusant, nous avons tous les deux 252b mais avec des approches complètement différentes :)
xem
3

Javascript (ES3): 243 219 octets

R=function(n){for(a='',i=5;i--;t=a+=s+'\n')for(s='**',j=6;j--;b=['|../\\..|./\\/\\.|/\\/\\/\\','|\\/\\/\\/|.\\/\\/.|..\\/..'])s=i<j?'/'+s+'\\':' '+s+' ';for(;a+='+=*=*=*=*=*=*+\n',n;)a+=(b[n&1]+b[--n&1]).replace(/[^|]+/g,'$&$&|\n');return a+t}
subzey
la source
1 SyntaxError: function statement requires a name:, 2: sortie incorrecte, les segments de corps ne devraient pas être tous égaux (impairs et pairs sont différents)
edc65
1. C'est parce qu'il est censé être FunctionExpression. Mais j'ai ajouté une affectation, donc cela devrait fonctionner maintenant. 2. Merci! Je ne l'ai pas remarqué au début.
subzey