"쿨 S"를 그립니다


38

소개

우리는 모두 멋진 S (Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S 등으로도 알려져 있음)를 알고 있습니다. 당신이 잊었거나 완전히 냉담한 어린 시절을 보냈을 때 , 여기 멋진 S의 이미지가 있습니다 :

n입력 ( ) 으로 배율을 지정 하면 Cool S를 ASCII 형식으로 출력합니다.1≤n≤20

그것을 그리는 방법

Cool S 의 Wikipedia 페이지 에서 :

산출

n= 1 인 경우 Cool S 는 다음과 같습니다.

   ^
  / \
 /   \
/     \
|  |  |
|  |  |
\  \  /
 \  \/
 /\  \
/  \  \
|  |  |
|  |  |
\     /
 \   /
  \ /
   v

그리고의 다른 값에 대해서는 n단순히 출력 n시간을 더 크게 만듭니다. 예를 들어 n= 2 :

     ^  
    / \
   /   \
  /     \
 /       \
/         \
|    |    |
|    |    |
|    |    |
|    |    |
\    \    /
 \    \  /
  \    \/
  /\    \
 /  \    \
/    \    \
|    |    |
|    |    |
|    |    |
|    |    |
\         /
 \       /
  \     /
   \   /
    \ /
     v

세로 섹션은 두 배 더 길고 세로 선 사이의 간격은 두 배 더 넓습니다.

그리고 n= 3 일 때 :

       ^
      / \
     /   \
    /     \
   /       \
  /         \
 /           \
/             \
|      |      |
|      |      |
|      |      |
|      |      |
|      |      |
|      |      |
\      \      /
 \      \    /
  \      \  /
   \      \/
   /\      \
  /  \      \
 /    \      \
/      \      \
|      |      |
|      |      |
|      |      |
|      |      |
|      |      |
|      |      |
\             /
 \           /
  \         /
   \       /
    \     /
     \   /
      \ /
       v

참고 : 필수는 아니지만 코드에서n= 0을 지원할 수도 있습니다.

 ^
/ \
\\/
/\\
\ /
 v

승리

바이트 단위의 최단 프로그램이 이깁니다.



ASCII 빌드 90의 아이는 팁 대신 ^ 대신 / \ 사용을 제안하려고합니다. 더 깨끗하게 보이고 플러스 경사도를 유지합니다 :)
— Flater

@Flater only problem은 / \가 두 문자를 사용한다는 점이다. 따라서 중앙 수직선은 오프셋이되어 매우 어수선 해 보일 것이다
— Beta Decay

@ BetaDecay : N = 2와 N = 3에서 잘 보입니다 (점 대칭을 유지하기 때문에). N = 1에 동의합니다. 거꾸로 V 옵션도 있습니다 :Λ
— Flater

2
@JacobGarby : 내 주장은 골프가 아니라 문체 적이었다 :)
— Flater

답변:


14

숯 , 58 53 47 43 41 바이트

Nθ≔⊕⊗θδ↗θ/⊗θ↘δ^‖B↓‖M← vMδ⁰⊗θ↗⊕θM⁰δ↗θ/⊗θ⟲T

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

방금 다른 접근법을 시도하고 싶었습니다. 이것은 반사를 통해 외부를 그리고 아이디어를 확장 한 Neil 덕분에 내부 부분을 그립니다. Charcoal은 :Left선을 그리는 기본 방향을 가지고 있으므로 다음과 같이 S를 가로로 그려서 바이트를 절약하기 위해 가능한 한 그 방향을 사용합니다.

     /----\    /----\     
    /      \  /      \    
   /        \/        \   
  /         /          \  
 /         /            \ 
v     ----/    /----     ^
 \            /         / 
  \          /         /  
   \        /\        /   
    \      /  \      /    
     \----/    \----/     

그런 다음 캔버스를 시계 반대 방향으로 90도 회전하면됩니다.


당신은 거기에 뭔가있을 수 있습니다 ... 22 바이트 는 모든 외부를 가져옵니다 ...
— Neil

@ Neil 그것은 정확히 그렇게 마음에 들지 않았습니다. 당신의 아이디어에는 사소한 수정이 필요했지만 실제로 이것은 크게 개선되었습니다!
— Charlie

