Imprime el cohete retro

13

(inspirado en esta pregunta SO )

Se le da como entrada un número entero positivo n .

En la menor cantidad de caracteres posible, genera un cohete en el arte ASCII con una cabeza, una cola y un cuerpo compuesto de n segmentos. No debe haber espacios finales ni líneas nuevas.

La cabeza y la cola del cohete son siempre iguales para cualquier valor de n . El cuerpo consta de dos tipos diferentes de segmentos que se alternan. Los ejemplos deberían aclarar la estructura del cohete.

Salida para n = 1:

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

Salida para n = 2:

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

Salida para n = 3:

     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
Ajenjo
fuente
3
publicación relacionada, de nuestro enemigo: codereview.stackexchange.com/questions/65040/…
También relacionado.
Pomo de la puerta

Respuestas:

6

CJam, 67 63 caracteres

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

Esto debería funcionar en el intérprete en línea .

Cómo funciona

Después de presionar la cadena Unicode, el fragmento

6e4b127b:c~

convierte la cadena de la base 60000 a la base 127, la convierte a cadena y evalúa el resultado.

El código que se ejecuta es el siguiente:

"..."          " 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
fuente
1
Realmente deberías contar esto en bytes, ¿no?
Claudiu
8
@Claudiu: ¿Y arruinar mi puntaje? : P Las respuestas se puntúan por sus bytes de longitud por defecto, pero la pregunta anula esto al decir en la menor cantidad de caracteres posible .
Dennis
10

CJam, 121 bytes

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

Pruébalo en línea

Toma la entrada n a través de STDIN.

Agregaré una explicación en algún momento más tarde. Básicamente, todo es solo un montón de bucles de una manera muy ingenua. Para alternar entre las dos partes del cuerpo diferentes, tengo un bucle anidado sobre la parte y un bucle sobre 0y 1. Luego solo agrego el iterador externo y el interno, y uso su paridad para decidir entre el triángulo apuntando hacia arriba o hacia abajo.

Martin Ender
fuente
Recibí una java.util.NoSuchElementExceptioncopia + pegando el código (señalando Lri)
Claudiu
@Claudiu ¿Ingresó un número entero en el campo "entrada"?
Martin Ender
¡Oh sí, eso lo haría!
Claudiu
5

Ruby, 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

Sin golf

Creo que en este caso es beneficioso tener una versión sin golf.

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

Explicación

Dudo que esto sea eficiente, pero fue divertido.

  • La entrada se toma de ARGV.
  • hcontiene la "cabeza" y la "cola" del cohete, rcontiene las "crestas" que separan las diferentes partes del cohete my pson las partes superior e inferior del "cuerpo" del cohete.
  • El cuerpo se construye recorriendo en bicicleta Array ["ridge", "top of body", "bottom of body", "ridge", "bottom of body", "top of body"]y tomando los primeros 3*nelementos.
  • puts se asegura de que todo tenga su propia línea.
britishtea
fuente
3

Python, 120 + 77 + 1 = 198 caracteres

Esto terminó siendo un enfoque equivocado, pero ya había terminado cuando Martin publicó su respuesta.

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

Requiere un archivo R(+1 para nombre de archivo) de 77 bytes, que puede generar de la siguiente manera:

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

JS, WIP, 252b o 173 caracteres

No es una función, por lo que debe establecer el valor de n al principio (3 aquí), luego ejecutarlo en la consola o en nodeJS.

Aquí está la versión 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")

Y aquí está la versión de 173 caracteres (usando http://xem.github.io/obfuscatweet/ )

n=3;eval(unescape(escape('𬠽𨐽𘠠𘀠𘀠𛰪𚠰𜐠𘀠𘀯𛰪𚠰𜀱𘀠𘀯𛰯𚠪𜀰𜀱𘀠𛰯𛰯𚠪𜀰𜀰𜐠𛰯𛰯𛰪𚠰𜀰𜀰𘠻𨠽𘠱𚰽𚠽𚠽𚠽𚠽𚠽𚠫𜐢𞱦𫱲𚁣👛𩀽𘡼𜀯𜀯𜀯𜀯𜀯𜀯𯀱𯀮𜀯𜀯𛠮𜀯𜀯𛡼𜑼𛠮𜀯𛠮𛠮𜀯𛠮𯀢𛁤𛡳𬁬𪑴𚀢𘠩𛡲𩑶𩑲𬱥𚀩𛡪𫱩𫠨𘠢𚑝𞱮𛐭𞰩𬠫👢𚱣𦱮𙐲𧐫𜐫𨱛𜐭𫠥𜡝𞰨𬠫𨠫𨐩𛡲𩑰𫁡𨱥𚀯𜀯𩰬𘡜𧀢𚐮𬡥𬁬𨑣𩐨𛰱𛱧𛀢𧁮𘠩').replace(/uD./g,'')))
xem
fuente
Probado en consola. Genial y +1, pero generalmente cuando el OP solicita una salida y no solo un valor de retorno, se solicita una declaración de salida (como console.log o alert - No lo sé en nodeJS).
edc65
tienes razón ... me permití considerar la consola como una salida. : p (también, nodeJS solo puede mostrar en su consola afaik)
xem
3

JavaScript (E6) 252 257

Uso excesivo 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
fuente
es divertido, ambos tenemos 252b pero con enfoques completamente diferentes :)
xem
3

Javascript (ES3): 243 219 bytes

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
fuente
1:, SyntaxError: function statement requires a name2: salida incorrecta, los segmentos del cuerpo no deben ser todos iguales (pares e impares son diferentes)
edc65
1. Eso es porque está destinado a ser FunctionExpression. Pero agregué una tarea, por lo que debería funcionar ahora. 2. Gracias! No me di cuenta de eso al principio.
subzey