Zeichne das "Cool S"

38

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 fühlten sich sofort stolz auf sich. Für den Fall, dass Sie Ihre Kindheit vergessen haben oder eine völlig unkühle hatten , hier ein Bild von diesem coolen S:

Geben Sie bei einem Skalierungsfaktor nals Eingabe (mit ) das Cool S in ASCII-Grafik aus.1n20

Wie zeichnet man es

Auf der Wikipedia-Seite zum Cool S:

Ausgabe

Das Cool S wenn n= 1 ist:

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

Und für verschiedene Werte von nmachst du einfach die Ausgabezeiten ngrößer. Zum Beispiel n= 2:

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

Beachten Sie, dass die vertikalen Abschnitte zweimal länger sind und der Abstand zwischen den vertikalen Linien zweimal größer ist.

Und wann n= 3:

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

Hinweis: Obwohl nicht erforderlich, unterstützt Ihr Code möglicherweise auchn= 0:

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

Gewinnen

Das kürzeste Programm in Bytes gewinnt.

Beta-Zerfall
quelle
10
Siehe auch
Das ASCII-Building-90-Kind in mir möchte vorschlagen, / \ anstelle von ^ für den Tipp zu verwenden. Sieht auf diese Weise sauberer aus und behält die gleiche Hangneigung bei :)
Flater
@ Flater einziges Problem ist, dass / \ zwei Zeichen verwendet, so dass die vertikale Mittellinie versetzt werden müsste, was es sehr unordentlich aussehen lässt
Beta Decay
@BetaDecay: Es sieht gut aus bei N = 2 und N = 3 (da es die Punktsymmetrie beibehält), aber ich stimme für N = 1 zu. Es gibt auch die Option des verkehrten V:Λ
Flater
2
@JacobGarby: Mein Argument war stilistisch, nicht golfen :)
Flater

Antworten:

14

Charcoal , 58 53 47 43 41 Bytes

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

Probieren Sie es online!

Ich wollte nur einen anderen Ansatz ausprobieren, dies zeichnet das Äußere über Reflexionen (danke an Neil für die Erweiterung der Idee) und zeichnet dann den inneren Teil. Da Charcoal die :LeftStandardrichtung zum Zeichnen von Linien hat, nutze 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 nur die Leinwand um 90 Grad gegen den Uhrzeigersinn drehen.

Charlie
quelle
Sie können auf etwas dort sein ... 22 Bytes bringt Sie alle von außen ...
Neil
@Neil es war nicht genau so, deine Idee brauchte eine kleine Korrektur, aber in der Tat war dies eine große Verbesserung!
Charlie
Ja, ich habe einen ähnlichen Fehler in meinem ursprünglichen Beitrag gemacht, weil ich den Effekt der korrekten Skalierung nicht überprüft habe.
Neil
Hat jemand gesagt Rotate? Das gibt mir eine Idee ...
Neil
@Neil Hey, da hast du eine ziemliche Verbesserung! :-)
Charlie
13

Python 3 , 255 249 248 209 Bytes

-6 Bytes dank Kevin Cruijssen

-1 Byte dank Kevin Cruijssen

-39 Bytes 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!

Es behandelt jetzt n = 0.

frosqh
quelle
Beides o+~dkann m-dund range(o)kann sein range(m+1), und dann können Sie entfernen o=m+1\n, um 6 Bytes zu sparen. Gute Antwort, +1 von mir.
Kevin Cruijssen
1
Oh, und noch ein Byte, indem Sie es ändern p(s)\np(s[::-1])in p(s+q+s[::-1]): 248 Byte
Kevin Cruijssen
Sie können 6 Bytes speichern , wenn Sie einen einzelnen verwenden print, und 4 durch Entfernen []von join([...]), 238 Bytes Summieren
Rod
Sie können auch q.joinin einer Variablen speichern, um ein Byte zu speichern
Rod
217 . Ist allen beigetreten q.joinund ein paar andere Dinge
Jo King
13

Charcoal , 47 42 41 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung: Zeichnet die folgenden Linien in der angegebenen Reihenfolge:

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

Wo 5ist das aktuelle Zeichen der Zeichenfolge v^. Am Ende der ersten Schleife befindet sich der Cursor dann an einem 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.)

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

↖^↖⊕⊗θ→↑⊗θ↗⊕θ‖BM↓↙⊗θ→↓⊗θ⟲C↑⁴J⁰¦⁰v
Neil
quelle
@BetaDecay Entschuldigung. Ich hatte sowieso auch die falsche Byteanzahl ...
Neil
Nizza, es wird n = 0 richtig
Beta Decay
6

Canvas , 36 32 29 Bytes

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

Probieren Sie es hier aus!