예. 스케일링의 효과를 올바르게 확인하지 않았기 때문에 원본 게시물에서 비슷한 실수를했습니다.
— Neil

누군가가 말했 Rotate습니까? 그것은 나에게 아이디어를 준다 ...
— Neil

@ Neil 안녕하세요, 당신은 거기에 상당히 개선되었습니다! :-)
— Charlie

13

파이썬 (3) , 255 (249) 248 209 바이트

Kevin Cruijssen 덕분에 -6 바이트

Kevin Cruijssen 덕분에 -1 바이트

Rod와 Jo King 덕분에 -39 바이트

n=int(input())
m=2*n
a,b,q,c,l='\ \n/|'
f=m*b
s=q+q.join([f[d:]+c+b*2*d+b+a+f[d:]for d in range(m+1)]+[l+f+l+f+l]*m+[d*b+a+f+a+f[d*2:]+c+d*b for d in range(n)]+[n*b+a+f+a+c+n*b])
print(f,'^'+s+q+s[::-1]+f,'v')

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

이제 n = 0을 처리합니다.


둘 다 o+~d할 수 있습니다 m-d및 range(o)수 있습니다 range(m+1), 그리고 당신은 제거 할 수 있습니다 o=m+1\n6 바이트를 저장합니다. 그래도 좋은 대답은 +1입니다.
— Kevin Cruijssen

1
아, 그리고 하나 더 바이트 변경하여 p(s)\np(s[::-1])에 p(s+q+s[::-1]): 248 바이트
— 케빈 Cruijssen

당신은 당신이 하나를 사용하는 경우 6 바이트를 저장할 수 있습니다 print제거하여보다 4, []에서 join([...]), 238 바이트 합산
— 로드

q.join바이트를 저장하기 위해 변수에 저장할 수도 있습니다
— Rod

217 . 모두 q.join와 몇 가지 다른 일에 합류
— Jo King

13

숯 , 47 42 41 바이트

Fv^«↓⊗θ↘⊗⊕θ←↓⊗θ↙⊕⊗θ↖ι↖⊕⊗θ→↑⊗θ↗⊕θMθ⁺⊗θ⊕θ⟲⁴

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명 : 다음 라인을 순서대로 그립니다.

   ^
  / \
 /   \
/     \
|  1  |
|  1  |
\  2  /
 \  2/
 8\  2
8  \  2
7  |  3
7  9  3
6     4
 6   4
  6 4
   5

5문자열의 현재 문자는 어디에 있습니까 v^? 첫 번째 루프의 끝에서 커서는 지점에 위치합니다 9. 그런 다음 전체 캔버스를 회전시켜 Cool S의 다른 절반을 그릴 수 있습니다. (캔버스는 실제로 두 번 회전하지만 이는 구현 세부 사항 일뿐입니다.)

숯은 지원하지 RotateCopy(:Up, 4)않지만 만약 그렇다면 33 바이트에서 작동합니다.

↖^↖⊕⊗θ→↑⊗θ↗⊕θ‖BM↓↙⊗θ→↓⊗θ⟲C↑⁴J⁰¦⁰v

@BetaDecay 죄송합니다. 나는 또한 어쨌든 잘못된 바이트 수를 가졌다 ...
— Neil

니스, 그것도 n = 0을 얻는다
— Beta Decay

6

캔버스 , 36 32 29 바이트

«|*‼l├/L1^╋;╶╵\∔∔│α╶«├:╵╋:↔↕∔

여기 사용해보십시오!

많은 스택 조작. (오래된) 설명 :

«|*                                an array of input*2 "|"s
   ‼                               cast to a 2D object (needed because bug)
    :                              duplicate that (saved for the center line)
     l├                            height+2
       /                           create a diagonal that long
        L1^╋                       and in it, at (width; 1) insert "^"
            ;∔                     append the vertical bars
                               ^
                              /
          so far done:       / 
                            /  
                            |  
                            |  
              ⁸╵                   input+1
                \                  antidiagonal with that size
                 ∔                 appended to the above
                  │                mirror horizontally
                              ^
                             / \
                            /   \
                           /     \
                current:   |     |
                           |     |
                           \     /
                            \   /                                                       |
                   α               get the 2nd to last popped thing - the antidiagonal  |
                    └∔             append it to the vertical line copied way before:    \
                      ⁸«├          input/2 + 2                                            \
                         :╵        duplicate + 1
                           ╋       at (input/2 + 2; input/2 + 3) in the big part insert  ^
                            :↔↕∔   mirror a copy vertically & horizontally and append that to the original

3

파이썬 (2) , 227 (208) 207 202 196 181 바이트

I=n=2*input()
R,L,S,P='/\ |'
k=n*[2*(P+S*n)+P]
exec"k=[R+S+2*S*I+L]+k+-~I%2*[L+S*n+L+S*I+R];I-=1;"*-~n
print'\n'.join(t.center(2*n+3)for t in['^']+k+[a[::-1]for a in k[::-1]]+['v'])

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

1 바이트 동안 Jo King 에게 감사합니다 . 그리고 또 다른 5 바이트는 (via n => 2*n)입니다.

n=0잘 작동합니다 .


3

C (GCC) , 379 (353) 344 334 바이트

#define하위 표현식 제거를 위해 몇 가지를 사용 하고 내부 함수간에 통신하기 위해 여러 전역을 사용했습니다. 메인 루프는 {0,1,2,3,3,2,1,0}으로 이동하여 S를 구성합니다.

제안에 대한 Jonathan Frech에게 감사드립니다.

#define z(a,b...)printf("%*c%*c%*c\n"+a,b);}
#define y(a){for(i=~-a*t;v*i<v*a*!t+t;i+=v)
i,n,p,r,t,u,v;a(){z(6,r+2,94+t*24)b()y(-~r)z(3,-i-~r,47+u,i*2+2,92-u)c()y(r)z(0,~r,124,~r,124,~r,124)d()y(-~n)z(0,i+1,92-u,2*(n-t*i)+1,92,2*(n-!t*i)+1,47+u)(*x[])()={a,b,c,d};f(s){r=2*s;for(p=0;p<8;x[7*t-p++*(2*t-1)](n=s))t=p>3,v=2*!t-1,u=t*45;}

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


w -r-1에 골프를 칠 수도 있습니다 w~r.
— Jonathan Frech

그래도 인라이닝은 1 바이트 더 짧습니다 .
— Jonathan Frech



3

C (GCC) , 260 (254) 바이트

ceilingcat 덕분에 -6 바이트 .

f(n){int s=2*n++,t=s+1,I[]={1,t,s,n,n,s,t,1},A[]={s,1,1,1,2*t,1,t,t,1,t,1,n,t,t,1,t,t,1,1,1,t,s,1,1},x;for(s=8;s--;)for(n=0;n<I[s];n++,puts(""))for(t=3;t--;)x=s*3+t,printf("%*c",n*("AAAA?BAAAAC@?ABAAACA@AAA"[x]-65)+A[x],"w!!!0]}}}]]00]]}}}]!0_!!"[x]-1);}

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

개요

모양을 여러 부분으로 나눌 수 있습니다.

 ^           Top cap
/ \          Top slope
|||          Sides
\\/          Twist, part 1
/\\          Twist, part 2
|||          Sides
\ /          Bottom slope
 v           Bottom cap

각 부분은 각 줄의 필드 너비를 결정하는 특정 값에 대한 여러 줄, 세 개의 문자 및 세 가지 관계로 설명 할 수 있습니다.

첫 번째 반복은 다음과 같습니다.

#define g(x,s,A,B,C)for(i=0;i<x;i++)printf("%*c%*c%*c\n",A,*s,B,s[1],C,s[2]);
f(n)
{
    int s=2*n++,t=s+1,i;

    g(1,  "  ^",  1,      1,  t-1)
    g(t, "/ \\",t-i,      1,2*i+1)
    g(s,  "|||",  1,      t,    t)
    g(n,"\\\\/",i+1,      t,t-2*i)
    g(n,"/\\\\",n-i,  2*i+1,    t)
    g(s,  "|||",  1,      t,    t)
    g(t, "\\/ ",i+1,2*t-2*i,    1)
    g(1,  "  v",  1,      1,  t-1)
}

g()매크로에 대한 호출 은 테이블을 구성하고 반복하는 것처럼 보입니다. 필드 너비는 때때로 인덱스 카운터와 관련이 있으며 때로는 그렇지 않습니다. 필드 너비를로 일반화 할 수 있습니다 F * i + A. 여기서 F는 곱할 요소 i이고 A는 너비에 더할 값입니다. -2 * i + t예를 들어 위의 네 번째 호출의 마지막 너비는 입니다.

따라서 우리는 다음을 얻습니다.

f(n){int s=2*n++,t=s+1,         s = size of "side" parts, t = size of top and bottom slopes
I[]={1,t,s,n,n,s,t,1},          The number of lines per part.
A[]={...},x;                    A[] holds the values to add to each field-width.
for(s=8;s--;)                   Loop through the parts.
for(n=0;n<I[s];n++,puts(""))    I[s] decides how many lines to the part. Ends with newline.
for(t=3;t--;)                   Go through the three chars of each line.
x=s*3+t,                        Calculate offset.
printf("%*c",                   Print the char.
n*("..."[x]-65)+A[x],           Build field-width. The string holds the index factor, A[]
                                holds the offset part.
"..."[x]-1);}                   The char itself is grabbed from the string.
                                Shifted by 1 to eliminated double backspaces.

결국 그것은 g()호출하는 버전의 강화 버전보다 훨씬 짧지는 않지만 더 짧습니다 .


@ceilingcat 건배.
— gastropner

@ceilingcat 함수 인수의 정의되지 않은 평가 순서는 일시 중지를 제공합니다.
— gastropner

2

자바, 435 바이트

함수 자체는 435 바이트를 사용합니다. 클래식 골프를 통해 어떤 캐릭터를 배치 할 위치 (S는 점-대칭)에 대한 규칙을 분석하여 "높은 수준"과 "낮은 수준"을 개선 할 여지가 분명히 있습니다. - for루프 중 두 개를 결합 ). 그러나 이것은 다소 골치 아픈 언어로 처음으로 촬영되었습니다.

