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
Svar
Charcoal , 58 53 47 43 41 byte
Nθ≔⊕⊗θδ↗θ/⊗θ↘δ^‖B↓‖M← vMδ⁰⊗θ↗⊕θM⁰δ↗θ/⊗θ⟲T
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")
Det håndterer nå n = 0.
Kommentarer
- Begge
o+~d
kan værem-d
ogrange(o)
kan værerange(m+1)
, og så kan du fjerneo=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])
tilp(s+q+s[::-1])
: 248 byte - Du kan lagre 6 byte hvis du bruker en enkelt
print
, og mer 4 ved å fjerne[]
frajoin([...])
, 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^╋;╶╵\∔∔│α╶«├:╵╋:↔↕∔
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"])
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;}
Kommentarer
-
w -r-1
kan muligens golfes tilw~r
. - Selv om integreringen er en byte kortere .
- 344 byte .
- 321 byte
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);}
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.
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 sisteecho
. - 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))
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)
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()
automatiskeval()
er strengen, slik at du også kan hoppe overint()
. - 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).
Λ