Nakreslete “ Cool S ”

Ú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

  • Související: Nakreslete S- Chain
  • ASCII-building 90 ‚ dítě ve mně chce navrhnout použití / \ místo ^ pro tip. Vypadá tak čistěji a navíc zachovává stejný sklon svahu 🙂
  • Jediným problémem @Flater je, že / \ používá dva znaky, takže centrální svislá čára by musela být odsazena, což by vypadalo velmi neuspořádaně
  • @BetaDecay: Vypadá dobře na N = 2 a N = 3 (protože si zachovává bodovou symetrii), ale souhlasím s N = 1. Existuje ‚ také možnost vzhůru nohama V: Λ
  • @JacobGarby: Můj argument byl stylistický, není golfové 🙂

odpověď

dřevěné uhlí , 58 53 47 43 41 bajtů

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

Vyzkoušejte online !

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

Zkuste to online!

Nyní zpracovává n = 0.

Komentáře

  • Oba o+~d mohou být m-d a range(o) může být range(m+1) a poté můžete o=m+1\n ušetřit 6 bajtů. Pěkná odpověď, +1 ode mě.
  • Ach, a ještě jeden bajt změnou p(s)\np(s[::-1]) na p(s+q+s[::-1]): 248 bajtů
  • Pokud použijete jeden print a další, můžete ušetřit 6 bajtů 4 odstraněním [] z join([...]), celkem 238 bajtů
  • Můžete také uložit q.join do proměnné a uložit bajt
  • 217 . Připojil se ke všem q.join s 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^╋;╶╵\∔∔│α╶«├:╵╋:↔↕∔ 

Vyzkoušejte to zde!

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

Vyzkoušejte online!

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

Vyzkoušejte to online!

Komentáře

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

Vyzkoušejte online!

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.

  

Vyzkoušejte online!

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ém echo.
  • 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>0 a $m>0 lze napsat jednoduše jako $i a $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))  

Vyzkoušejte to online!

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)  

Vyzkoušejte online!

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() automaticky eval() s řetězcem, takže můžete hovor int() 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).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *