Piirrä “ Cool S ”

Johdanto

Me kaikki tunnemme tyylikkään S: n (tunnetaan myös nimellä Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S jne.): Miljardit koululaiset ympäri maailmaa vetivät tämän S: n ja tunsivat heti ylpeytensä itsestään. Jos olet unohtanut tai sinulla on täysin viileä lapsuus , tässä on kuva sanotusta S: stä:

Kun syötetään skaalauskerroin n (missä \ $ 1 \ leq n \ leq 20 \ $), tulosta Cool S ASCII-tiedostossa.

Kuinka piirtää se

Cool S: n Wikipedia-sivulta :

Tulos

Cool S kun n = 1 on:

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

Ja eri arvoille n, yksinkertaisesti suurennat ulostuloa n. esimerkki, n = 2:

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

Huomaa, että pystysuuntaiset leikkaukset ovat kaksi kertaa pidempiä ja pystyviivat ovat kaksi kertaa leveämpiä.

Ja kun n = 3:

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

Huomaa: Vaikka ei vaadita ired, koodisi voi myös tukea n = 0:

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

Voittaa

Lyhin tavu tavu voittaa.

Kommentit

  • Aiheeseen liittyvät: Piirrä S- Ketju
  • ASCII-rakennuksen 90 ’ lapsi minussa haluaa ehdottaa / \: n käyttämistä vinkin sijasta ^. Näyttää siltä puhtaammalta ja lisäksi se säilyttää saman kaltevuuskallistuksen 🙂
  • @Flaterin ainoa ongelma on, että / \ käyttää kahta merkkiä, joten keskimmäinen pystyviiva olisi siirrettävä, mikä tekee siitä näyttävän hyvin epäselvältä
  • @BetaDecay: Se näyttää hyvältä N = 2: lla ja N = 3: lla (koska se säilyttää pistesymmetrian), mutta olen samaa mieltä N = 1: stä. Siellä ’ s myös ylösalaisin olevan vaihtoehdon V: Λ
  • @JacobGarby: Argumenttini oli tyyliltään ei golfinen 🙂

vastaus

puuhiili , 58 53 47 43 41 tavua

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

Kokeile verkossa !

Halusin vain kokeilla toista lähestymistapaa, tämä piirtää ulkopuolen heijastusten kautta (kiitos Neilille idean laajentamisesta) ja sitten piirtää sisäosan. Koska Charcoalilla on :Left oletussuunta piirtää viivoja, käytän tätä suuntaa niin paljon kuin mahdollista säästääksesi joitain tavuja vetämällä S: tä vaakasuoraan seuraavasti:

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

Ja sitten minun täytyy vain kiertää kangasta 90 astetta vastapäivään.

Kommentit

  • Saatat olla jotain siellä … 22 tavua saa sinut ulkopuolelle …
  • @Neil sitä ei ollut ’ t täsmälleen näin, ideasi tarvitsi pienen korjauksen, mutta todellakin tämä on ollut suuri parannus!
  • Joo, tein samanlaisen virheen alkuperäisessä viestissäni, koska en ’ t tarkista skaalauksen vaikutus oikein.
  • Sanoiko joku Rotate? Se antaa minulle idean …
  • @Neil hei, sait siellä melkoisen parannuksen! 🙂

Vastaa

Python 3 , 255 249 248 209 tavua

-6 tavua Kevin Cruijssenin ansiosta

-1 tavu kiitos Kevin Cruijssenille

-39 tavua Rod ja Jo Kingin kiitos

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

Kokeile online!

Se käsittelee nyt n = 0.

Kommentit

  • Molemmat o+~d voivat olla m-d ja range(o) voi olla range(m+1), ja sitten voit poistaa o=m+1\n ja tallentaa 6 tavua. Hieno vastaus, +1 minulta.
  • Voi, ja yksi tavu lisää muuttamalla p(s)\np(s[::-1]) muotoon p(s+q+s[::-1]): 248 tavua
  • Voit tallentaa 6 tavua, jos käytät yhtä print ja muuta 4 poistamalla [] tiedostosta join([...]), summaamalla 238 tavua
  • Voit myös tallentaa q.join muuttujaan tavun tallentamiseksi
  • 217 . Liittyi kaikkiin q.join -kohteisiin ja pari muuta asiaa

Vastaus

Puuhiili , 47 42 41 tavua

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

Kokeile verkossa! Linkki on koodin tarkkaan versioon.Selitys: Piirretään seuraavat viivat järjestyksessä:

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

Missä 5 on merkkijonon v^. Ensimmäisen silmukan lopussa kohdistin sijoitetaan sitten kohtaan 9. Sitten koko kangasta käännetään niin, että Cool S: n toinen puoli voidaan piirtää. (Kanvaa pyöritetään itse asiassa kahdesti, mutta tämä on vain yksityiskohtia toteutuksessa.)

Charcoal ei tue RotateCopy(:Up, 4), mutta jos se toimisi, tämä toimisi 33 tavua:

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

kommentit

  • @BetaDecay Anteeksi. Minulla oli myös väärä tavu laskea joka tapauksessa …
  • Hienoa, se saa myös n = 0 oikein

Vastaa

kangas , 36 32 29 tavua

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

Kokeile täällä!

Paljon pinon manipulointia. (Vanhentunut) selitys:

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

Vastaa

Python 2 , 227 208 207 202 196 181 tavua

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

Kokeile verkossa!

Kiitos Jo Kingille 1 tavulle; ja sitten vielä 5 tavua yhteensä (kautta n => 2*n).

Toimii myös n=0.