import static java.util.Arrays.*;
import static java.lang.System.*;

public class CoolS
{
    public static void main(String[] args)
    {
        print(1);
        print(2);
        print(3);
    }
    static void print(int n){int i,r,d=3+6*n,w=3+n*4,h=6+n*10,m=n+n,v=w/2,k=h-1,j=w-1;char t[],S='/',B='\\',P='|',s[][]=new char[h][w];for(char x[]:s)fill(x,' ');s[0][v]='^';s[k][v]='v';for(i=0;i<1+m;i++){r=i+1;t=s[r];t[v-r]=S;t[v+r]=B;t=s[k-r];t[v-r]=B;t[v+r]=S;}for(i=0;i<m;i++){r=2+m+i;t=s[r];t[0]=t[v]=t[j]=P;t=s[k-r];t[0]=t[v]=t[j]=P;}for(i=0;i<1+n;i++){r=2+m+m+i;t=s[r];t[i]=t[i+1+m]=B;t[j-i]=S;t=s[d-i];t[i]=S;t[v-i]=t[j-i]=B;}for(char x[]:s)out.println(x);}
}

안녕. 가져 오기는 내가 두려워하는 바이트 수의 일부이므로 현재 답변은 실제로 478 바이트 입니다. 그러나 골프에 대한 몇 가지 기본 사항을 사용 하여 현재 435 바이트 로 (동일하게) 골프를 줄 수 있습니다 .
— Kevin Cruijssen

일부 변수를 제거 하고 바이트를 저장할 위치를 조금 줄임 으로써 조금 더 405 바이트 까지 골프를 즐길 수있었습니다 t=.... 내가 변경 한 사항에 대해 궁금한 점이 있으면 알려주십시오. :)
— Kevin Cruijssen

덕분에 @KevinCruijssen, 불행하게도 나는 현재 여기에 더 많은 시간을 투자 할 수없는 -이 단지 오락 일, 그리고하지 심각한 경쟁이 어쨌든 ;-) 불구하고 자신의 답변으로 솔루션을 추가 고려 자바의 "상세"를 고려했다 - 그 다음 우리 적어도 일부 언어 내 경쟁이 있습니다 :-)
— Marco13

