Cetak Rocket Retro

13

(terinspirasi oleh pertanyaan SO ini )

Anda diberi input bilangan bulat positif tunggal n .

Dalam karakter sesedikit mungkin, menghasilkan roket dalam seni ASCII dengan kepala, ekor, dan tubuh yang terdiri dari n segmen. Seharusnya tidak ada spasi tambahan atau baris baru.

Kepala dan ekor roket selalu sama untuk nilai n . Tubuh terdiri dari dua jenis segmen yang bergantian. Contoh-contoh harus membuat struktur roket jelas.

Output untuk n = 1:

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

Output untuk n = 2:

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

Output untuk n = 3:

     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
Absinth
sumber
3
posting terkait, dari musuh bebuyutan kami: codereview.stackexchange.com/questions/65040/…
Juga terkait.
Gagang Pintu

Jawaban:

6

CJam, 67 63 karakter

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

Ini harus bekerja pada penerjemah online .

Bagaimana itu bekerja

Setelah mendorong string Unicode, snippet

6e4b127b:c~

mengubah string dari basis 60000 ke basis 127, melempar ke string dan mengevaluasi hasilnya.

Kode yang dijalankan adalah sebagai berikut:

"..."          " 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
sumber
1
Anda benar-benar harus menghitung ini dalam byte, bukan?
Claudiu
8
@Claudiu: Dan merusak skor saya? : P Jawaban dicetak oleh byte panjangnya secara default, tetapi pertanyaan menimpanya dengan mengatakan sesedikit mungkin karakter .
Dennis
10

CJam, 121 byte

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

Cobalah online

Mengambil input n melalui STDIN.

Saya akan menambahkan penjelasan di beberapa titik nanti. Pada dasarnya itu semua hanya sekelompok loop dengan cara yang sangat naif. Untuk bergantian di antara dua bagian tubuh yang berbeda, saya punya loop bersarang di atas bagian dan satu lingkaran di atas 0dan 1. Lalu saya hanya menambahkan iterator luar dan yang dalam, dan menggunakan paritas mereka untuk memutuskan antara segitiga menunjuk ke atas atau ke bawah.

Martin Ender
sumber
Saya mendapat java.util.NoSuchElementExceptionsalinan + menempelkan kode (menunjuk Lri)
Claudiu
@Claudiu Apakah Anda memasukkan bilangan bulat di bidang "input"?
Martin Ender
Oh ya, itu akan berhasil!
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

Tidak disatukan

Saya pikir dalam hal ini bermanfaat memiliki versi non-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

Penjelasan

Saya ragu ini mendekati efisien, tapi tetap menyenangkan.

  • Input diambil dari ARGV.
  • hberisi "kepala" dan "ekor" roket, rberisi "punggungan" yang memisahkan berbagai bagian roket dan mdan pmerupakan bagian atas dan bawah dari "tubuh" roket.
  • Tubuh dibangun dengan bersepeda melalui Array ["ridge", "top of body", "bottom of body", "ridge", "bottom of body", "top of body"]dan mengambil 3*nelemen pertama .
  • puts memastikan semuanya mendapatkan jalurnya sendiri.
britishtea
sumber
3

Python, 120 + 77 + 1 = 198 karakter

Ini akhirnya menjadi pendekatan yang salah, tetapi saya sudah selesai ketika Martin memposting jawabannya.

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

Membutuhkan file R(+1 untuk nama file) sebesar 77 byte, yang dapat Anda hasilkan sebagai berikut:

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

JS, WIP, 252b atau 173 karakter

Ini bukan fungsi, jadi Anda harus mengatur nilai n di awal (3 di sini), kemudian jalankan di konsol atau di nodeJS.

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

Dan inilah versi 173 karakter (menggunakan http://xem.github.io/obfuscatweet/ )

n=3;eval(unescape(escape('𬠽𨐽𘠠𘀠𘀠𛰪𚠰𜐠𘀠𘀯𛰪𚠰𜀱𘀠𘀯𛰯𚠪𜀰𜀱𘀠𛰯𛰯𚠪𜀰𜀰𜐠𛰯𛰯𛰪𚠰𜀰𜀰𘠻𨠽𘠱𚰽𚠽𚠽𚠽𚠽𚠽𚠫𜐢𞱦𫱲𚁣👛𩀽𘡼𜀯𜀯𜀯𜀯𜀯𜀯𯀱𯀮𜀯𜀯𛠮𜀯𜀯𛡼𜑼𛠮𜀯𛠮𛠮𜀯𛠮𯀢𛁤𛡳𬁬𪑴𚀢𘠩𛡲𩑶𩑲𬱥𚀩𛡪𫱩𫠨𘠢𚑝𞱮𛐭𞰩𬠫👢𚱣𦱮𙐲𧐫𜐫𨱛𜐭𫠥𜡝𞰨𬠫𨠫𨐩𛡲𩑰𫁡𨱥𚀯𜀯𩰬𘡜𧀢𚐮𬡥𬁬𨑣𩐨𛰱𛱧𛀢𧁮𘠩').replace(/uD./g,'')))
xem
sumber
Diuji dalam konsol. Keren dan +1, tetapi biasanya ketika OP meminta output dan bukan hanya nilai balik, pernyataan output diminta (seperti console.log atau peringatan - saya tidak tahu di nodeJS).
edc65
Anda benar ... Saya membiarkan diri saya mempertimbangkan konsol sebagai output. : p (juga, nodeJS hanya dapat output pada konsolnya afaik)
xem
3

JavaScript (E6) 252 257

Terlalu sering menggunakan string. Ulangi

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
sumber
itu menyenangkan, kami berdua memiliki 252b tetapi dengan pendekatan yang sama sekali berbeda :)
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
sumber
1 SyntaxError: function statement requires a name
:,
1. Itu karena itu dimaksudkan untuk menjadi FunctionExpression. Tapi saya sudah menambahkan tugas, jadi itu harus berfungsi sekarang. 2. Terima kasih! Saya tidak memperhatikan itu pada awalnya.
subzey