vastaus

C (gcc) , 379 353 344 334 tavua

Käytin pari #define -signaalia alilausekkeiden poistamiseen ja useita globaalit viestivät sisäisten toimintojen välillä. Pääsilmukka menee {0,1,2,3,3,2,1,0} rakentamaan S.

Kiitos ehdotuksista Jonathan Frechille.

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

Kokeile verkossa!

Kommentit

vastaus

C (gcc) , 260 254 tavua

-6 tavua -katto ansiosta.

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

Kokeile verkossa!

Runnelmaa

Voimme jakaa muodon osiin:

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

Jokainen osa voidaan kuvata useilla viivoilla, kolmella merkillä ja kolmella suhteella tiettyihin arvoihin, jotka päättävät kentän leveyden jokaisella rivillä.

Ensimmäinen iterointi tuli olla:

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

makro näyttää hyvin siltä, että taulukko voitaisiin rakentaa ja luoda silmukka. Kentän leveydet liittyvät toisinaan hakemistolaskuriin, toisinaan eivät. Voimme yleistää kentän leveyden arvoksi F * i + A, jossa F on jokin tekijä, jolla kerrotaan i, ja A on joitain lisäarvoja. leveydelle. Joten yllä olevan neljännen puhelun viimeinen leveys olisi esimerkiksi -2 * i + t.

Siten saamme:

 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.  

Loppujen lopuksi se ei ollut paljon lyhyempi kuin tiukennettu versio g() soittaminen yhdelle, mutta lyhyempi on lyhyempi.

Kommentit

  • @ceilingcat Cheers.
  • @ceilingcat Funktion määrittelemätön arviointijärjestys argumentit antavat minulle tauon.

Vastaa

Java, 435 tavua

Itse toiminto kestää 435 tavua. Parantamisen varaa on, ”korkea taso” analysoimalla sääntöjä siitä, mihin merkki sijoitetaan (lopulta S on piste-symmetrinen) ja ”matalalle tasolle” klassisella golfilla (ehkä vetämällä toinen muuttuja tai yhdistämällä kaksi for -loopista). Mutta se ammuttiin ensin tällä melko epägolfimaisella kielellä:

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

kommentit

  • Hei. Tuonti on osa tavumäärää, jota pelkään, joten ’ pelkään, joten nykyinen vastauksesi on todella 478 tavua . voi kuitenkin golfia alas (sattumalta tarpeeksi) nykyisiin 435 tavuun joitain golfin perusasioita.
  • Oletko voinut golfia hieman enemmän 405 tavuun poistamalla joitain muuttujia ja käyttämällä t=... vähän vähemmän, jos se säästää tavuja. Jos sinulla on kysyttävää tekemistäni muutoksista, ilmoita siitä minulle. 🙂
  • Kiitos @KevinCruijssen, valitettavasti en voi tällä hetkellä sijoittaa enempää aikaa tähän – tämä oli vain virkistystoimintaa, ja kun otetaan huomioon ” sujuvuus ” Java, ei silti vakava kilpailija 😉 Harkitse ratkaisun lisäämistä omana vastauksena, vaikka sitten meillä on ainakin jonkinlainen kielen sisäinen kilpailu: -)

vastaus

PHP , 378 374 378 377 376 335 331 328 tavua

-3 tavua käsityön ansiosta

-4 tavua, käytti str_padia str_repeatin sijaan

-41 tavua manatworksin ansiosta ”ehdotukset

-1 tavu, yhdistetty kaksi lisäystä + = 2

-1 tavuun, poistettu tarpeeton \

-4 tavua kaikulla kerran. Unohdin Tarvitsin siirtää merkkijonon funktioon, joten tämä on enemmän tavuja.

Toimii myös n = 0.

  

Kokeile verkossa!

Kommentit

  • Koska funktion ilmoittaminen on melko kallista ja käytät t (): tä vain kahdesti, olisi lyhyempi ilman sitä . Jos otat yhdeksän ilmoituksen viereen myös yhden varoituksen, voit poistaa 'v' -kohdan ympärillä olevat lainaukset viimeisessä echo.
  • Voisit käyttää yhden silmukan viistoihin ylä- ja alaosiin. $ A: n ja $ i: n alustus voidaan tiivistää siirtämällä niitä ensimmäisellä käyttökerralla.
  • Voi, ja $i>0 ja $m>0 voidaan kirjoittaa yksinkertaisesti nimellä $i ja $m.
  • Jäljellä olevilla välilyönneillä , kuten joissakin muissa ratkaisuissa.
  • Voit myös siirtää $ c -ilmoituksen sen ensimmäiseen käyttöön. Muuta vain sen jälkeen . ketjutus ,. Kokeile verkossa!

Vastaa

Python 3 , 321 307 tavua

Kiitos @EsolangingFruit 14 tavun säästämisestä

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

Kokeile verkossa!

Python 2 , 303 tavua

 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)  

Kokeile verkossa!

Kommentit

  • Voit korvata '\\','/' toisella rivillä *'\/' -näppäimellä kolmen tavun tallentamiseksi.
  • 307 tavua: Kokeile verkossa!
  • Kiitos! @EsolangingFruit! En ollut tietoinen bittitoiminnoista Pythonissa. Lisäksi se säästää muutaman tavun Python2: n käytöstä print
  • Python 2: ssa input() automaattisesti eval() s merkkijono, joten voit ohittaa myös int() -kutsun.
  • Python 3, voit muuttaa viimeisen rivin for l in L:print(*l,sep="") (en usko ’ usko, että Python 2: ssa on vastaava).

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *