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
Válasz
Szén , 58 53 47 43 41 bájt
Nθ≔⊕⊗θδ↗θ/⊗θ↘δ^‖B↓‖M← vMδ⁰⊗θ↗⊕θM⁰δ↗θ/⊗θ⟲T
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")
Mostantól az n = 0 értéket kezeli.
Megjegyzések
- Mind a
o+~d
lehetm-d
és lehetrange(m+1)
, és akkor eltávolíthatja azo=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[]
ajoin([...])
-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^╋;╶╵\∔∔│α╶«├:╵╋:↔↕∔
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"])
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;}
Megjegyzések
-
w -r-1
esetleg golfozniw~r
-re. - Bár akkor a beillesztés egy bájttal rövidebb .
- 344 bájt .
- 321 bájt
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);}
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.
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))
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)
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()
automatikusaneval()
s a karakterlánc, így kihagyhatja azint()
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).
Λ