Zeichnen Sie die “ Cool S ”

Einführung

Wir alle kennen das coole S (auch bekannt als Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S usw. usw.): Milliarden von Schulkindern auf der ganzen Welt haben dieses S gezeichnet und waren sofort stolz von ihnen selbst. Für den Fall, dass Sie eine völlig uncoole Kindheit vergessen haben oder hatten, hier ein Bild des coolen S:

Geben Sie bei einem Skalierungsfaktor n als Eingabe (wobei \ $ 1 \ leq n \ leq 20 \ $) das Cool S in ASCII-Art aus.

Wie zeichnet man es?

Von der Wikipedia-Seite auf dem Cool S:

Ausgabe

Das Cool S, wenn n = 1 ist:

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

Und für verschiedene Werte von n machen Sie einfach die Ausgabe n mal größer Beispiel: n = 2:

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

Beachten Sie, dass die vertikalen Abschnitte zweimal länger sind und der Abstand zwischen den vertikale Linien sind zweimal breiter.

Und wenn n = 3:

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

Hinweis: Obwohl nicht erforderlich Ihr Code kann möglicherweise auch n = 0:

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

Winning

Das kürzeste Programm in Bytes gewinnt.

Kommentare

  • Verwandte: Zeichnen Sie ein S- Kette
  • Das Kind des ASCII-Gebäudes 90 ‚ in mir möchte vorschlagen, / \ anstelle von ^ für den Tipp zu verwenden. Sieht auf diese Weise sauberer aus und behält die gleiche Neigung bei 🙂
  • @Flater Das einzige Problem ist, dass / \ zwei Zeichen verwendet, sodass die vertikale Mittellinie versetzt werden müsste, wodurch es sehr unordentlich aussieht
  • @BetaDecay: Es sieht gut aus auf N = 2 und N = 3 (da es die Punktsymmetrie beibehält), aber ich stimme N = 1 zu. Es gibt ‚ auch die Option des verkehrten V: Λ
  • @JacobGarby: Mein Argument war stilistisch, nicht golfig 🙂

Antwort

Holzkohle , 58 53 47 43 41 Bytes

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

Probieren Sie es online aus !

Ich wollte nur einen anderen Ansatz ausprobieren. Dies zeichnet das Äußere durch Reflexionen (danke an Neil für die Erweiterung der Idee) und zeichnet dann den inneren Teil. Da Charcoal :Left als Standardrichtung zum Zeichnen von Linien hat, verwende ich diese Richtung so weit wie möglich, um einige Bytes zu sparen, indem ich das S horizontal zeichne, wie folgt:

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

Und dann muss ich die Leinwand nur noch um 90 Grad gegen den Uhrzeigersinn drehen.

Kommentare

  • Möglicherweise befinden Sie sich dort auf etwas … 22 Bytes bringen Sie alle von außen …
  • @Neil es war nicht ‚ genau so, Ihre Idee brauchte eine kleine Korrektur, aber in der Tat war dies eine große Verbesserung!
  • Ja, ich habe einen ähnlichen Fehler in meinem ursprünglichen Beitrag gemacht, weil ich es nicht getan habe ‚ Überprüfen Sie den Effekt der korrekten Skalierung nicht.
  • Hat jemand Rotate gesagt? Das gibt mir eine Idee …
  • @Neil hey, du hast da eine ziemliche Verbesserung! 🙂

Antwort

Python 3 , 255 249 248 209 Bytes

-6 Bytes dank Kevin Cruijssen

-1 Byte dank Kevin Cruijssen

-39 Byte dank Rod und Jo King

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

Probieren Sie es online aus!

Es verarbeitet jetzt n = 0.

Kommentare

  • Beide o+~d können m-d und kann range(m+1) sein, und dann können Sie o=m+1\n entfernen, um 6 Bytes zu sparen. Gute Antwort, +1 von mir.
  • Oh, und noch ein Byte, indem Sie p(s)\np(s[::-1]) in p(s+q+s[::-1]) ändern: 248 Bytes
  • Sie können 6 Bytes sparen, wenn Sie eine einzelne print und mehr verwenden 4 durch Entfernen von [] aus join([...]), summiert sich 238 Bytes
  • Sie können q.join auch in einer Variablen speichern, um ein Byte zu speichern.
  • 217 . Verbunden alle q.join s und ein paar andere Dinge

Antwort

Holzkohle , 47 42 41 Bytes

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

Probieren Sie es online aus! Der Link führt zu einer ausführlichen Version des Codes.Erläuterung: Zeichnet die folgenden Zeilen in der angegebenen Reihenfolge:

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

Wobei 5 das aktuelle Zeichen der Zeichenfolge v^. Am Ende der ersten Schleife befindet sich der Cursor dann am Punkt 9. Die gesamte Leinwand wird dann gedreht, so dass die andere Hälfte des Cool S gezeichnet werden kann. (Die Zeichenfläche wird tatsächlich zweimal gedreht, dies ist jedoch nur ein Implementierungsdetail.)

Holzkohle unterstützt RotateCopy(:Up, 4) nicht, aber wenn dies der Fall wäre, würde dies funktionieren 33 Bytes:

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

Kommentare

  • @BetaDecay Entschuldigung. Ich hatte auch das falsche Byte zählen trotzdem …
  • Schön, es wird auch n = 0 richtig

Antwort

Canvas , 36 32 29 Bytes

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

Probieren Sie es hier aus!

Eine ganze Menge Stapelmanipulationen. (Veraltete) Erklärung:

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

Antwort

Python 2 , 227 208 207 202 196 181 Bytes

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

Probieren Sie es online aus!

Danke an Jo King für 1 Byte; und dann weitere 5 Bytes insgesamt (über n => 2*n).

Funktioniert auch für n=0.

Antwort

C (gcc) , 379 353 344 334 Bytes

Ich habe ein paar #define s für die Eliminierung von Unterausdrücken und mehrere verwendet Globale zur Kommunikation zwischen den internen Funktionen. Die Hauptschleife führt {0,1,2,3,3,2,1,0} zum Konstruieren des S.

Vielen Dank an Jonathan Frech für die Vorschläge.

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

Probieren Sie es online aus!

Kommentare

Antwort

C (gcc) , 260 254 Bytes

-6 Bytes dank deckenkatze .

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

Probieren Sie es online aus!

Rundown

Wir können die Form teilen in Teile:

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

Jeder Teil könnte durch eine Anzahl von Zeilen, drei Zeichen und drei Beziehungen zu bestimmten Werten beschrieben werden, die die Feldbreite in jeder Zeile bestimmen.

Eine erste Iteration kam zu sein:

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

Die Aufrufe des g() Makro sieht sehr danach aus, als könnte eine Tabelle erstellt und durchlaufen werden. Feldbreiten beziehen sich manchmal auf den Indexzähler und manchmal nicht. Wir können die Feldbreite auf F * i + A verallgemeinern, wobei F ein Faktor ist, mit dem i multipliziert werden kann, und A ein Wert ist, der hinzugefügt werden muss auf die Breite. Die letzte Breite des vierten Aufrufs oben wäre also beispielsweise -2 * i + t.

Wir erhalten also:

 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.  

Am Ende war es nicht viel kürzer als eine verschärfte Version von g() Ein Aufruf, aber kürzer ist kürzer.

Kommentare

  • @ceilingcat Cheers.
  • @ceilingcat Die undefinierte Auswertungsreihenfolge der Funktion Argumente geben mir eine Pause.

Antwort

Java, 435 Bytes

Die Funktion selbst dauert 435 Bytes. Es gibt sicherlich Raum für Verbesserungen: „High Level“ durch Analyse der Regeln, wo welcher Charakter platziert werden soll (am Ende ist das S punktsymmetrisch), und „Low Level“ durch klassisches Golfen (möglicherweise Herausziehen einer anderen Variablen oder Kombinieren von zwei der for -Schleifen). Aber es ist ein erster Schuss mit dieser eher unfreundlichen Sprache:

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

Kommentare

  • Hallo zusammen. Importe sind Teil der Byteanzahl, die ich ‚ fürchte, daher lautet Ihre aktuelle Antwort tatsächlich 478 Bytes Sie können es jedoch (zufällig) auf Ihre aktuellen 435 Bytes mit einigen grundlegenden Dingen zum Golfen herunterspielen.
  • Sie konnten ein bisschen mehr auf 405 Bytes spielen, indem Sie einige Variablen entfernen und t=... etwas weniger, wo es Bytes sparen würde. Wenn Sie Fragen zu den von mir vorgenommenen Änderungen haben, lassen Sie es mich wissen. 🙂
  • Danke @KevinCruijssen, leider kann ich derzeit nicht mehr Zeit hier investieren – dies war nur eine Freizeitsache und unter Berücksichtigung der “ Ausführlichkeit “ von Java, sowieso kein ernsthafter Konkurrent 😉 Erwägen Sie, Ihre Lösung als eigene Antwort hinzuzufügen, obwohl – dann wir zumindest einen Wettbewerb innerhalb der Sprache haben: -)

Antwort

PHP , 378 374 378 377 376 335 331 328 Bytes

-3 Bytes dank Manatwork

-4 Bytes, dank Manatworks str_pad anstelle von str_repeat

-41 Bytes „Vorschläge

-1 Byte, zwei Inkremente zu einem + = 2

-1 Byte zusammengeführt, überflüssige \

-4 Bytes durch Echo entfernt einmal. Ich musste vergessen, dass die Zeichenfolge an die Funktion übergeben werden musste, damit dies mehr Bytes sind.

Funktioniert auch für n = 0.

  

Probieren Sie es online aus!

Kommentare

  • Da die Funktionsdeklaration ziemlich teuer ist und Sie t () nur zweimal verwenden, wäre ohne sie kürzer . Wenn Sie neben den 9 Hinweisen auch 1 Warnung erhalten, können Sie die Anführungszeichen um 'v' im endgültigen echo entfernen.
  • Sie können eine einzelne Schleife für die oberen und unteren schrägen Teile verwenden. Die Initialisierung von $ a und $ i kann komprimiert werden, indem sie bei ihrer ersten Verwendung verschoben werden.
  • Oh, und $i>0 und $m>0 kann einfach als $i und $m geschrieben werden.
  • Mit nachgestellten Leerzeichen , wie bei einigen anderen Lösungen.
  • Sie können die Deklaration von $ c auch auf ihre erste Verwendung verschieben. Ändern Sie einfach die . -Verkettung danach in ,. Probieren Sie es online aus!

Antwort

Python 3 , 321 307 Bytes

Vielen Dank an @EsolangingFruit für das Speichern von 14 Bytes

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

Probieren Sie es online aus!

Python 2 , 303 Byte

 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)  

Probieren Sie es online aus!

Kommentare

  • Sie können '\\','/' in der zweiten Zeile durch *'\/' ersetzen, um drei Bytes zu sparen.
  • 307 Bytes: Probieren Sie es online aus!
  • Danke! @EsolangingFruit! Bitoperationen in Python waren mir nicht bekannt. Aufgrund der Unterteilung und Klammern in print
  • in Python 2 würde input() automatisch eval() ist die Zeichenfolge, sodass Sie auch den Aufruf int() überspringen können.
  • Für Python In 3 können Sie die letzte Zeile in for l in L:print(*l,sep="") ändern (‚ glaube nicht, dass es in Python 2 ein Äquivalent gibt).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.