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
Svar
Charcoal , 58 53 47 43 41 byte
Nθ≔⊕⊗θδ↗θ/⊗θ↘δ^‖B↓‖M← vMδ⁰⊗θ↗⊕θM⁰δ↗θ/⊗θ⟲T
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")
Det hanterar nu n = 0.
Kommentarer
- Båda
o+~d
kan varam-d
ochrange(o)
kan vararange(m+1)
, och sedan kan du ta borto=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])
tillp(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ånjoin([...])
, 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^╋;╶╵\∔∔│α╶«├:╵╋:↔↕∔
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"])
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;}
Kommentarer
-
w -r-1
skulle möjligen kunna golfas tillw~r
. - Även om då inline är en byte kortare .
- 344 byte .
- 321 byte
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);}
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 – då 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.
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 sistaecho
. - 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))
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 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()
automatiskteval()
är strängen så att du kan hoppa överint()
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).
Λ