레트로 로켓 인쇄


13

(이 SO 질문에서 영감을 얻음 )

입력으로 단일 양의 정수 n이 제공 됩니다.

가능한 적은 문자로 ASCII 아트로 머리, 꼬리 및 n 개의 세그먼트 로 구성된 몸체를 가진 로켓을 출력합니다 . 뒤에 공백이나 줄 바꿈이 없어야합니다.

로켓의 머리와 꼬리는 항상 n 값에 대해 동일합니다 . 몸체는 교대로 두 가지 유형의 세그먼트로 구성됩니다. 예제는 로켓의 구조를 명확하게해야합니다.

n = 1에 대한 출력

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

n = 2에 대한 출력

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

n = 3에 대한 출력

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

3
우리의 천적에서 관련 게시물 : codereview.stackexchange.com/questions/65040/…

답변:


6

CJam, 67 63 자

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

온라인 통역사 에서 작동합니다 .

작동 원리

유니 코드 문자열을 푸시 한 후 스 니펫

6e4b127b:c~

문자열을 기본 60000에서 기본 127로 변환하고 문자열로 캐스트하고 결과를 평가합니다.

실행되는 코드는 다음과 같습니다.

"..."          " 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
실제로 이것을 바이트 단위로 계산해야합니까?
Claudiu

8
@Claudiu : 그리고 내 점수를 망치나요? : P 답변은 기본적으로 길이 바이트로 점수가 매겨 지지만 가능한 한 적은 문자로 말하면 질문이 우선 합니다 .
Dennis

10

CJam, 121 바이트

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

온라인으로 사용해보십시오

STDIN을 통해 입력 n 을 가져옵니다 .

나중에 설명을 추가하겠습니다. 기본적으로 그것은 매우 순진한 방식으로 단지 많은 루프입니다. 두 개의 다른 신체 부위 사이의 대체에, 나는 부분 이상 루프를 통해 중첩 루프 가지고 01. 그런 다음 외부 반복자와 내부 반복자를 추가하고 패리티를 사용하여 위쪽 또는 아래쪽을 가리키는 삼각형을 결정합니다.


내가 가지고 java.util.NoSuchElementException복사 + 붙여 넣기 코드 (가리키는 Lri)
Claudiu

@Claudiu "입력"필드에 정수를 입력 했습니까?
Martin Ender

아, 그래요!
Claudiu

5

루비, 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

언 골프

이 경우 골프가 아닌 버전을 사용하는 것이 좋습니다.

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

설명

나는 이것이 효율적인 곳이 아닌지 의심하지만 그럼에도 불구하고 재미있었습니다.

  • 에서 입력을받습니다 ARGV.
  • h의 "머리"와 로켓의 "꼬리"를 포함 r로켓의 다른 부분을 분리하고 "능선"를 포함 m하고 p로켓의 "몸"의 상단과 하단 부분입니다를.
  • 몸은를 통해 순환 Array ["ridge", "top of body", "bottom of body", "ridge", "bottom of body", "top of body"]하고 첫 번째 3*n요소를 취함으로써 구성됩니다.
  • puts 모든 것이 자체 라인을 갖도록합니다.

3

파이썬, 120 + 77 + 1 = 198 자

이것은 잘못된 접근 방식으로 끝났지 만 Martin이 그의 대답을 게시했을 때 이미 끝났습니다.

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

R77 바이트 의 파일 (파일 이름은 +1)이 필요하며 다음과 같이 생성 할 수 있습니다.

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

3

JS, WIP, 252b 또는 173 자

함수가 아니므로 처음에 n 값을 설정하고 (여기서는 3) 콘솔 또는 nodeJS에서 실행해야합니다.

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

그리고 여기 173 문자 버전이 있습니다 ( http://xem.github.io/obfuscatweet/ 사용 )

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

콘솔에서 테스트되었습니다. 차갑고 +1이지만 일반적으로 OP가 단순한 반환 값이 아닌 출력을 요청하면 console.log 또는 alert과 같은 출력 문이 요청됩니다 (노드 JS에서는 알 수 없음).
edc65

네 말이 맞아. 나는 콘솔을 출력으로 생각할 수 있었다. : p (또한 nodeJS는 콘솔 afaik에서만 출력 할 수 있습니다)
xem

3

자바 스크립트 (E6) 25257

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

그것은 재미있다, 우리 둘 다 252b를 가지고 있지만 완전히 다른 접근법을 가지고있다 :)
xem

3

자바 스크립트 (ES3) : 243 219 바이트

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 : 잘못된 출력, 바디 세그먼트가 동일하지 않아야합니다 (홀수 및 심지어 다름)
edc65

1. FunctionExpression이 목적이기 때문입니다. 그러나 과제를 추가 했으므로 이제 작동합니다. 2. 감사합니다! 나는 처음에 그것을 알아 차리지 못했습니다.
subzey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.