레트로 로켓 인쇄


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 을 가져옵니다 .

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


내가 가지고 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.