Rita “ Cool S ”

Inledning

Vi känner alla coola S (även känd som Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S etc. etc.): miljarder skolbarn runt om i världen ritade denna S och kände sig omedelbart stolt av sig själva. Om du har glömt bort eller haft en helt okyld barndom , här är en bild av den coola S:

Med en skalfaktor n som ingång (där \ $ 1 \ leq n \ leq 20 \ $), mata ut Cool S i ASCII-konst.

Hur man ritar det

Från Wikipedia-sidan på Cool S:

Output

Cool S när n = 1 är:

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

Och för olika värden på n, gör du helt enkelt utgången n gånger större. exempel, n = 2:

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

Observera att de vertikala sektionerna är två gånger längre och avståndet mellan vertikala linjer är två gånger bredare.

Och när n = 3:

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

Obs: Även om det inte krävs ired kan din kod också ha stöd för n = 0:

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

Vinnande

Det kortaste programmet i byte vinner.

Kommentarer

  • Relaterat: Rita en S- Kedja
  • ASCII-byggnaden 90 ’ s barn i mig vill föreslå att du använder / \ istället för ^ för tipset. Ser renare ut på det sättet, plus att den bibehåller samma lutningslutning 🙂
  • @Flater enda problemet är att / \ använder två tecken, så den centrala vertikala linjen måste förskjutas vilket gör att den ser väldigt orolig ut
  • @BetaDecay: Det ser bra ut på N = 2 och N = 3 (eftersom det behåller punktsymmetri), men jag håller med om N = 1. Där ’ är också alternativet för upp och ner V: Λ
  • @JacobGarby: Mitt argument var stilistiskt, inte golfy 🙂

Svar

Charcoal , 58 53 47 43 41 byte

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

Prova online !

Jag ville bara prova ett annat tillvägagångssätt, detta drar utsidan via reflektioner (tack vare Neil för att utvidga idén) och sedan ritar den inre delen. Eftersom Charcoal har :Left som standardriktning för att rita linjer använder jag den riktningen så mycket som möjligt för att spara vissa byte genom att rita S horisontellt, så här:

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

Och då behöver jag bara rotera duken 90 grader moturs.

Kommentarer

  • Du kanske är på något där … 22 byte ger dig hela utsidan …
  • @Neil det var inte ’ t exakt så, din idé behövde en mindre fix, men det har verkligen varit en stor förbättring!
  • Ja, jag gjorde ett liknande misstag i mitt ursprungliga inlägg eftersom jag inte gjorde det ’ t kolla effekten av skalning korrekt.
  • Sa någon Rotate? Det ger mig en idé …
  • @Neil hej, du fick en förbättring där! 🙂

Svar

Python 3 , 255 249 248 209 byte

-6 byte tack vare Kevin Cruijssen

-1 byte tack till Kevin Cruijssen

-39 byte tack till Rod och 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")  

Prova online!

Det hanterar nu n = 0.

Kommentarer

  • Båda o+~d kan vara m-d och range(o) kan vara range(m+1), och sedan kan du ta bort o=m+1\n för att spara 6 byte. Trevligt svar dock, +1 från mig.
  • Åh, och en byte till genom att ändra p(s)\np(s[::-1]) till p(s+q+s[::-1]): 248 byte
  • Du kan spara 6 byte om du använder en enda print och mer 4 genom att ta bort [] från join([...]), totalt 238 byte
  • Du kan också lagra q.join i en variabel för att spara en byte
  • 217 . Gick med i alla q.join och ett par andra saker

Svar

Charcoal , 47 42 41 byte

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

Testa det online! Länken är för att utöka versionen av koden.Förklaring: Ritar följande rader i ordning:

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

Där 5 är strängens nuvarande karaktär v^. I slutet av den första slingan placeras sedan markören vid punkt 9. Hela duken roteras sedan så att den andra hälften av Cool S kan dras. (Duken roteras faktiskt två gånger, men detta är bara en implementeringsdetalj.)

Charcoal stöder inte RotateCopy(:Up, 4) men om det gjorde det skulle det fungera för 33 byte:

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

Kommentarer

  • @BetaDecay Tyvärr. Jag hade också fel byte räkna ändå …
  • Trevligt, det blir också n = 0 rätt

Svar

Canvas , 36 32 29 byte

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

Prova det här!

En hel del stackmanipulation. (Föråldrad) förklaring:

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

Prova online!

Berättar till Jo King för 1 byte; och sedan ytterligare 5 byte totalt (via n => 2*n).

Fungerar också för n=0.

Svar

C (gcc) , 379 353 344 334 byte

Jag använde ett par #define för subexpression eliminering och flera globala för att kommunicera mellan de interna funktionerna. Huvudslingan går till {0,1,2,3,3,2,1,0} för att konstruera S.

Tack till Jonathan Frech för förslagen.

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

Prova online!

Kommentarer

Svar

C (gcc) , 260 254 byte

-6 byte tack vare takkatt .

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

Prova online!

Rundown

Vi kan dela upp formen i delar:

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

Varje del kan beskrivas med ett antal rader, tre tecken och tre förhållanden till vissa värden som bestämmer fältbredden vid varje rad.

En första iteration kom att vara:

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

Samtalet till g() makro ser väldigt ut som att en tabell kan konstrueras och slingras. Fältbredder är ibland relaterade till indexräknaren och ibland inte. Vi kan generalisera fältbredden till att vara F * i + A, där F är någon faktor att multiplicera i med, och A är något värde att lägga till till bredden. Så den sista bredden av det fjärde samtalet ovan skulle till exempel vara -2 * i + t.

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 slutändan var det inte mycket kortare än en stramare version av g() ringer en, men kortare är kortare.

Kommentarer

  • @ceilingcat Skål.
  • @ceilingcat Den odefinierade utvärderingsordningen för funktion argument ger mig paus.

Svar

Java, 435 byte

Själva funktionen tar 435 byte. Det finns verkligen utrymme för förbättringar, ”hög nivå” genom att analysera reglerna för var man ska placera vilken karaktär (i slutändan är S punkt-symmetrisk) och ”låg nivå”, genom klassisk golf (kanske dra ut en annan variabel eller kombinerar två av for -loops). Men det är ett första skott med detta ganska ungolfiska språk:

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! Import är en del av byte-räkningen jag ’ är rädd, så ditt nuvarande svar är faktiskt 478 byte . Du kan dock golfa ner till (tillfälligt nog) din nuvarande 435 byte med några grundläggande saker att spela golf.
  • Kunde spela lite mer till 405 byte genom att ta bort vissa variabler och använda t=... lite mindre där det skulle spara byte. Låt mig veta om du har några frågor om någon av ändringarna jag gjort. 🙂
  • Tack @KevinCruijssen, tyvärr kan jag för närvarande inte investera mer tid här – det här var bara en fritidsaktivitet och med tanke på ” verbositet ” av Java, i alla fall inte en seriös konkurrent 😉 Överväg att lägga till din lösning som ett eget svar, men – har vi åtminstone lite tävlingsspråk: -) / li>

Svar

PHP , 378 374 378 377 376 335 331 328 byte

-3 byte, tack vare manatwork

-4 byte, använde str_pad istället för str_repeat

-41 byte, tack vare manatworks ”förslag

-1 byte, sammanfogade två steg i en + = 2

-1 byte, tog bort överflödig \

-4 byte genom att eka en gång. Glömde att jag behövde skicka strängen till funktionen så det här är fler byte

Fungerar också för n = 0.

  

Prova det online!

Kommentarer

  • Eftersom funktionsdeklarationen är ganska dyr och du använder t () bara två gånger, skulle det vara kortare utan den . Om du förutom de 9 meddelandena tar en varning också kan du ta bort citaten runt 'v' i den sista echo.
  • Du kan använda en slinga för de övre och nedre sneda delarna. Initieringen av $ a och $ i kunde komprimeras genom att flytta dem vid första användningen.
  • Åh, och $i>0 och $m>0 kan skrivas helt enkelt som $i och $m.
  • Med efterföljande utrymmen , som i vissa andra lösningar.
  • Du kan också flytta deklarationen på $ c till dess första användning. Ändra bara . sammankopplingen efter den till ,. Prova online!

Svar

Python 3 , 321 307 byte

Tack till @EsolangingFruit för att spara 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))  

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

Prova online!

Kommentarer

  • Du kan ersätta '\\','/' på andra raden med *'\/' för att spara tre byte.
  • 307 byte: Prova online!
  • Tack! @EsolangingFruit! Jag var inte medveten om bitoperationer i Python. Det skulle också spara några byte att använda Python2 på grund av delningen och parenteserna i print
  • I Python 2, input() automatiskt eval() är strängen så att du kan hoppa över int() samtalet.
  • För Python 3 kan du ändra den sista raden till for l in L:print(*l,sep="") (jag tror inte ’ t tror att det finns en motsvarighet i Python 2).

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *