Tegn “ Cool S ” (Norsk)

Innledning

Vi kjenner alle de kule S (også kjent som Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S etc. etc.): milliarder skolebarn over hele verden tegnet denne S og følte seg straks stolt av seg selv. I tilfelle du «har glemt eller hatt en helt ukom barndom , her er et bilde av den kule S:

Gitt en skaleringsfaktor n som inngang (der \ $ 1 \ leq n \ leq 20 \ $), send Cool S ut i ASCII-art.

Hvordan tegne det

Fra Wikipedia-siden på Cool S:

Utgang

Den kule S når n = 1 er:

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

Og for forskjellige verdier av n, gjør du bare output n ganger større. For eksempel, n = 2:

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

Merk at de vertikale snittene er to ganger lengre og avstanden mellom vertikale linjer er to ganger bredere.

Og når n = 3:

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

Merk: Selv om det ikke er nødvendig ired, kan det hende at koden din også kan støtte n = 0:

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

Vinne

Det korteste programmet i byte vinner.

Kommentarer

  • Relatert: Tegn en S- Kjede
  • ASCII-bygningen 90 ‘ s gutt i meg vil foreslå å bruke / \ i stedet for ^ for tipset. Ser renere ut på den måten, pluss at den opprettholder samme hellingshelling 🙂
  • @Flater eneste problemet er at / \ bruker to tegn, så den sentrale vertikale linjen må forskyves som gjør at den ser veldig uryddig ut
  • @BetaDecay: Det ser bra ut på N = 2 og N = 3 (siden det beholder punktsymmetri), men jeg er enig i N = 1. Der ‘ er også muligheten for den opp ned V: Λ
  • @JacobGarby: Argumentet mitt 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 annen tilnærming, dette trekker utsiden via refleksjoner (takk til Neil for å utvide ideen) og tegner deretter innsiden. Ettersom Charcoal har :Left som standardretning for å tegne linjer, bruker jeg den retningen så mye som mulig for å lagre noen byte ved å tegne S horisontalt, slik:

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

Og så trenger jeg bare å rotere lerretet 90 grader mot klokken.

Kommentarer

  • Du kan være på noe der … 22 byte får deg hele utsiden …
  • @Neil det var ikke ‘ t akkurat slik, ideen din trengte en mindre løsning, men dette har virkelig vært en stor forbedring!
  • Ja, jeg gjorde en lignende feil på mitt opprinnelige innlegg fordi jeg ikke gjorde det ‘ t sjekk effekten av skalering riktig.
  • Sa noen Rotate? Det gir meg en ide …
  • @Neil hei, du fikk en ganske forbedring der! 🙂

Svar

Python 3 , 255 249 248 209 byte

-6 byte takket være Kevin Cruijssen

-1 byte takk til Kevin Cruijssen

-39 byte takk til 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 nå n = 0.

Kommentarer

  • Begge o+~d kan være m-d og range(o) kan være range(m+1), og så kan du fjerne o=m+1\n for å lagre 6 byte. Fint svar skjønt, +1 fra meg.
  • Åh, og en byte til ved å endre p(s)\np(s[::-1]) til p(s+q+s[::-1]): 248 byte
  • Du kan lagre 6 byte hvis du bruker en enkelt print, og mer 4 ved å fjerne [] fra join([...]), totalt 238 byte
  • Du kan også lagre q.join i en variabel for å lagre en byte
  • 217 . Sluttet seg til alle q.join -ene, og et par andre ting

Svar

Charcoal , 47 42 41 bytes

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

Prøv det online! Linken er for å utdype versjonen av koden.Forklaring: Tegner følgende linjer i rekkefølge:

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

Hvor 5 er gjeldende karakter av strengen v^. På slutten av den første sløyfen blir markøren deretter plassert ved punkt 9. Hele lerretet blir deretter rotert slik at den andre halvdelen av Cool S kan tegnes. (Lerretet blir faktisk rotert to ganger, men dette er bare en detalj for implementeringen.)

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

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

Kommentarer

  • @BetaDecay Beklager det. Jeg hadde også feil byte teller uansett …
  • Fint, det blir også n = 0 riktig

Svar

Canvas , 36 32 29 byte

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

Prøv det her!

Mye bunkemanipulering. (Utdatert) 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 byte

 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!

Beretter Jo King for 1 byte; og deretter ytterligere 5 byte totalt (via n => 2*n).

Fungerer også for n=0.

