“ Cool S ”

소개 h2 그리기 >

우리 모두는 멋진 S (Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S 등으로도 알려짐)를 알고 있습니다. 전 세계 수십억 명의 학생들이이 S를 그렸고 즉시 자랑스러워했습니다. 그들 자신의. 완전히 쿨하지 않은 어린 시절 을 잊었거나 잊은 경우를 대비하여 다음은 멋진 S의 이미지입니다.

배율 계수 n를 입력 (\ $ 1 \ leq n \ leq 20 \ $)으로 지정하면 Cool S가 ASCII 아트로 출력됩니다.

그리는 방법

Cool S의 Wikipedia 페이지 에서 :

출력

n = 1 일 때 Cool S는 다음과 같습니다.

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

n의 다른 값에 대해 출력을 n 배 더 크게 만듭니다. 예 : n = 2 :

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

세로 섹션이 두 배 더 길고 세로줄이 두 배 더 넓습니다.

그리고 n = 3 :

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

참고 : 필수는 아니지만 당신의 코드는 n = 0을 지원할 수도 있습니다 :

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

승리

가장 짧은 프로그램이 이깁니다.

댓글

  • 관련 : S- 그리기 Chain
  • ASCII 구축 90 ‘의 아이는 ^ 대신 / \를 팁으로 사용하도록 제안하고 싶습니다. 그런 식으로 더 깨끗해 보이며 동일한 경사 경사를 유지합니다. 🙂
  • @Flater 유일한 문제는 / \가 두 문자를 사용하므로 중앙 수직선이 오프셋되어야하므로 매우 깔끔하게 보입니다
  • @BetaDecay : N = 2 및 N = 3 (점 대칭을 유지하기 때문에)에서는 괜찮아 보이지만 N = 1에 동의합니다. ‘도 거꾸로 된 V 옵션도 있습니다. Λ
  • @JacobGarby : 제 주장은 문체였습니다. 골퍼 아님 🙂

답변

a>, 58 53 47 43 41 바이트

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

온라인으로 사용해보기 !

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

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

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

댓글

  • 당신은 거기에 뭔가를 할 수 있습니다 … 22 바이트 는 당신을 모든 외부로 가져옵니다 …
  • @Neil it wasn ‘ 그렇지 않습니다. 아이디어를 약간 수정해야했지만 실제로는 크게 개선되었습니다.
  • 예, 원래 게시물에서 비슷한 실수를했습니다. ‘ 확장 효과를 올바르게 확인하지 않았습니다.
  • 누군가 Rotate라고 말했습니까? 그게 나에게 아이디어를 준다 …
  • @Neil 헤이, 당신은 거기에서 상당히 향상되었습니다! 🙂

답변

Python 3 , 255 249 248 209 바이트

-6 바이트, Kevin Cruijssen 덕분에

-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(m+1) 일 수 있으며, o=m+1\n를 제거하여 6 바이트를 절약 할 수 있습니다. 좋은 대답입니다. +1.
  • 아, 그리고 p(s)\np(s[::-1])p(s+q+s[::-1])로 변경하여 1 바이트 더 추가 : 248 바이트
  • 단일 print 등을 사용하면 6 바이트를 절약 할 수 있습니다. 4. join([...])에서 []를 제거하여 총 238 바이트
  • 변수에 q.join를 저장하여 바이트를 저장할 수도 있습니다.
  • 217 . 모든 q.join 및 기타 몇 가지 항목에 참여했습니다.

답변

차콜 , 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는 문자열

. 첫 번째 루프의 끝에서 커서는 9 지점에 위치합니다. 그런 다음 전체 캔버스가 회전되어 Cool S의 나머지 절반을 그릴 수 있습니다. (캔버스는 실제로 두 번 회전되지만 이는 구현 세부 정보 일뿐입니다.)

Charcoal은 “RotateCopy(:Up, 4)를 지원하지 않지만 지원한다면이 기능은 작동합니다. 33 바이트 :

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

댓글

  • @BetaDecay 죄송합니다. 또한 바이트가 잘못되었습니다. 어쨌든 계산 …
  • 좋습니다. n = 0도 맞습니다.

답변

캔버스 , 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 

답변

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

온라인으로 사용해보세요!

Jo King 에게 1 바이트 감사합니다. 그 다음 총 5 바이트 (n => 2*n를 통해).

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

답변

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

나는 몇 개의 #define를 하위 표현식 제거에 사용했습니다. 내부 기능 사이에서 통신하는 전역. 메인 루프는 S를 생성하기 위해 {0,1,2,3,3,2,1,0}로 이동합니다.

제안 해 주신 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;}  

온라인으로 사용해보세요!

댓글

답변

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  

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

첫 번째 반복이 왔습니다. 예정 :

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

매크로는 테이블을 구성하고 반복 할 수있는 것처럼 보입니다. 필드 너비는 때때로 인덱스 카운터와 관련이 있지만 때로는 그렇지 않습니다. 필드 너비를 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 건배
  • @ceilingcat 정의되지 않은 함수 평가 순서 인수가 잠시 멈 춥니 다.

답변

Java, 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);} } 

댓글

  • 안녕하세요. 가져 오기는 바이트 수 I ‘ 안타깝게도 현재 답변은 실제로 478 바이트 입니다. 그러나 골프에 대한 몇 가지 기본 사항을 사용하여 현재 435 바이트 까지 골프를 칠 수 있습니다.
  • 일부 변수를 제거하고 t=... div를 사용하여 405 바이트 까지 조금 더 골프를 칠 수있었습니다. > 바이트를 절약 할 수있는 곳이 조금 적습니다. 변경 사항에 대해 궁금한 점이 있으면 알려주십시오. 🙂
  • @KevinCruijssen에게 감사합니다. 안타깝게도 현재 여기에 더 많은 시간을 투자 할 수 없습니다. 이것은 단지 오락 용이며 ” 장황함 Java, 어쨌든 심각한 경쟁자는 아닙니다 .-) 솔루션을 자체 답변으로 추가하는 것을 고려하십시오. 그런 다음 적어도 언어 내 경쟁이 있습니다. 🙂

답변

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

-3 바이트, manatwork 덕분에

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

-41 바이트, manatworks 덕분에 “제안

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

-1 바이트로 병합, 에코를 통해 불필요한 \

-4 바이트 제거 한 번. 문자열을 함수에 전달해야한다는 것을 잊었습니다. 그래서 이것은 더 많은 바이트입니다.

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

  

온라인으로 사용해보세요!

댓글

  • 함수 선언이 상당히 비싸고 t ()를 두 번만 사용하므로 없이 더 짧아집니다. 9 개의 알림 외에 1 개의 경고도 표시하는 경우 마지막 echo에서 'v' 주위의 따옴표를 제거 할 수 있습니다.
  • 상단 및 하단 경사 부분에 단일 루프를 사용 할 수 있습니다. $ a 및 $ i의 초기화는 처음 사용할 때 이동하여 압축 할 수 있습니다.
  • 아, 그리고 $i>0$m>0$i$m로 간단히 작성할 수 있습니다.
  • 후행 공백이있는 다른 솔루션과 마찬가지로
  • $ c 선언을 첫 번째 용도로 이동할 수도 있습니다. . 연결을 ,로 변경하면됩니다. 온라인으로 사용해보세요!

답변

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

온라인으로 사용해보세요!

Python 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 바이트를 절약 할 수 있습니다.
  • 307 바이트 : 온라인으로 사용해보세요!
  • 감사합니다! 트윗 담아 가기 나는 파이썬에서 비트 연산을 인식하지 못했습니다. 또한 print
  • 의 나누기와 괄호로 인해 Python2를 사용하는 데 몇 바이트가 절약됩니다.

  • Python 2에서는 input()는 문자열을 자동으로 eval()하므로 int() 호출도 건너 뛸 수 있습니다.
  • Python의 경우 3, 마지막 줄을 for l in L:print(*l,sep="")로 변경할 수 있습니다 (Python 2에는 이에 상응하는 것이 있다고 생각하지 않습니다 ‘).

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다