Ú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+~d
mohou býtm-d
arange(o)
může býtrange(m+1)
a poté můžeteo=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])
nap(s+q+s[::-1])
: 248 bajtů - Pokud použijete jeden
print
a další, můžete ušetřit 6 bajtů 4 odstraněním[]
zjoin([...])
, 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^╋;╶╵\∔∔│α╶«├:╵╋:↔↕∔
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-1
je 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>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))
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).
Λ