Svar

C (gcc) , 379 353 344 334 byte

Jeg brukte et par #define for subekspresjon eliminering og flere globaler for å kommunisere mellom de interne funksjonene. Hovedsløyfen går til {0,1,2,3,3,2,1,0} for å konstruere S.

Takk 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 byte

-6 byte 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 deler:

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

Hver del kan beskrives med et antall linjer, tre tegn og tre forhold til bestemte verdier som bestemmer feltbredden på hver linje.

En første iterasjon kom å 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) }  

Anropene til g() makro ser veldig ut som en tabell kan konstrueres og løpes over. Feltbredder er noen ganger relatert til indeksetelleren, og noen ganger ikke. Vi kan generalisere feltbredden til å være F * i + A, hvor F er noen faktor å multiplisere i med, og A er en verdi å legge til til bredden. Så den siste bredden av den fjerde samtalen ovenfor vil være -2 * i + t, for eksempel.

Dermed 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.  

Til slutt var det ikke mye kortere enn en innstrammet versjon av g() ringer en, men kortere er kortere.

Kommentarer

  • @ceilingcat Skål.
  • @ceilingcat Den udefinerte evalueringsrekkefølgen for funksjonen argumenter gir meg pause.

Svar

Java, 435 byte

Selve funksjonen tar 435 byte. Det er absolutt rom for forbedring, «høyt nivå» ved å analysere reglene om hvor du skal plassere hvilket tegn (til slutt er S punkt-symmetrisk), og «lavt nivå», ved klassisk golf (kanskje trekke ut en annen variabel eller kombinere to av for -løkkene). Men det er et første skudd med dette ganske ugolfiske språket:

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

  • Hei. Import er en del av byte-tellingen I ‘ er redd, så ditt nåværende svar er faktisk 478 byte . Du kan imidlertid spille golf ned til (tilfeldig nok) din nåværende 435 byte med noen grunnleggende ting å spille golf.
  • Har kunnet golf litt mer til 405 byte ved å fjerne noen variabler og bruke t=... litt mindre der det vil spare byte. Hvis du har spørsmål om noen av endringene jeg har gjort, så gi meg beskjed. 🙂
  • Takk @KevinCruijssen, dessverre kan jeg for tiden ikke investere mer tid her – dette var bare en rekreasjon, og med tanke på » verbosity » av Java, uansett ikke en seriøs konkurrent 😉 Vurder å legge til løsningen som et eget svar, skjønt – da har vi i det minste litt språkkonkurranse: -)

Svar

PHP , 378 374 378 377 376 335 331 328 byte

-3 byte, takket være manatwork

-4 byte, brukte str_pad i stedet for str_repeat

-41 byte, takket være manatworks «forslag

-1 byte, slått sammen to trinn til a = 2

-1 byte, fjernet overflødig \

-4 byte ved å ekko en gang. Glemte at jeg trengte å sende strengen inn i funksjonen så dette er flere byte

Fungerer også for n = 0.

  

Prøv det online!

Kommentarer

  • Ettersom funksjonserklæringen er ganske dyr og du bruker t () bare to ganger, ville det vært kortere uten den . Hvis du ved siden av de 9 merknadene tar 1 advarsel, kan du fjerne anførselstegnene rundt 'v' i den siste echo.
  • Du kan bruke en enkelt sløyfe for de øverste og nederste skrå delene. Initialiseringen av $ a og $ i kan komprimeres ved å flytte dem ved første gangs bruk.
  • Åh, og $i>0 og $m>0 kan skrives enkelt som $i og $m.
  • Med etterfølgende mellomrom , som i noen andre løsninger.
  • Du kan også flytte erklæringen på $ c til den første bruken. Bare endre . sammenkoblingen etter den til ,. Prøv det online!

Svar

Python 3 , 321 307 byte

Takk til @EsolangingFruit for lagring av 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å andre linje med *'\/' for å lagre tre byte.
  • 307 byte: Prøv det online!
  • Takk! @EsolangingFruit! Jeg var ikke klar over bitoperasjoner i Python. Det vil også spare noen byte å bruke Python2 på grunn av delingen og parentesene i print
  • I Python 2, input() automatisk eval() er strengen, slik at du også kan hoppe over int().
  • For Python 3, kan du endre den siste linjen til for l in L:print(*l,sep="") (Jeg tror ikke ‘ t tror det er en ekvivalent i Python 2).

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *