In tên lửa Retro


12

(lấy cảm hứng từ câu hỏi SO này )

Bạn được cho là đầu vào một số nguyên dương n duy nhất .

Trong càng ít ký tự càng tốt, xuất ra một tên lửa trong nghệ thuật ASCII với đầu, đuôi và thân gồm n đoạn. Không nên có dấu cách hoặc dòng mới.

Đầu và đuôi của tên lửa luôn giống nhau cho bất kỳ giá trị nào của n . Cơ thể bao gồm hai loại phân khúc khác nhau xen kẽ. Các ví dụ sẽ làm cho cấu trúc của tên lửa rõ ràng.

Đầu ra cho n = 1:

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

Đầu ra cho n = 2:

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

Đầu ra cho n = 3:

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

3
bài đăng liên quan, từ kẻ thù của chúng tôi: codereview.stackexchange.com/questions/65040/NH

Câu trả lời:


6

CJam, 67 63 ký tự

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

Điều này sẽ làm việc trong trình thông dịch trực tuyến .

Làm thế nào nó hoạt động

Sau khi đẩy chuỗi Unicode, đoạn mã

6e4b127b:c~

chuyển đổi chuỗi từ cơ sở 60000 sang cơ sở 127, chuyển thành chuỗi và đánh giá kết quả.

Mã được thực thi là như sau:

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

1
Bạn thực sự nên tính điều này bằng byte, không?
Claudiu

8
@Claudiu: Và làm hỏng điểm của tôi? : P Câu trả lời được ghi theo byte độ dài theo mặc định, nhưng câu hỏi sẽ ghi đè điều này bằng cách nói càng ít ký tự càng tốt .
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

Dùng thử trực tuyến

Lấy n đầu vào thông qua STDIN.

Tôi sẽ thêm một lời giải thích tại một số điểm sau. Về cơ bản tất cả chỉ là một loạt các vòng lặp một cách rất ngây thơ. Để xen kẽ giữa hai phần cơ thể khác nhau, tôi đã có một vòng lặp lồng nhau trên phần đó và một vòng lặp 01. Sau đó, tôi chỉ cần thêm iterator bên ngoài và bên trong, và sử dụng tính chẵn lẻ của chúng để quyết định giữa tam giác hướng lên hoặc xuống.


Tôi đã nhận được một java.util.NoSuchElementExceptionbản sao + dán mã (chỉ vào Lri)
Claudiu

@Claudiu Bạn đã nhập một số nguyên trong trường "đầu vào" chưa?
Martin Ender

Ồ vâng, điều đó sẽ làm điều đó!
Claudiu

5

Hồng ngọc, 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

Ung dung

Tôi nghĩ trong trường hợp này có lợi khi có một phiên bản không chơi gôn.

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

Giải trình

Tôi nghi ngờ đây là bất cứ nơi nào gần hiệu quả, nhưng dù sao nó cũng rất vui.

  • Đầu vào được lấy từ ARGV.
  • hchứa "đầu" và "đuôi" của tên lửa, rchứa các "đường vân" ngăn cách các phần khác nhau của tên lửa và mp là phần trên cùng và dưới cùng của "thân" của tên lửa.
  • Cơ thể được xây dựng bằng cách đạp xe qua Array ["ridge", "top of body", "bottom of body", "ridge", "bottom of body", "top of body"]và lấy các 3*nyếu tố đầu tiên .
  • puts đảm bảo mọi thứ đều có dòng riêng.

3

Python, 120 + 77 + 1 = 198 ký tự

Điều này cuối cùng là cách tiếp cận sai, nhưng tôi đã hoàn thành khi Martin đăng câu trả lời của mình.

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

Yêu cầu một tệp R(+1 cho tên tệp) gồm 77 byte, bạn có thể tạo như sau:

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

3

Ký tự JS, WIP, 252b hoặc 173

Đây không phải là một hàm, vì vậy bạn phải đặt giá trị của n ở đầu (3 ở đây), sau đó thực hiện nó trong bàn điều khiển hoặc trong nútJS.

Đây là phiên bả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")

Và đây là phiên bản ký tự 173 (sử dụng http://xem.github.io/obfuscatweet/ )

n=3;eval(unescape(escape('𬠽𨐽𘠠𘀠𘀠𛰪𚠰𜐠𘀠𘀯𛰪𚠰𜀱𘀠𘀯𛰯𚠪𜀰𜀱𘀠𛰯𛰯𚠪𜀰𜀰𜐠𛰯𛰯𛰪𚠰𜀰𜀰𘠻𨠽𘠱𚰽𚠽𚠽𚠽𚠽𚠽𚠫𜐢𞱦𫱲𚁣👛𩀽𘡼𜀯𜀯𜀯𜀯𜀯𜀯𯀱𯀮𜀯𜀯𛠮𜀯𜀯𛡼𜑼𛠮𜀯𛠮𛠮𜀯𛠮𯀢𛁤𛡳𬁬𪑴𚀢𘠩𛡲𩑶𩑲𬱥𚀩𛡪𫱩𫠨𘠢𚑝𞱮𛐭𞰩𬠫👢𚱣𦱮𙐲𧐫𜐫𨱛𜐭𫠥𜡝𞰨𬠫𨠫𨐩𛡲𩑰𫁡𨱥𚀯𜀯𩰬𘡜𧀢𚐮𬡥𬁬𨑣𩐨𛰱𛱧𛀢𧁮𘠩').replace(/uD./g,'')))

Đã thử nghiệm trong giao diện điều khiển. Tuyệt vời và +1, nhưng thông thường khi OP yêu cầu đầu ra và không chỉ là giá trị trả về, một câu lệnh đầu ra được yêu cầu (như console.log hoặc cảnh báo - Tôi không biết trong nodeJS).
edc65

bạn nói đúng ... Tôi cho phép bản thân coi giao diện điều khiển như một đầu ra. : p (đồng thời, nodeJS chỉ có thể xuất trên bảng điều khiển afaik)
xem

3

JavaScript (E6) 252 257

Việc sử dụng quá nhiều chuỗi.

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

thật thú vị, cả hai chúng tôi đều có 252b nhưng với cách tiếp cận hoàn toàn khác nhau :)
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}

1 SyntaxError: function statement requires a name:, 2: đầu ra không chính xác, các phân đoạn cơ thể không thể bằng nhau (lẻ và thậm chí khác nhau)
edc65

1. Đó là vì nó dự định là FunctionExpression. Nhưng tôi đã thêm một nhiệm vụ, vì vậy nó sẽ hoạt động ngay bây giờ. 2. Cảm ơn! Tôi đã không nhận thấy rằng lúc đầu.
subzey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.