Retro Roketi Yazdır


13

(bu SO sorusundan esinlenerek )

Giriş olarak tek bir pozitif tamsayı n verilir .

Mümkün olduğunca az karakterde, bir kafa, kuyruk ve n segmentten oluşan bir gövdeyle ASCII sanatında bir roket alın . Sonunda boşluk veya satır başı olmamalıdır.

Roketin başı ve kuyruğu, n'nin herhangi bir değeri için her zaman aynıdır . Vücut dönüşümlü olarak iki farklı segmentten oluşur. Örnekler roketin yapısını netleştirmelidir.

N = 1 için çıkış :

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

N = 2 için çıkış :

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

N = 3 için çıkış :

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

3
ilgili mesaj, bizim nemesis dan: codereview.stackexchange.com/questions/65040/…

Yanıtlar:


6

CJam, 67 63 karakter

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

Bu, çevrimiçi yorumlayıcıda çalışmalıdır .

Nasıl çalışır

Unicode dizesini ittikten sonra snippet

6e4b127b:c~

dizeyi taban 60000'den taban 127'ye dönüştürür, dökümü dizeye dönüştürür ve sonucu değerlendirir.

Yürütülen kod şudur:

"..."          " 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
Bunu gerçekten bayt olarak saymalısın, değil mi?
Claudiu

8
@Claudiu: Ve puanımı mahvetmek mi? : P Yanıtlar varsayılan olarak uzunluk baytlarına göre puanlanır, ancak soru mümkün olduğunca az karakter söyleyerek bunu geçersiz kılar .
Dennis

10

CJam, 121 bayt

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

Çevrimiçi deneyin

STDIN üzerinden n girişini alır .

Bir noktada daha sonra bir açıklama ekleyeceğim. Temelde hepsi çok saf bir şekilde bir sürü döngü. İki farklı vücut parçası arasında geçiş yapmak için, parça üzerinde iç içe bir döngü ve 0ve üzerinde bir döngü var 1. Sonra sadece dış yineleyici ve iç olanı eklerim ve paritelerini yukarı veya aşağı işaret eden üçgen arasında karar vermek için kullanırım.


Bir java.util.NoSuchElementExceptionkopyasını aldım + kodu yapıştırarak (işaret ederek Lri)
Claudiu

@Claudiu "Giriş" alanına bir tam sayı girdiniz mi?
Martin Ender

Oh evet, bunu yapardı!
Claudiu

5

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

Bu durumda golf olmayan bir versiyona sahip olmanın faydalı olduğunu düşünüyorum.

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

açıklama

Bunun verimli bir yerde yakın olduğundan şüphe ediyorum, ama yine de eğlenceliydi.

  • Giriş alındı ARGV.
  • h"kafa" ve roket "kuyruk" içerir rroket farklı bölümlerini ayırmak ve "sırtlar" içerir mve proket "vücut" üst ve alt parçalarıdır.
  • Vücut, Array ["ridge", "top of body", "bottom of body", "ridge", "bottom of body", "top of body"]ilk 3*nelemanların içinden geçerek ve ilk unsurları alarak inşa edilir .
  • puts her şeyin kendine ait olmasını sağlar.

3

Python, 120 + 77 + 1 = 198 karakter

Bu yanlış bir yaklaşım oldu, ama Martin cevabını gönderdiğinde zaten bitmiştim.

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

RAşağıdaki gibi oluşturabileceğiniz 77 baytlık bir dosya (dosya adı için +1) gerektirir :

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

3

JS, WIP, 252b veya 173 karakter

Bu bir işlev değildir, bu nedenle n değerini başlangıçta ayarlamanız gerekir (burada 3), ardından konsolda veya nodeJS'de yürütün.

İşte 252b sürümü:

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

Ve işte 173 karakter versiyonu ( http://xem.github.io/obfuscatweet/ kullanarak )

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

Konsolda test edilmiştir. Cool ve +1, ancak genellikle OP sadece bir dönüş değeri değil, bir çıkış istediğinde, bir çıkış ifadesi istenir (console.log veya alert gibi - nodeJS'de bilmiyorum).
edc65

haklısın ... Konsolu çıktı olarak değerlendirmeme izin verdim. : p (ayrıca, nodeJS yalnızca konsol afaik çıkışını verebilir)
xem

3

JavaScript (E6) 252257

String.repeat aşırı kullanımı

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

eğlenceli, ikimiz de 252b var ama tamamen farklı yaklaşımlarla :)
xem

3

JavaScript (ES3): 243 219 bayt

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 name2: yanlış çıktı, vücut segmentleri eşit olmamalı (tek ve hatta farklı)
edc65

1. Bunun nedeni FunctionExpression olması amaçlanmıştır. Ama bir ödev ekledim, o yüzden şimdi işe yarayacak. 2. Teşekkürler! İlk başta bunu fark etmedim.
subzey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.