Drucken Sie die Retro-Rakete

12

(inspiriert von dieser SO-Frage )

Sie erhalten als Eingabe eine einzelne positive ganze Zahl n .

Geben Sie in möglichst wenigen Zeichen eine Rakete in ASCII-Technik mit einem Kopf, einem Schwanz und einem Körper aus n Segmenten aus. Es sollten keine nachgestellten Leerzeichen oder Zeilenumbrüche vorhanden sein.

Der Kopf und das Heck der Rakete sind für jeden Wert von n immer gleich . Der Körper besteht aus zwei verschiedenen Arten von Segmenten, die sich abwechseln. Die Beispiele sollen die Struktur der Rakete verdeutlichen.

Ausgabe für n = 1:

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

Ausgabe für n = 2:

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

Ausgabe für n = 3:

     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
Absinth
quelle
3
Ergebniss zu , von unserer Erzfeind: codereview.stackexchange.com/questions/65040/...
Auch verwandt.
Türklinke

Antworten:

6

CJam, 67 63 Zeichen

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

Dies sollte im Online-Interpreter funktionieren .

Wie es funktioniert

Nach dem Drücken der Unicode-Zeichenfolge das Snippet

6e4b127b:c~

konvertiert den String von der Basis 60000 in die Basis 127, wandelt ihn in einen String um und wertet das Ergebnis aus.

Der Code, der ausgeführt wird, ist der folgende:

"..."          " 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
quelle
1
Sie sollten das wirklich in Bytes zählen, nicht?
Claudiu
8
@Claudiu: Und meine Punktzahl ruinieren? : P Antworten werden standardmäßig nach ihrer Länge in Bytes bewertet. Die Frage setzt dies jedoch außer Kraft, indem sie so wenig Zeichen wie möglich enthält .
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

Probieren Sie es online aus

Übernimmt die Eingabe n über STDIN.

Ich werde später eine Erklärung hinzufügen. Im Grunde ist alles nur ein paar Loops auf eine sehr naive Art und Weise. Um zwischen den beiden Körperteilen zu wechseln, habe ich eine verschachtelte Schleife über dem Teil und eine Schleife über 0und 1. Dann füge ich einfach den äußeren und den inneren Iterator hinzu und bestimme anhand ihrer Parität zwischen einem nach oben oder unten zeigenden Dreieck.

Martin Ender
quelle
Ich habe eine java.util.NoSuchElementExceptionKopie + Einfügen des Codes (zeigt auf Lri)
Claudiu
@Claudiu Hast du eine ganze Zahl in das Eingabefeld eingegeben?
Martin Ender
Oh ja, das würde es tun!
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

Ungolfed

Ich denke in diesem Fall ist es vorteilhaft, eine nicht-golfende Version zu haben.

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

Erläuterung

Ich bezweifle, dass dies alles andere als effizient ist, aber es hat trotzdem Spaß gemacht.

  • Die Eingabe wird von übernommen ARGV.
  • henthält den "Kopf" und "Schwanz" der Rakete, renthält die "Grate", die die verschiedenen Teile der Rakete trennen und mund psind die oberen und unteren Teile des "Körpers" der Rakete.
  • Der Körper wird aufgebaut, indem man durch Array ["ridge", "top of body", "bottom of body", "ridge", "bottom of body", "top of body"]die ersten 3*nElemente fährt und diese aufnimmt .
  • puts sorgt dafür, dass alles seine eigene Linie bekommt.
britishtea
quelle
3

Python, 120 + 77 + 1 = 198 Zeichen

Dies war der falsche Ansatz, aber ich war bereits fertig, als Martin seine Antwort veröffentlichte.

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

Benötigt eine Datei R(+1 für Dateiname) von 77 Bytes, die Sie wie folgt generieren können:

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

JS, WIP, 252b oder 173 Zeichen

Da es sich nicht um eine Funktion handelt, müssen Sie den Wert von n am Anfang festlegen (hier 3) und ihn dann in der Konsole oder in nodeJS ausführen.

Hier ist die 252b-Version:

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

Und hier ist die 173-Zeichen-Version (mit http://xem.github.io/obfuscatweet/ )

n=3;eval(unescape(escape('𬠽𨐽𘠠𘀠𘀠𛰪𚠰𜐠𘀠𘀯𛰪𚠰𜀱𘀠𘀯𛰯𚠪𜀰𜀱𘀠𛰯𛰯𚠪𜀰𜀰𜐠𛰯𛰯𛰪𚠰𜀰𜀰𘠻𨠽𘠱𚰽𚠽𚠽𚠽𚠽𚠽𚠫𜐢𞱦𫱲𚁣👛𩀽𘡼𜀯𜀯𜀯𜀯𜀯𜀯𯀱𯀮𜀯𜀯𛠮𜀯𜀯𛡼𜑼𛠮𜀯𛠮𛠮𜀯𛠮𯀢𛁤𛡳𬁬𪑴𚀢𘠩𛡲𩑶𩑲𬱥𚀩𛡪𫱩𫠨𘠢𚑝𞱮𛐭𞰩𬠫👢𚱣𦱮𙐲𧐫𜐫𨱛𜐭𫠥𜡝𞰨𬠫𨠫𨐩𛡲𩑰𫁡𨱥𚀯𜀯𩰬𘡜𧀢𚐮𬡥𬁬𨑣𩐨𛰱𛱧𛀢𧁮𘠩').replace(/uD./g,'')))
xem
quelle
Getestet in der Konsole. Cool und +1, aber normalerweise, wenn das OP nach einer Ausgabe und nicht nach einem einfachen Rückgabewert fragt, wird eine Ausgabeanweisung angefordert (wie console.log oder alert - ich kenne mich in nodeJS nicht aus).
Edc65
Sie haben Recht ... Ich habe mir erlaubt, die Konsole als Ausgabe zu betrachten. : p (auch, NodeJS kann nur auf seiner Konsole afaik ausgeben)
Xem
3

JavaScript (E6) 252 257

Überbeanspruchung von 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
quelle
Es macht Spaß, wir haben beide 252b, aber mit völlig unterschiedlichen Ansätzen :)
Xem
3

Javascript (ES3): 243 219 Byte

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
quelle
1 SyntaxError: function statement requires a name:, 2: falsche Ausgabe, die Körpersegmente sollten nicht alle gleich sein (ungerade und gerade sind unterschiedlich)
edc65
1. Das liegt daran, dass es FunctionExpression sein soll. Aber ich habe eine Aufgabe hinzugefügt, so sollte es jetzt funktionieren. 2. Danke! Das habe ich anfangs nicht bemerkt.
Subzey