Tegn “ Cool S ”

Introduktion

Vi kender alle den seje S (også kendt som Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S osv. osv.): milliarder skolebørn over hele verden tegnede denne S og følte sig straks stolt af sig selv. Hvis du “har glemt eller haft en fuldstændig ukold barndom , her er et billede af den seje cool S:

Givet en skaleringsfaktor n som input (hvor \ $ 1 \ leq n \ leq 20 \ $), skal du udsende Cool S i ASCII-art.

Sådan tegner du det

Fra Wikipedia-siden på Cool S:

Output

The Cool S når n = 1 er:

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

Og for forskellige værdier af n skal du blot gøre output n gange større. For eksempel, n = 2:

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

Bemærk, at de lodrette sektioner er to gange længere, og afstanden mellem lodrette linjer er to gange bredere.

Og når n = 3:

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

Bemærk: Selvom det ikke er nødvendigt ired, din kode kan muligvis også understøtte n = 0:

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

Vinde

Det korteste program i bytes vinder.

Kommentarer

  • Relateret: Tegn en S- Kæde
  • ASCII-bygningen 90 ‘ s barn i mig vil foreslå at bruge / \ i stedet for ^ til tip. Ser renere ud på den måde plus det opretholder den samme hældningshældning 🙂
  • @Flater eneste problem er, at / \ bruger to tegn, så den centrale lodrette linie bliver nødt til at blive forskudt, hvilket får det til at se meget rodet ud
  • @BetaDecay: Det ser fint ud på N = 2 og N = 3 (da det bevarer punktsymmetri), men jeg er enig i N = 1. Der er ‘ også muligheden for den omvendte V: Λ
  • @JacobGarby: Mit argument var stilistisk, ikke golfy 🙂

Svar

Charcoal , 58 53 47 43 41 byte

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

Prøv det online !

Jeg ville bare prøve en anden tilgang, dette trækker ydersiden via refleksioner (tak til Neil for at udvide ideen) og derefter tegner den indvendige del. Da Charcoal har :Left som standardretning til at tegne linjer, bruger jeg den retning så meget som muligt for at gemme nogle bytes ved at tegne S vandret, sådan:

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

Og så skal jeg bare dreje lærredet 90 grader mod uret.

Kommentarer

  • Du er muligvis på noget der … 22 bytes får dig udefra …
  • @Neil det var ikke ‘ t nøjagtigt sådan, din idé havde brug for en mindre løsning, men det har faktisk været en stor forbedring!
  • Ja, jeg lavede en lignende fejl på mit oprindelige indlæg, fordi jeg ikke gjorde det ‘ t kontroller effekten af skalering korrekt.
  • Sagde nogen Rotate? Det giver mig en idé …
  • @Neil hej, du fik en ganske forbedring der! 🙂

Svar

Python 3 , 255 249 248 209 byte

-6 bytes takket være Kevin Cruijssen

-1 byte takket være Kevin Cruijssen

-39 bytes takket være Rod og Jo King

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

Prøv det online!

Det håndterer nu n = 0.

Kommentarer

  • Begge o+~d kan være m-d og range(o) kan være range(m+1), og derefter kan du fjerne o=m+1\n for at gemme 6 byte. Et godt svar dog +1 fra mig.
  • Åh, og en byte mere ved at ændre p(s)\np(s[::-1]) til p(s+q+s[::-1]): 248 byte
  • Du kan gemme 6 byte, hvis du bruger en enkelt print og mere 4 ved at fjerne [] fra join([...]), alt 238 byte
  • Du kan også gemme q.join i en variabel for at gemme en byte
  • 217 . Sluttede sig til alle q.join s og et par andre ting

Svar

Charcoal , 47 42 41 bytes

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

Prøv det online! Link er en uddybende version af koden.Forklaring: Tegner følgende linjer i rækkefølge:

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

Hvor 5 er den aktuelle karakter af strengen v^. I slutningen af den første sløjfe placeres markøren derefter ved punktet 9. Hele lærredet roteres derefter, så den anden halvdel af Cool S kan tegnes. (Lærredet roteres faktisk to gange, men dette er bare en implementeringsdetalje.)

Charcoal understøtter ikke RotateCopy(:Up, 4) men hvis det gjorde det, ville dette fungere for 33 bytes:

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

Kommentarer

  • @BetaDecay Undskyld det. Jeg havde også den forkerte byte tæl alligevel …
  • Dejligt, det bliver også n = 0 rigtigt

Svar

Canvas , 36 32 29 bytes

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

Prøv det her!

En hel masse stakmanipulation. (Forældet) forklaring:

«|* 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 

Svar

Python 2 , 227 208 207 202 196 181 bytes

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

Prøv det online!

Stemmer til Jo King for 1 byte; og derefter yderligere 5 byte i alt (via n => 2*n).

Fungerer også for n=0.

Svar

C (gcc) , 379 353 344 334 bytes

Jeg brugte et par #define til subekspression eliminering og flere globaler til at kommunikere mellem de interne funktioner. Hovedsløjfen går {0,1,2,3,3,2,1,0} til at konstruere S.

Tak til Jonathan Frech for forslagene.

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

Prøv det online!

Kommentarer

Svar

C (gcc) , 260 254 bytes

-6 bytes takket være ceilingcat .

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

Prøv det online!

Rundown

Vi kan dele formen i dele:

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

Hver del kunne beskrives med et antal linjer, tre tegn og tre forhold til bestemte værdier, der bestemmer feltbredden på hver linje.

En første iteration kom at være:

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

Opkaldene til g() makro ser meget ud som om en tabel kunne konstrueres og løbes rundt. Feltbredder er undertiden relateret til indekstælleren og undertiden ikke. Vi kan generalisere feltbredden til at være F * i + A, hvor F er en faktor til at multiplicere i med, og A er en værdi at tilføje til bredden. Så den sidste bredde af det fjerde opkald ovenfor ville være -2 * i + t, for eksempel.

Således får vi:

 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.  

I sidste ende var det ikke meget kortere end en strammet version af g() ringer til en, men kortere er kortere.

Kommentarer

  • @ceilingcat Skål.
  • @ceilingcat Den udefinerede evalueringsrækkefølge for funktion argumenter giver mig pause.

Svar

Java, 435 byte

Selve funktionen tager 435 bytes. Der er bestemt plads til forbedring, “højt niveau” ved at analysere reglerne om, hvor man skal placere hvilken karakter (i sidste ende er S punkt-symmetrisk) og “lavt niveau” ved klassisk golf (måske trække en anden variabel ud kombinere to af for -loops). Men det er et første skud med dette ret ungolfiske sprog:

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

Kommentarer

  • Hej der. Import er en del af det antal byte, jeg ‘ er bange, så dit nuværende svar er faktisk 478 byte . Du kan dog golfe det ned til (tilfældigt nok) din nuværende 435 byte med nogle grundlæggende ting til golf.
  • Kunne spille golf mere til 405 byte ved at fjerne nogle variabler og bruge t=... lidt mindre, hvor det ville spare byte. Hvis du har spørgsmål om nogen af de ændringer, jeg har foretaget, så lad mig det vide. 🙂
  • Tak @KevinCruijssen, desværre kan jeg i øjeblikket ikke investere mere tid her – dette var bare en rekreativ ting og i betragtning af ” verbosity ” af Java, alligevel ikke en seriøs konkurrent 😉 Overvej at tilføje din løsning som et eget svar, selvom – har vi i det mindste noget sprogkonkurrence: -)

Svar

PHP , 378 374 378 377 376 335 331 328 byte

-3 byte takket være manatwork

-4 byte, brugte str_pad i stedet for str_repeat

-41 bytes takket være manatworks “forslag

-1 byte, flettede to trin i en + = 2

-1 byte, fjernede overflødig \

-4 bytes ved at ekko en gang. Glemte, at jeg havde brug for at sende strengen ind i funktionen, så dette er flere byte

Fungerer også for n = 0.

  

Prøv det online!

Kommentarer

  • Da funktionserklæringen er ret dyr, og du kun bruger t () to gange, ville den være kortere uden den . Hvis du udover de 9 meddelelser også tager 1 advarsel, kan du fjerne citaterne omkring 'v' i den sidste echo.
  • Du kunne bruge en enkelt sløjfe til de øverste og nederste skrå dele. Initialiseringen af $ a og $ i kunne komprimeres ved at flytte dem ved deres første brug.
  • Åh, og $i>0 og $m>0 kan skrives enkelt som $i og $m.
  • Med bageste mellemrum , som i nogle andre løsninger.
  • Du kan også flytte erklæringen på $ c til den første brug. Skift bare . sammenkædningen efter den til ,. Prøv det online!

Svar

Python 3 , 321 307 byte

Tak til @EsolangingFruit for at gemme 14 byte

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

Prøv det online!

Python 2 , 303 byte

 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)  

Prøv det online!

Kommentarer

  • Du kan erstatte '\\','/' på anden linje med *'\/' for at gemme tre byte.
  • 307 bytes: Prøv det online!
  • Tak! @EsolangingFruit! Jeg var ikke opmærksom på bitoperationer i Python. Det ville også spare et par byte at bruge Python2 på grund af delingen og parenteserne i print
  • I Python 2, input() automatisk eval() er strengen, så du også kan springe int() kaldet op.
  • For Python 3, kan du ændre den sidste linje til for l in L:print(*l,sep="") (Jeg tror ikke ‘ tror ikke, der er en ækvivalent i Python 2).

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *