Disegna la "Cool S"


38

introduzione

Conosciamo tutti la bella S (nota anche come Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S ecc. Ecc.): Miliardi di scolari di tutto il mondo hanno disegnato questa S e si sono subito sentiti orgogliosi di se stessi. Nel caso in cui ti sia dimenticato o abbia avuto un'infanzia del tutto sregolata , ecco un'immagine di quella bella S:

Dato un fattore di scala ncome input (dove ), emette Cool S in ASCII art.1n20

Come disegnarlo

Dalla pagina di Wikipedia su Cool S:

Produzione

La S fredda quando n= 1 è:

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

E per valori diversi di n, è sufficiente aumentare i ntempi di output . Ad esempio, n= 2:

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

Si noti che le sezioni verticali sono due volte più lunghe e la spaziatura tra le linee verticali è due volte più ampia.

E quando n= 3:

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

Nota: sebbene non richiesto, il codice potrebbe anche supportaren= 0:

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

vincente

Vince il programma più breve in byte.



Il bambino degli anni 90 che costruisce ASCII in me vuole suggerire di usare / \ invece di ^ per il suggerimento. Sembra più pulito in quel modo, inoltre mantiene la stessa inclinazione del pendio :)
Flater

L'unico problema di @Flater è che / \ usa due caratteri, quindi la linea verticale centrale dovrebbe essere sfalsata, il che la rende molto disordinata
Decadimento Beta

@BetaDecay: sembra perfetto su N = 2 e N = 3 (poiché mantiene la simmetria del punto), ma concordo su N = 1. C'è anche l'opzione della V rovesciata:Λ
Flater,

2
@JacobGarby: la mia tesi era stilistica, non da golf :)
Flater,

Risposte:


14

Carbone di legna , 58 53 47 43 41 byte

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

Provalo online!

Volevo solo provare un altro approccio, questo disegna l'esterno tramite riflessioni (grazie a Neil per espandere l'idea) e quindi disegna la parte interna. Dato che il carbone ha :Leftla direzione predefinita per disegnare le linee, io uso quella direzione il più possibile per salvare alcuni byte disegnando la S in orizzontale, in questo modo:

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

E poi ho solo bisogno di ruotare la tela di 90 gradi in senso antiorario.


Potresti essere su qualcosa lì ... 22 byte ti porta tutto all'esterno ...
Neil

@Neil non era esattamente così, la tua idea aveva bisogno di una piccola correzione, ma in effetti questo è stato un grande miglioramento!
Charlie,

Sì, ho fatto un errore simile sul mio post originale perché non ho verificato l'effetto del ridimensionamento corretto.
Neil,

Qualcuno ha detto Rotate? Questo mi dà un'idea ...
Neil,

@Neil hey, hai ottenuto un bel miglioramento lì! :-)
Charlie,

13

Python 3 , 255 249 248 209 byte

-6 byte grazie a Kevin Cruijssen

-1 byte grazie a Kevin Cruijssen

-39 byte grazie a Rod e 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')

Provalo online!

Ora gestisce n = 0.


Entrambi o+~dpossono essere m-de range(o)possono essere range(m+1), quindi è possibile rimuoverli o=m+1\nper salvare 6 byte. Bella risposta però, +1 da parte mia.
Kevin Cruijssen,

1
Oh, e un altro byte cambiando p(s)\np(s[::-1])in p(s+q+s[::-1]): 248 byte
Kevin Cruijssen il

Puoi salvare 6 byte se ne usi uno singolo printe altri 4 rimuovendoli []da join([...]), totalizzando 238 byte
Rod

È inoltre possibile memorizzare q.joinin una variabile per salvare un byte
Rod

217 . Si unì a tutte le altre q.joine un paio di altre cose
Jo King,

13

Carbone , 47 42 41 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione: Disegna le seguenti linee in ordine:

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

Dov'è 5il carattere corrente della stringa v^. Alla fine del primo ciclo il cursore viene quindi posizionato nel punto 9. L'intera tela viene quindi ruotata in modo da poter disegnare l'altra metà di Cool S. (La tela viene effettivamente ruotata due volte, ma questo è solo un dettaglio di implementazione.)

Il carbone non supporta RotateCopy(:Up, 4)ma se lo facesse funzionerebbe per 33 byte:

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

@BetaDecay Mi dispiace per quello. Ho anche avuto un conteggio di byte sbagliato comunque ...
Neil,

Bene, anche n = 0 va bene
Beta Decay

6

Tela , 36 32 29 byte

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

Provalo qui!

Molta manipolazione dello stack. spiegazione (obsoleta):

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

3

Python 2 , 227 208 207 202 196 181 byte

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

Provalo online!

Grazie a Jo King per 1 byte; e poi altri 5 byte totali (via n => 2*n).

Funziona anche per n=0.


3

C (gcc) , 379 353 344 334 byte

Ho usato un paio di #defines per l'eliminazione della sottoespressione e diversi globi per comunicare tra le funzioni interne. Il ciclo principale va {0,1,2,3,3,2,1,0} per costruire la S.

Grazie a Jonathan Frech per i suggerimenti.

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

Provalo online!


w -r-1potrebbe essere giocato a golf w~r.
Jonathan Frech,

Sebbene l'allineamento sia più corto di un byte .
Jonathan Frech,



3

C (gcc) , 260 254 byte

-6 byte grazie a 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);}

Provalo online!

Corri giù

Possiamo dividere la forma in parti:

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

Ogni parte può essere descritta da un numero di linee, tre caratteri e tre relazioni con determinati valori che decidono la larghezza del campo su ciascuna linea.

Una prima iterazione è nata:

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

Le chiamate alla g()macro sembrano molto simili al fatto che una tabella potrebbe essere costruita e sovrapposta. Le larghezze di campo sono talvolta correlate al contatore dell'indice e talvolta no. Possiamo generalizzare la larghezza del campo F * i + A, dove F è un fattore da moltiplicare ie A è un valore da aggiungere alla larghezza. Quindi l'ultima larghezza della quarta chiamata sopra sarebbe -2 * i + t, per esempio.

Quindi otteniamo:

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.

Alla fine non era molto più breve di una versione più stretta di quella g()chiamante, ma più corta è più corta.


@ceilingcat Cheers.
Gastropner,

@ceilingcat L'ordine di valutazione indefinito degli argomenti delle funzioni mi dà una pausa.
Gastropner,

2

Java, 435 byte

La stessa funzione richiede 435 byte. C'è sicuramente spazio per il miglioramento, "alto livello" analizzando le regole su dove posizionare quale personaggio (alla fine la S è simmetrica punto) e "basso livello", con il golf classico (magari estraendo un'altra variabile o combinando due dei for-loops). Ma è un primo colpo con questo linguaggio piuttosto ungolfy:

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

Ciao. Temo che le importazioni facciano parte del conteggio dei byte, quindi la tua risposta attuale è in realtà 478 byte . Puoi comunque giocare a golf (per coincidenza) con i tuoi 435 byte attuali con alcune cose di base per giocare a golf.
Kevin Cruijssen,

Sono stato in grado di giocare a golf un po 'più a 405 byte rimuovendo alcune variabili e usando t=...un po' meno dove avrebbe salvato i byte. Se hai domande su una qualsiasi delle modifiche che ho apportato, fammi sapere. :)
Kevin Cruijssen,

Grazie @KevinCruijssen, sfortunatamente al momento non posso investire più tempo qui - questa era solo una cosa ricreativa, e considerando la "verbosità" di Java, non un serio concorrente in ogni caso ;-) Considera di aggiungere la tua soluzione come risposta personale, però - allora noi almeno una competizione intra-lingua :-)
Marco13

2

PHP , 378 374 378 377 376 335 331 328 328 byte

-3 byte, grazie al lavoro manuale

-4 byte, usato str_pad invece di str_repeat

-41 byte, grazie ai suggerimenti di manatworks

-1 byte, uniti due incrementi in un + = 2

-1 byte, rimosso superfluo \

-4 byte facendo eco una volta. Ho dimenticato che dovevo passare la stringa nella funzione, quindi questo è più byte

Funziona anche per 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;

Provalo online!


1
Poiché la dichiarazione di funzione è piuttosto costosa e si utilizza t () solo due volte, senza di essa sarebbe più breve . Se oltre alle 9 notifiche prendi anche 1 avviso, puoi rimuovere le virgolette in giro 'v'nel finale echo.
arte

1
È possibile utilizzare l'anello singolo per le parti oblique superiore e inferiore. L'inizializzazione di $ ae $ i potrebbe essere compattata spostandoli al primo utilizzo.
arte

1
Oh, e $i>0e $m>0può essere scritto semplicemente come $ie $m.
arte

1
Con spazi finali , come in alcune altre soluzioni.
arte

1
Puoi anche spostare la dichiarazione di $ c al suo primo utilizzo. Basta cambiare la .concatenazione dopo ,. Provalo online!
arte

1

Python 3 , 321 307 byte

Grazie a @EsolangingFruit per aver salvato 14 byte

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

Provalo online!

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)

Provalo online!


È possibile sostituire '\\','/'sulla seconda riga con *'\/'per salvare tre byte.
Esolanging Fruit,


Grazie! @EsolangingFruit! Non ero a conoscenza delle operazioni di bit in Python. Inoltre, risparmierebbe qualche byte per usare Python2 a causa della divisione e delle parentesiprint
Pétur,

In Python 2, input()automaticamente eval()la stringa, in modo da poter saltare anche la int()chiamata.
Esolanging Fruit,

Per Python 3, puoi cambiare l'ultima riga in for l in L:print(*l,sep="")(non credo che ci sia un equivalente in Python 2).
Esolanging Fruit,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.