"쿨 S"를 그립니다


38

소개

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

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

그것을 그리는 방법

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-drange(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.