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.



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.


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.


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

@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

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.


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!


w -r-1possivelmente poderia ser jogado para w~r.
Jonathan Frech

Embora o inlining seja um byte mais curto .
Jonathan Frech



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.


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

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!


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!


Você pode substituir '\\','/'na segunda linha por *'\/'para salvar três bytes.
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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.