2

PHP , 378 374 378 377 376 335 331 328 바이트

manatwork 덕분에 -3 바이트

-4 바이트, str_repeat 대신 str_pad 사용

manatworks의 제안 덕분에 -41 바이트

-1 바이트, 두 증분을 + = 2로 병합

-1 바이트, 불필요한 \ 제거

한 번 에코하여 -4 바이트. 문자열이 함수에 전달되어 더 많은 바이트가 필요하다는 것을 잊었습니다.

n = 0에서도 작동합니다.

function s($b){return str_pad($w,$b);}echo s($i=1+$a=2*$argv[1]).'^
';for(;$i;$j++,$y=$z.$y)echo$z=s(--$i).'/'.s(++$j).'\
';for(;$k<$a;$k++)$x.='|'.s($a).'|'.s($a).'|
';echo$x;for(;$l<=$a/2;)echo s($m++).$c='\\',s($a).$c.s($a-$l++*2).'/
';for(;$m;$n+=2)echo s(--$m).'/'.s($n).$c.s($a).'\
';echo$x.strtr($y,'/\\','\/').s($a+1).v;

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


1
함수 선언은 꽤 비싸고 t ()를 두 번만 사용 하므로 그것 없이는 더 짧을 것 입니다. 9 개의 통지 옆에 1 개의 경고도 표시 'v'되는 경우 final에서 따옴표를 제거 할 수 있습니다 echo.
— manatwork

1
상단 및 하단 경사 부분에 단일 루프 를 사용할 수 있습니다 . $ a 및 $ i의 초기화는 처음 사용할 때 이동하여 압축 할 수 있습니다.
— manatwork

1
아, 그리고 $i>0과 $m>0같이 간단하게 쓸 수 $i및 $m.
— manatwork

1
다른 솔루션과 마찬가지로 후행 공백이 있습니다.
— manatwork

1
$ c의 선언을 첫 번째 사용법으로 옮길 수도 있습니다. .연결을로 변경하십시오 ,. 온라인으로 사용해보십시오!
— manatwork

1

파이썬 3 , 321,307 바이트

14 바이트를 절약 해 준 @EsolangingFruit에게 감사합니다

n=int(input())
b,f='\/'
c,l=4*n+3,10*n+6
r=range
h=c//2
L=[c*[' ']for _ in r(l)]
L[0][h],L[-1][h]='^v'
for i in r(h):a=L[h-i];a[i],a[c+~i]=f,b
for i in r(2*n):L[h-~i][0::h]='|'*3
for i in r(n+1):a=L[h+h+i];a[c+~i],a[i:c-1:h]=f,b*2
for i in r(1,l//2):L[l+~i]=L[i][::-1]
print('\n'.join(''.join(i)for i in L))

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

파이썬 2 , 303 바이트

n=int(input())
b,f='\/'
c,l,r=4*n+3,10*n+6,range
h=c/2
L=[c*[' ']for _ in r(l)]
L[0][h],L[-1][h]='^v'
for i in r(h):a=L[h-i];a[i],a[c+~i]=f,b
for i in r(2*n):L[h-~i][0::h]='|'*3
for i in r(n+1):a=L[h+h+i];a[c+~i],a[i:c-1:h]=f,b*2
for i in r(1,l/2):L[l+~1]=L[i][::-1]
print'\n'.join(''.join(i)for i in L)

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


'\\','/'두 번째 줄에서 *'\/'3 바이트를 절약 할 수 있습니다 .
— Esolanging 과일


감사! @EsolangingFruit! 파이썬에서 비트 연산을 알지 못했습니다. 또한 나누기와 괄호로 인해 Python2를 사용하기 위해 몇 바이트를 절약 할 수 있습니다.print
— Pétur

Python 2에서는 문자열을 input()자동으로 지정 eval()하므로 int()호출을 건너 뛸 수 있습니다.
— Esolanging 과일

Python 3의 경우 마지막 줄을 for l in L:print(*l,sep="")(Python 2에 해당하는 것으로 생각하지 않습니다) 로 변경할 수 있습니다 .
— Esolanging 과일
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.