Eine ganze Menge Stack-Manipulation. (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
dzaima
quelle
3

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!

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

Funktioniert auch für n=0.

Chas Brown
quelle
3

C (gcc) , 379 353 344 334 Bytes

Ich habe ein paar #defines zur Eliminierung von Unterausdrücken und mehrere globale Zeichen verwendet, um zwischen den internen Funktionen zu kommunizieren. Die Hauptschleife geht {0,1,2,3,3,2,1,0}, um das S zu konstruieren.

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!

ErikF
quelle
w -r-1könnte möglicherweise golfen werden w~r.
Jonathan Frech
Inlining ist dann allerdings ein Byte kürzer .
Jonathan Frech
344 Bytes .
Jonathan Frech
321 Bytes
Ceilingcat
3

C (GCC) , 260 254 Byte

-6 bytes dank ceilingcat .

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!

Heruntergewirtschaftet

Wir können die Form in Teile teilen:

 ^           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 bei jeder Zeile bestimmen.

Eine erste Iteration war:

#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()Makros sehen in etwa so aus, als ob eine Tabelle erstellt und durchlaufen werden könnte. Feldbreiten beziehen sich manchmal auf den Indexzähler und manchmal nicht. Wir können die Feldbreite verallgemeinern F * i + A, wobei F ein Faktor ist, imit dem multipliziert werden soll, und A ein Wert ist, der der Breite hinzugefügt werden soll. So wäre -2 * i + tzum Beispiel die letzte Breite des vierten Aufrufs oben .

So erhalten wir:

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 der g()aufrufenden, aber kürzer ist kürzer.

Gastropner
quelle
@ceilingcat Prost.
Gastropner
@ceilingcat Die undefinierte Auswertungsreihenfolge der Funktionsargumente lässt mich innehalten.
Gastropner
2

Java, 435 Bytes

Die Funktion selbst benötigt 435 Bytes. Es gibt sicherlich Raum für Verbesserungen, "hohes Niveau" durch Analyse der Regeln, wo welcher Charakter zu platzieren ist (am Ende ist das S punktsymmetrisch), und "niedriges Niveau" durch klassisches Golfen (vielleicht eine andere Variable herausziehen oder) Kombination von zwei forSchleifen). Aber es ist ein erster Schuss mit dieser eher ungolfischen 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);}
}
Marco13
quelle
Hallo. Importe sind leider Teil der Byteanzahl, daher beträgt Ihre aktuelle Antwort 478 Bytes . Sie können es jedoch (zufällig) auf Ihre aktuellen 435 Bytes herunter spielen, mit einigen grundlegenden Dingen zum Golfen.
Kevin Cruijssen
Es war möglich, ein bisschen mehr als 405 Bytes zu spielen, indem einige Variablen entfernt und t=...ein bisschen weniger verwendet wurden, um Bytes zu sparen. Wenn Sie Fragen zu den von mir vorgenommenen Änderungen haben, lassen Sie es mich wissen. :)
Kevin Cruijssen
Dank @KevinCruijssen leider zur Zeit kann ich nicht mehr Zeit hier investieren - dies war nur ein Erholungs Sache, und unter Berücksichtigung der „Weitschweifigkeit“ von Java, nicht zu einem ernsthaften Konkurrenten sowieso ;-) Betrachten Sie Ihre Lösung als eine eigene Antwort geben, wenn - dann wir Mindestens einige Intra-Language-Wettbewerb :-)
Marco13
2

PHP , 378 374 378 377 376 335 331 328 Bytes

-3 Bytes dank manatwork

-4 Bytes, verwendet str_pad anstelle von str_repeat

-41 Bytes, dank manatworks 'Vorschlägen

-1 Byte, zwei Inkremente zu einem + = 2 zusammengeführt

-1 Byte, überflüssiges \ entfernt

-4 Bytes durch einmaliges Echo. Ich habe vergessen, dass ich den String an die Funktion übergeben musste, damit dies mehr Bytes sind

Funktioniert auch für n = 0.

function s($b){return str_pad($w,$b);}echo s($i=1+$a=2*$argv[1]).'^
';for(;$i;$j++,$y=$z.$y)echo$z=s(--$i).'/'.s(++$j).'\
';for(;$k<$a;$k++)$x.='|'.s($a).'|'.s($a).'|
';echo$x;for(;$l<=$a/2;)echo s($m++).$c='\\',s($a).$c.s($a-$l++*2).'/
';for(;$m;$n+=2)echo s(--$m).'/'.s($n).$c.s($a).'\
';echo$x.strtr($y,'/\\','\/').s($a+1).v;

Probieren Sie es online!

Sam Dean
quelle
1
Da die Funktionsdeklaration recht teuer ist und Sie t () nur zweimal verwenden, wäre sie ohne sie kürzer . Wenn Sie neben den 9 Hinweisen auch 1 Warnung nehmen, können Sie die Anführungszeichen 'v'im Finale entfernen echo.
Manatwork
1
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 der ersten Verwendung verschoben werden.
Manatwork
1
Oh, und $i>0und $m>0kann einfach als $iund geschrieben werden $m.
Manatwork
1
Mit nachgestellten Leerzeichen , wie bei einigen anderen Lösungen.
Handarbeit
1
Sie können die Deklaration von $ c auch in die erste Verwendung verschieben. Ändern Sie einfach die .Verkettung danach auf ,. Probieren Sie es online!
Manatwork
1

Python 3 , 321 307 Bytes

Vielen Dank an @EsolangingFruit für die Einsparung 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!

Python 2 , 303 Bytes

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!

Pétur
quelle
Sie können '\\','/'in der zweiten Zeile durch ersetzen *'\/', um drei Bytes zu sparen.
Esolanging Fruit
307 bytes: Probieren Sie es online!
Esolanging Fruit
Vielen Dank! @EsolangingFruit! Bitoperationen in Python waren mir nicht bekannt. Außerdem würde es ein paar Bytes sparen, um Python2 zu verwenden, da die Unterteilung und die Klammern inprint
Pétur
In Python 2 wird die Zeichenfolge input()automatisch eval()geändert, sodass Sie den int()Anruf auch überspringen können .
Esolanging Fruit
Für Python 3 können Sie die letzte Zeile in ändern for l in L:print(*l,sep="")(ich glaube nicht, dass es in Python 2 eine Entsprechung gibt).
Esolanging Fruit