Úvod
Všichni známe skvělé S (známé také jako Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S atd.): miliardy S po celém světě nakreslily toto S a okamžitě se cítily pyšné ze sebe. V případě, že jste zapomněli nebo jste měli zcela vychlazené dětství , je zde obrázek zmíněného skvělého S:
Vzhledem k měřítku n jako vstupu (kde \ $ 1 \ leq n \ leq 20 \ $) vygenerujte Cool S v umění ASCII.
Jak to nakreslit
Ze stránky Wikipedie na Cool S:
Výstup
Cool S, když n = 1 je:
^ / \ / \ / \ | | | | | | \ \ / \ \/ /\ \ / \ \ | | | | | | \ / \ / \ / v
A pro různé hodnoty n jednoduše zvětšíte výstup n krát. Pro příklad n = 2:
^ / \ / \ / \ / \ / \ | | | | | | | | | | | | \ \ / \ \ / \ \/ /\ \ / \ \ / \ \ | | | | | | | | | | | | \ / \ / \ / \ / \ / v
Všimněte si, že svislé úseky jsou dvakrát delší a mezery mezi svislé čáry jsou dvakrát širší.
A když n = 3:
^ / \ / \ / \ / \ / \ / \ / \ | | | | | | | | | | | | | | | | | | \ \ / \ \ / \ \ / \ \/ /\ \ / \ \ / \ \ / \ \ | | | | | | | | | | | | | | | | | | \ / \ / \ / \ / \ / \ / \ / v
Poznámka: Ačkoli to není potřeba ired, váš kód také může podporovat n = 0:
^ / \ \\/ /\\ \ / v
Vítězství
Vítězí nejkratší program v bajtech.
Komentáře
odpověď
dřevěné uhlí , 58 53 47 43 41 bajtů
Nθ≔⊕⊗θδ↗θ/⊗θ↘δ^‖B↓‖M← vMδ⁰⊗θ↗⊕θM⁰δ↗θ/⊗θ⟲T
Chtěl jsem jen zkusit jiný přístup, tahem zvenčí přes odrazy (díky Neilovi za rozšíření myšlenky) a poté nakreslením vnitřní části. Protože Charcoal má :Left výchozí směr pro kreslení čar, využívám tento směr co nejvíce, abych ušetřil některé bajty nakreslením S vodorovně, například takto:
/----\ /----\ / \ / \ / \/ \ / / \ / / \ v ----/ /---- ^ \ / / \ / / \ /\ / \ / \ / \----/ \----/
A potom už jen musím otočit plátno o 90 stupňů proti směru hodinových ručiček.
Komentáře
- Možná tam něco máte … 22 bajtů vám poskytne všechny vnější …
- @Neil to nebylo ‚ Přesně takhle, váš nápad potřeboval menší opravu, ale ve skutečnosti to bylo velké zlepšení!
- Ano, udělal jsem podobnou chybu ve svém původním příspěvku, protože jsem to neudělal ‚ T správně zkontrolovat účinek škálování.
- Řekl někdo
Rotate? To mi dává nápad … - @ Neil hej, máš tam docela zlepšení! 🙂
Odpověď
Python 3 , 255 249 248 209 bajtů
-6 bajtů díky Kevinovi Cruijssenovi
-1 bajt díky Kevinovi Cruijssenovi
-39 bajtů díky Rodovi a Jo Kingovi
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")
Nyní zpracovává n = 0.
Komentáře
- Oba
o+~dmohou býtm-darange(o)může býtrange(m+1)a poté můžeteo=m+1\nušetřit 6 bajtů. Pěkná odpověď, +1 ode mě. - Ach, a ještě jeden bajt změnou
p(s)\np(s[::-1])nap(s+q+s[::-1]): 248 bajtů - Pokud použijete jeden
printa další, můžete ušetřit 6 bajtů 4 odstraněním[]zjoin([...]), celkem 238 bajtů - Můžete také uložit
q.joindo proměnné a uložit bajt - 217 . Připojil se ke všem
q.joins a několika dalším věcem
Odpovědět
Dřevěné uhlí , 47 42 41 bajtů
Fv^«↓⊗θ↘⊗⊕θ←↓⊗θ↙⊕⊗θ↖ι↖⊕⊗θ→↑⊗θ↗⊕θMθ⁺⊗θ⊕θ⟲⁴
Zkuste to online! Odkaz je na podrobnou verzi kódu.Vysvětlení: Nakreslí následující řádky v uvedeném pořadí:
^ / \ / \ / \ | 1 | | 1 | \ 2 / \ 2/ 8\ 2 8 \ 2 7 | 3 7 9 3 6 4 6 4 6 4 5
Kde 5 je aktuální znak řetězce v^. Na konci první smyčky se kurzor umístí do bodu 9. Celé plátno se poté otočí, aby bylo možné nakreslit druhou polovinu Cool S. (Plátno se ve skutečnosti dvakrát otočí, ale toto je jen detail implementace.)
Charcoal nepodporuje RotateCopy(:Up, 4), ale pokud by to fungovalo, pak by to fungovalo pro 33 bajtů:
↖^↖⊕⊗θ→↑⊗θ↗⊕θ‖BM↓↙⊗θ→↓⊗θ⟲C↑⁴J⁰¦⁰v
Komentáře
- @BetaDecay Omlouvám se. Také jsem měl špatný bajt počítat stejně …
- Pěkně, i n = 0 má pravdu
Odpověď
Plátno , 36 32 29 bajtů
«|*‼l├/L1^╋;╶╵\∔∔│α╶«├:╵╋:↔↕∔
Spousta manipulace se zásobníkem. (Zastaralé) vysvětlení:
«|* 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
odpověď
Python 2 , 227 208 207 202 196 181 bajtů
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"])
Děkuji Jo Kingovi za 1 bajt; a poté dalších 5 bajtů celkem (prostřednictvím n => 2*n).
Funguje také pro n=0.
Odpověď
C (gcc) , 379 353 344 334 bajtů
Použil jsem několik #define s pro eliminaci subexprese a několik globálové ke komunikaci mezi interními funkcemi. Hlavní smyčka přejde {0,1,2,3,3,2,1,0} k vytvoření S.
Děkuji Jonathanovi Frechovi za návrhy.
#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;}
Komentáře
-
w -r-1je možné přidat dow~r. - Ačkoli vložení je o jeden bajt kratší .
- 344 bajtů .
- 321 bajtů
odpověď
C (gcc) , 260 254 bajtů
-6 bajtů díky stropu .
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
Tvar můžeme rozdělit do částí:
^ Top cap / \ Top slope ||| Sides \\/ Twist, part 1 /\\ Twist, part 2 ||| Sides \ / Bottom slope v Bottom cap
Každou část lze popsat několika řádky, třemi znaky a třemi vztahy k určitým hodnotám, které určují šířku pole na každém řádku.
První iterace přišla být:
#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) }
Volání g() Makro vypadá velmi podobně jako tabulka, kterou lze sestavit a zalomit. Šířky polí někdy souvisí s počitadlem indexů, a někdy ne. Můžeme zobecnit šířku pole na F * i + A, kde F je nějaký faktor, který i vynásobíme, a A je nějaká hodnota, kterou je třeba přidat do šířky. Takže poslední šířka čtvrtého volání výše by byla například -2 * i + t.
Tak dostaneme:
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.
Nakonec to nebylo mnohem kratší než zpřísněná verze g() volání jednoho, ale kratší je kratší.
Komentáře
- @ceilingcat Na zdraví.
- @ceilingcat Nedefinované pořadí vyhodnocení funkce argumenty mi dají pauzu.
Odpověď
Java, 435 bajtů
Samotná funkce trvá 435 bajtů. Určitě existuje prostor pro zlepšení, „vysoká úroveň“ analýzou pravidel o tom, kam kterou postavu umístit (nakonec je S bodově symetrická), a „nízká úroveň“, klasickým golfem (možná vytáhnutím jiné proměnné nebo kombinace dvou z for smyček). Ale je to první výstřel s tímto poměrně ungolfským jazykem:
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);} }
Komentáře
- Ahoj. Import je součástí počtu bajtů, kterého se ‚ bojím, takže vaše aktuální odpověď je ve skutečnosti 478 bajtů . ale může to golfově snížit na (shodou okolností) vašich současných 435 bajtů s některými základními věcmi pro golf.
- Byl jsem schopen trochu více golfovat na 405 bajtů odstraněním některých proměnných a použitím
t=...o něco méně tam, kde by to ušetřilo bajty. Máte-li jakékoli dotazy týkající se změn, které jsem provedl, dejte mi vědět. 🙂 - Díky @KevinCruijssen, bohužel zde momentálně nemohu investovat více času – byla to jen rekreační věc a vzhledem k “ výřečnosti “ z Javy, každopádně ne vážný konkurent 😉 Zvažte přidání svého řešení jako vlastní odpověď, i když – pak máme alespoň nějakou jazykovou soutěž: -)
Odpověď
PHP , 378 374 378 377 376 335 331 328 bajtů
-3 bajty, díky manatwork
-4 bajtů, použit str_pad místo str_repeat
-41 bajtů, díky manatworks „návrhy
-1 bajt, sloučeny dva přírůstky do + = 2
-1 bajt, odstraněny zbytečné \
-4 bajty ozvěnou jednou. Zapomněl jsem, že jsem musel předat řetězec do funkce, takže toto je více bajtů
Funguje také pro n = 0.
Komentáře
- Protože deklarace funkce je poměrně drahá a použijete t () pouze dvakrát, bez ní by byla kratší . Pokud kromě 9 upozornění přijmete také 1 varování, můžete odstranit uvozovky kolem
'v'v závěrečnémecho. - Můžete použít jednu smyčku pro horní a dolní šikmou část. Inicializaci $ a a $ i lze zhutnit přesunutím při jejich prvním použití.
- Oh a
$i>0a$m>0lze napsat jednoduše jako$ia$m. - S koncovými mezerami , jako v některých jiných řešeních.
- Deklaraci $ c můžete také přesunout na první použití. Stačí změnit
.zřetězení po něm na,. Vyzkoušejte online!
Odpověď
Python 3 , 321 307 bajtů
Díky @EsolangingFruit za úsporu 14 bajtů
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 bajtů
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)
Komentáře
-
'\\','/'na druhém řádku můžete nahradit*'\/', abyste ušetřili tři bajty. - 307 bajtů: Vyzkoušejte online!
- Děkujeme! @EsolangingFruit! Nebyl jsem si vědom bitových operací v Pythonu. Také by ušetřilo několik bajtů pro použití Python2 kvůli rozdělení a závorkám v
print - V Pythonu 2,
input()automatickyeval()s řetězcem, takže můžete hovorint()přeskočit. - Pro Python 3, můžete změnit poslední řádek na
for l in L:print(*l,sep="")(já si ‚ nemyslím, že v Pythonu 2 existuje ekvivalent).
Λ