Desenhe o "Cool S"

38

Introdução

Todos conhecemos o legal S (também conhecido como Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S etc. etc.): bilhões de crianças em idade escolar em todo o mundo atraíram esse S e imediatamente se sentiram orgulhosos de si mesmos. Caso você tenha esquecido ou tenha tido uma infância completamente não-legal , aqui está uma imagem do dito S legal:

Dado um fator de escala ncomo entrada (onde ), produza o Cool S na arte ASCII.1n20

Como desenhar

Na página da Wikipedia no Cool S:

Saída

O Cool S quando n= 1 é:

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

E para valores diferentes de n, você simplesmente aumenta os ntempos de saída . Por exemplo, n= 2:

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

Observe que as seções verticais são duas vezes mais longas e o espaçamento entre as linhas verticais é duas vezes maior.

E quando n= 3:

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

Nota: Embora não seja obrigatório, seu código também pode suportarn= 0:

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

Ganhando

O programa mais curto em bytes vence.

Beta Decay
fonte
O garoto que construiu o ASCII nos anos 90 em mim quer sugerir o uso de / \ em vez de ^ para a dica. Parece mais limpo dessa forma, além de que mantém a mesma inclinação inclinação :)
Flater
@Flater único problema é que / \ usa dois personagens, para que a linha vertical central teria que ser compensado que faz com que pareça muito desarrumado
Beta Decay
@BetaDecay: Parece bom em N = 2 e N = 3 (uma vez que mantém a simetria de pontos), mas concordo com N = 1. Há também a opção do V de cabeça para baixo:Λ
Flater
2
@JacobGarby: Meu argumento era estilística, não Golfy :)
Flater

Respostas:

14

Carvão , 58 53 47 43 41 bytes

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

Experimente online!

Eu só queria tentar outra abordagem, isso desenha o exterior através de reflexões (obrigado a Neil por expandir a ideia) e depois desenha a parte interna. Como o carvão vegetal tem :Leftcomo direção padrão para desenhar linhas, eu uso essa direção o máximo possível para salvar alguns bytes desenhando o S horizontalmente, assim:

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

E então eu só preciso girar a tela 90 graus no sentido anti-horário.

Charlie
fonte
Você pode estar em qualquer coisa lá ... 22 bytes você recebe toda a fora ...
Neil
@ Neil não foi exatamente assim, sua ideia precisava de uma pequena correção, mas na verdade isso foi uma grande melhoria!
23418 Charlie
Sim, cometi um erro semelhante no meu post original porque não verifiquei o efeito do dimensionamento corretamente.
214 Neil
Alguém disse Rotate? Isso me dá uma idéia ...
Neil
@ Neil hey, você conseguiu uma melhora aí! :-)
Charlie
13

Python 3 , 255 249 248 209 bytes

-6 bytes graças a Kevin Cruijssen

-1 byte graças a Kevin Cruijssen

-39 bytes graças 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')

Experimente online!

Agora ele lida com n = 0.

frosqh
fonte
Ambos o+~dpodem ser m-de range(o)podem ser range(m+1), e você pode remover o=m+1\npara salvar 6 bytes. Boa resposta, porém, +1 de mim.
Kevin Cruijssen
1
Oh, e mais de um byte, alterando p(s)\np(s[::-1])a p(s+q+s[::-1]): 248 bytes
Kevin Cruijssen
Você pode salvar 6 bytes se você usar um único print, e mais 4 por remoção []de join([...]), totalizando 238 bytes
Rod
Você também pode armazenar q.joinem uma variável para salvar um byte
Rod
217 . Juntou-se a todos os q.join, e a algumas outras coisas
Jo King
13

Carvão , 47 42 41 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação: Desenha as seguintes linhas em ordem:

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

Onde 5está o caractere atual da string v^. No final do primeiro loop, o cursor é posicionado no ponto 9. A tela inteira é então girada para que a outra metade do Cool S possa ser desenhada. (Na verdade, a tela é girada duas vezes, mas este é apenas um detalhe de implementação.)

O carvão não suporta, RotateCopy(:Up, 4)mas se o fizesse, isso funcionaria para 33 bytes:

↖^↖⊕⊗θ→↑⊗θ↗⊕θ‖BM↓↙⊗θ→↓⊗θ⟲C↑⁴J⁰¦⁰v
Neil
fonte
@BetaDecay Desculpe por isso. Eu também tive a contagem byte errado de qualquer maneira ...
Neil
Bom, fica n = 0 certo também
Beta Decay
6

Tela , 36 32 29 bytes

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

Experimente aqui!

Muita manipulação de pilha. explicação (desatualizada):

«|*                                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
fonte
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'])

Experimente online!

Agradece a Jo King por 1 byte; e depois outros 5 bytes no total (via n => 2*n).

Funciona para n=0também.

Chas Brown
fonte
3

C (GCC) , 379 353 344 334 bytes

Eu usei alguns #defines para eliminação de subexpressão e vários globais para se comunicar entre as funções internas. O loop principal vai {0,1,2,3,3,2,1,0} para construir o S.

Obrigado a Jonathan Frech pelas sugestões.

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

Experimente online!

ErikF
fonte
w -r-1possivelmente poderia ser jogado para w~r.
Jonathan Frech
Embora o inlining seja um byte mais curto .
Jonathan Frech
344 bytes .
Jonathan Frech 24/07
321 bytes
ceilingcat 23/09
3

C (GCC) , 260 254 bytes

-6 bytes graças ao 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);}

Experimente online!

Atropelar

Podemos dividir a forma em partes:

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

Cada parte pode ser descrita por um número de linhas, três caracteres e três relacionamentos com determinados valores que decidem a largura do campo em cada linha.

Uma primeira iteração veio a ser:

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

As chamadas para a g()macro parecem muito com uma tabela que pode ser construída e repetida. As larguras de campo às vezes são relacionadas ao contador do índice e às vezes não. Podemos generalizar a largura do campo F * i + A, onde F é um fator com o qual multiplicar ie A é algum valor a ser adicionado à largura. Portanto, a última largura da quarta chamada acima seria -2 * i + t, por exemplo.

Assim obtemos:

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.

No final, não era muito menor do que uma versão mais rígida da g()chamada, mas menor é menor.

gastropner
fonte
@ceilingcat Felicidades.
Gastropner 27/07/19
@ceilingcat A ordem de avaliação indefinida dos argumentos da função me dá uma pausa.
Gastropner 27/07/19
2

Java, 435 bytes

A função em si leva 435 bytes. Certamente há espaço para melhorias, "alto nível", analisando as regras sobre onde colocar qual personagem (no final, o S é simétrico em pontos) e "baixo nível", no golfe clássico (talvez retirando outra variável ou combinando dois dos forloops). Mas é o primeiro tiro com essa linguagem bastante não-gótica:

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
fonte
Olá. Receio que as importações façam parte da contagem de bytes, portanto, sua resposta atual é realmente 478 bytes . No entanto, você pode jogar golfe até (coincidentemente) seus 435 bytes atuais com algumas coisas básicas para jogar golfe.
Kevin Cruijssen
Conseguiu jogar um pouco mais de 405 bytes removendo algumas variáveis ​​e usando t=...um pouco menos onde economizaria bytes. Se você tiver alguma dúvida sobre alguma das alterações que fiz, entre em contato. :)
Kevin Cruijssen
Obrigado @KevinCruijssen, infelizmente atualmente não posso investir mais tempo aqui - isso foi apenas uma coisa de lazer e, considerando a "verbosidade" do Java, não é um concorrente sério ;-) Considere adicionar sua solução como uma resposta própria - então nós pelo menos, ter alguma competição intra-language :-)
Marco13
2

PHP , 378 374 378 377 376 335 331 328 bytes

-3 bytes, graças ao manatwork

-4 bytes, usado str_pad em vez de str_repeat

-41 bytes, graças às sugestões do manatworks

-1 byte, mesclou dois incrementos em um + = 2

-1 byte, removido supérfluo \

-4 bytes ecoando uma vez. Esqueci que eu precisava passar a string para a função, então isso é mais bytes

Funciona para n = 0 também.

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;

Experimente online!

Sam Dean
fonte
1
Como a declaração de função é bastante cara e você usa t () apenas duas vezes, seria mais curto sem ela . Se, além dos 9 avisos, você receber 1 aviso, poderá remover as aspas 'v'na final echo.
Manatwork
1
Você pode usar um loop único para as partes oblíquas superior e inferior. A inicialização de $ a e $ i pode ser compactada movendo-os no seu primeiro uso.
25818 manatwork
1
Ah, e $i>0e $m>0pode ser escrita simplesmente como $ie $m.
manatwork
1
Com espaços à direita , como em algumas outras soluções.
manatwork
1
Você também pode mover a declaração de $ c para seu primeiro uso. Basta alterar a .concatenação depois ,. Experimente online!
26618 manatwork
1

Python 3 , 321 307 bytes

Obrigado a @EsolangingFruit por salvar 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))

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

Experimente online!

Pétur
fonte
Você pode substituir '\\','/'na segunda linha por *'\/'para salvar três bytes.
Esolanging Fruit
307 bytes: Experimente online!
Esolanging Fruit
Obrigado! @EsolangingFruit! Eu não estava ciente das operações de bits no Python. Além disso, ele iria salvar alguns bytes de usar python2 por causa da divisão e parênteses emprint
Pétur
No Python 2, é input()automaticamente eval()a string, para que você possa pular a int()chamada também.
Esolanging Fruit
No Python 3, você pode alterar a última linha para for l in L:print(*l,sep="")(não acho que exista um equivalente no Python 2).
Esolanging Fruit