Rajzolja a “ Cool S ”

Bevezetés

Mindannyian ismerjük a hűvös S-t (más néven Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S stb.): világszerte több milliárd iskolás rajzolta ezt az S-t és azonnal büszkének érezte magát önmagukból. Abban az esetben, ha elfelejtette, vagy teljesen hűvös gyermekkora volt, íme egy kép az említett hűvös S-ről:

Adott bemeneti n léptéktényező (ahol \ $ 1 \ leq n \ leq 20 \ $) esetén adja ki a Cool S-t az ASCII art-ban.

Hogyan rajzoljunk

A Cool S Wikipedia oldaláról :

Kimenet

A Cool S, amikor n = 1:

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

A n különböző értékeihez egyszerűen meg kell nagyobbítani a kimenetet n. példa: n = 2:

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

Vegye figyelembe, hogy a függőleges szakaszok kétszer hosszabbak, és a a függőleges vonalak kétszer szélesebbek.

És amikor n = 3:

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

Megjegyzés: Bár nem szükséges Ired, a kódod képes lehet a n = 0 támogatására is:

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

Nyerő

A bájtokban található legrövidebb program nyer.

Megjegyzések

  • Kapcsolódó: Rajzolj egy S- Lánc
  • Az ASCII-építő 90 ‘ kölyök bennem azt akarja javasolni, hogy a tipp helyett a ^ helyett a / \ legyen. Így tisztábbnak tűnik, ráadásul ugyanazt a lejtési dőlést tartja fenn 🙂
  • @Flater csak az a probléma, hogy / \ két karaktert használ, ezért a középső függőleges vonalat ellensúlyozni kellene, ami nagyon rendezetlen lesz
  • @BetaDecay: N = 2 és N = 3 esetén jól néz ki (mivel megtartja a pontszimmetriát), de N = 1 esetén egyetértek. ‘ s a fejjel lefelé fordított V lehetősége is: Λ
  • @JacobGarby: Az érvelésem stílusos volt, nem golfos 🙂

Válasz

Szén , 58 53 47 43 41 bájt

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

Próbálja ki online !

Csak egy másik megközelítést akartam kipróbálni, ez visszaverődésekkel vonzza a külsőt (köszönet Neilnek, hogy kibővítette az ötletet), majd megrajzolta a belső részt. Mivel a Charcoal alapértelmezett :Left iránya a vonalak rajzolásához, ezt az irányt a lehető legjobban kihasználom néhány bájt mentésére az S vízszintes rajzolásával, így:

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

És akkor csak 90 fokkal el kell forgatnom a vásznat az óramutató járásával ellentétes irányba.

Megjegyzések

  • Lehet, hogy ott van valamin … 22 bájt mindent megkapsz …
  • @Neil nem volt ‘ t pontosan így, ötletedre kisebb javításra volt szükség, de ez valóban nagy előrelépés volt!
  • Igen, hasonló hibát követtem el az eredeti bejegyzésemen, mert nem tettem meg ‘ nem ellenőrizheti helyesen a méretezés hatását.
  • Mondta valaki Rotate? Ez ad egy ötletet …
  • @Neil hé, ott elég nagy javulást értél el! 🙂

Válasz

Python 3 , 255 249 248 209 bájt

-6 bájt Kevin Cruijssen jóvoltából

-1 bájt Kevin Cruijssennek köszönhetően

-39 bájt Rodnak és Jo Kingnek köszönhetően

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

Próbálja ki online!

Mostantól az n = 0 értéket kezeli.

Megjegyzések

  • Mind a o+~d lehet m-d és lehet range(m+1), és akkor eltávolíthatja az o=m+1\n elemet 6 bájt mentése érdekében. Szép válasz, +1 tőlem.
  • Ja, és még egy bájt a p(s)\np(s[::-1]) p(s+q+s[::-1]) -re változtatásával: 248 bájt
  • 6 bájtot spórolhat, ha egyetlen print és még sok mást használ. 4 eltávolításával [] a join([...]) -ből, összesítve 238 bájt
  • Bájt mentéséhez tárolhatja az q.join változókat is egy változóban
  • 217 . Csatlakozott az összes q.join shez, és még néhány dologhoz

Válasz

faszén , 47 42 41 bájt

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

Próbálja ki online! A link a kód részletes verziójára szolgál.Magyarázat: A következő vonalakat sorrendben rajzolja meg:

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

Ahol 5 a v^. Az első hurok végén a kurzor az 9 ponton helyezkedik el. Ezután az egész vásznat elforgatják, hogy a Cool S másik fele lehessen rajzolni. (A vászon valójában kétszer forog, de ez csak egy megvalósítási részlet.)

A faszén nem támogatja a RotateCopy(:Up, 4) szolgáltatást, de ha mégis, akkor ez 33 bájt:

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

megjegyzések

  • @BetaDecay Sajnálom. Nekem is rossz a bájtom számít mindenképp …
  • Szép, ez n = 0-ra is jó lesz

Válasz

Vászon , 36 32 29 bájt

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

Próbálja ki itt!

Nagyon sok verem manipuláció. (Elavult) magyarázat:

«|* 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 

Válasz

Python 2 , 227 208 207 202 196 181 bájt

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

Próbálja ki online!

Köszönet Jo King -nek 1 bájtért; majd további 5 bájt összesen (via n => 2*n).

A n=0 esetén is működik.

Válasz

C (gcc) , 379 sztrájk> 353 344 334 bájt

Pár #define s-t használtam az alkifejezés megszüntetésére és többet globális kommunikáció a belső funkciók között. A fő hurok {0,1,2,3,3,2,1,0} -ig megy az S elkészítéséhez.

Köszönet Jonathan Frechnek a javaslatokért.

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

Próbálja ki online!

Megjegyzések

Válasz

C (gcc) , 260 254 bájt

-6 bájt a mennyezeti macskának köszönhetően.

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

Próbálja ki online!

Lemerült

Meg tudjuk osztani az alakzatot részekre:

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

Mindegyik részt le lehet írni sorokkal, három karakterrel és három kapcsolattal bizonyos értékekkel, amelyek meghatározzák a mezõ szélességét az egyes soroknál.

Elõször jött egy iteráció hogy:

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

A makró nagyon hasonlít arra, hogy egy táblázatot össze lehet állítani és át lehet hurcolni. A mezőszélességek néha az indexszámlálóhoz kapcsolódnak, és néha nem. Általánosíthatjuk, hogy a mező szélessége F * i + A, ahol F valamilyen tényező, amellyel szorozni lehet i, A pedig valamilyen hozzáadandó érték. szélességig. Tehát a fenti negyedik hívás utolsó szélessége például -2 * i + t lenne.

Így kapjuk meg:

 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.  

Végül nem volt sokkal rövidebb, mint a g() szigorított változata egyet hívni, de rövidebb, rövidebb.

Megjegyzések

  • @ceilingcat Cheers.
  • @ceilingcat Az argumentumok szünetet adnak nekem.

Válasz

Java, 435 bájt

Maga a függvény 435 bájtot vesz igénybe. Természetesen van hová fejlődni, a “magas szint” azáltal, hogy elemezzük a szabályokat arra vonatkozóan, hogy melyik karaktert helyezzük el (végül az S pontszimmetrikus), és az “alacsony szintet” a klasszikus golfozás révén (esetleg kihúzunk egy másik változót, ill. a kettő kombinálása a for -hátból). De ez az első lövés ezzel a meglehetősen golf nélküli nyelvvel:

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

Hozzászólások

  • Sziasztok. Az import az én ‘ félelem bájtjainak része, így a jelenlegi válaszod valójában 478 bájt . golfozhat (elég véletlenül) a jelenlegi 435 bájtjához néhány alapvető dologgal a golfhoz.
  • Képes volt egy kicsit többet golfozni 405 bájtra néhány változó eltávolításával és a t=... egy kicsit kevesebb, ahol bájtokat spórolna. Ha bármilyen kérdése van a változtatásokkal kapcsolatban, tudassa velem. 🙂
  • Köszönöm @KevinCruijssen, sajnos jelenleg nem tudok több időt fektetni ide – ez csak egy rekreációs dolog volt, és figyelembe véve a ” sokszínűséget ” Java, amúgy sem komoly versenytárs 😉 Fontolja meg a megoldás saját válaszként való hozzáadását, bár – akkor legalább van néhány nyelven belüli versenyünk: -)

Válasz

PHP , 378 374 378 377 376 335 331 328 bájt

-3 bájt, köszönhetően a kézimunkának

-4 bájt, az str_padot használta az str_repeat helyett

-41 bájt, köszönhetően a manatwork-nek “javaslatok

-1 bájt, két növekmény + + 2-be egyesítve

-1 bájt, felesleges eltávolítás \

-4 bájt visszhanggal egyszer. Elfelejtettem, hogy át kellett adnom a karakterláncot a függvénybe, így ez több bájt

Az n = 0 esetében is működik.

  

Próbálja ki online!

Megjegyzések

  • Mivel a függvénydeklaráció meglehetősen drága, és a t () -t csak kétszer használja, rövidebb lenne nélküle . Ha a 9 figyelmeztetés mellett 1 figyelmeztetést is felvesz, eltávolíthatja az 'v' körüli idézőjeleket az utolsó echo
  • egyhurkosot használhat a felső és az alsó ferde részhez. A $ a és $ i inicializálását az első használatkor mozgatással lehet tömöríteni.
  • Ja, és $i>0 és $m>0 egyszerűen $i és $m formátumban írható.
  • Utó szóközökkel , mint néhány más megoldásnál.
  • A $ c deklarációt az első használatra is áthelyezheti. Csak módosítsa az utána lévő . összefűzést , -re. Próbálja ki online!

Válasz

Python 3 , 321 307 bájt

Köszönet a @EsolangingFruit 14 bájt megtakarításáért

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

Próbálja ki online!

Python 2 , 303 bájt

 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)  

Próbálja ki online!

Megjegyzések

  • Három bájt mentése érdekében a második sor '\\','/' -jét lecserélheti *'\/' -re.
  • 307 bájt: Próbálja ki online!
  • Köszönöm! @EsolangingFruit! Nem tudtam a Python bites műveleteiről. Néhány bájtot is megtakarítana a Python2 használata a print
  • a Python 2-ben a input() automatikusan eval() s a karakterlánc, így kihagyhatja az int() hívást is.
  • Python esetén 3, az utolsó sort megváltoztathatja for l in L:print(*l,sep="") -re (nem hiszem, hogy ‘ nem lenne megfelelő a Python 2-ben).

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük