Desenhe um grande ASCII X

20

Problema

Inspirado por um desafio anterior, fazendo algo semelhante

Dada a entrada inteira positiva produz numa forma que segue esse padrão:

entrada n=1:

* *
 *
* *

entrada n=2:

**  **
 ****
  **
 ****
**  **

entrada n=3:

***   ***
 *** ***
  *****
   ***
  *****
 *** ***
***   ***

e assim por diante...

Possui estas propriedades:

n*2+1 linhas de altura

os "braços" são nlargos, exceto quando se fundem

a linha central é nlarga

se né que as linhas acima e abaixo do centro são n*2largas

se nfor ímpar, as linhas acima e abaixo do centro são n*2-1largas

Regras

  • Novas linhas à direita aceitas
  • Aplicam-se brechas padrão
  • Menor bytes de vitória
  • A saída pode ser impressa ou uma sequência ou matriz de sequências

Edições

  • n=0 não precisa ser manuseado
  • Espaços à direita permitidos
LiefdeWen
fonte
2
Está tudo bem se a saída tem 1em vez de *e 0em vez de espaço?
JungHwan
Nossos padrões podem ser indexados em 0?
Leaky Nun
@JungHwanMin Eu vou permitir isso, mas então você não tem permissão para vencer, pode ser influenciado se você for mais votado.
LiefdeWen
@LeakyNun 0 O índice está bom #
LiefdeWen

Respostas:

9

Carvão , 13 12 bytes

Obrigado a @ErikTheOutgolfer por um byte

FN«PX⁺*×*Iθ→

Experimente online!

Esta é a minha primeira resposta a carvão, e tenho certeza de que não é tão bem quanto poderia ser, mas achei que começaria em algum lugar.

 FN«            # For input() (i in range(0,input()))
     P           # Print
       X          # In an 'X' shape
        ⁺*×*Iθ   # '*'+'*'*int(first_input)
               →  # Move the cursor right one
nmjcman101
fonte
Você pode usar para -1.
Erik the Outgolfer
@EriktheOutgolfer Eu sabia que tinha que haver uma maneira de fazer isso! Obrigado!
nmjcman101
E sim, na verdade, parece tão jogado quanto possível.
Erik the Outgolfer
@EriktheOutgolfer Não foi antes de você aparecer mesmo assim :) #
nmjcman101
1
O @thomasrutter Charcoal possui sua própria página de códigos personalizada com 256 bytes , onde cada um desses caracteres tem 1 byte. Portanto, não é codificado em ASCII, onde alguns desses caracteres seriam de fato vários bytes. nmjcman101 +1 btw. Também estava tentando minha primeira resposta no carvão ontem, mas não deu muito certo nos poucos minutos que eu tinha antes de voltar para casa do trabalho. Então você me venceu. Aprendi algumas coisas com a sua resposta, então obrigado por isso.
Kevin Cruijssen
13

MATL , 16 bytes

EQXyG:Y+tP+g42*c

Experimente online!

Explicação

Considere a entrada 2como um exemplo. O conteúdo da pilha é mostrado com os mais recentes abaixo.

EQ    % Implicitly input n. Push 2*n+1
      %   STACK: 5
Xy    % Identity matrix of that size
      %   STACK: [1 0 0 0 0;
                  0 1 0 0 0;
                  0 0 1 0 0;
                  0 0 0 1 0;
                  0 0 0 0 1]
G:    % Push [1 2 ... n]
      %   STACK: [1 0 0 0 0;
                  0 1 0 0 0;
                  0 0 1 0 0;
                  0 0 0 1 0;
                  0 0 0 0 1],
                 [1 2]
Y+    % 2D convolution, extending size
      %   STACK: [1 2 0 0 0 0;
                  0 1 2 0 0 0;
                  0 0 1 2 0 0;
                  0 0 0 1 2 0;
                  0 0 0 0 1 2]
tP+   % Duplicate, flip vertically, add
      %   STACK: [1 2 0 0 2 1;
                  0 1 2 1 2 0;
                  0 0 1 4 0 0;
                  0 1 2 1 2 0;
                  1 2 0 0 1 2]
g     % Convert to logical
      %   STACK: [1 1 0 0 1 1;
                  0 1 1 1 1 0;
                  0 0 1 1 0 0;
                  0 1 1 1 1 0;
                  1 1 0 0 1 1]
42*   % Multiply by 42.
      %   STACK: [42 42  0  0 42 42;
                   0 42 42 42 42  0;
                   0  0 42 42  0  0;
                   0 42 42 42 42  0;
                  42 42  0  0 42 42]
c     % Convert to char. Char 42 is '*'. Char 0 is displayed as space
      %   STACK: ['**  **';
                  ' **** ';
                  '  **  ';
                  ' **** ';
                  '**  **']
Luis Mendo
fonte
Você é mais rápido do que eu ...
Leaky Nun
@LeakyNun Muito raramente :-)
Luis Mendo
Desejo Jelly tinha 2D convolução ... Eu tive que acrescentar 0 em cada linha e em seguida, aplicar soma vetorizado ...
Leaky Nun
1
@LeakyNun Você sabe o que dizem sobre convolução ...
Luis Mendo
1
@LuisMendo No meu coração, você é o vencedor por usar a convolução, traz de volta lembranças tão legais.
LiefdeWen
9

Gelatina , 15 bytes

Ḥ‘Ḷ⁶ẋ;€”*ẋ$»Ṛ$Y

Experimente online!

Erik, o Outgolfer
fonte
Muito agradável. 8 bytes antes de mim.
Leaky Nun
@LeakyNun A abordagem direta ajuda bastante.
Erik the Outgolfer
A very nice abordagem
Jonathan Allan
@ JonathanAllan Sim, especialmente tfw você aprende »vetoriza ...
Erik the Outgolfer
1
Eu realmente gosto do seu nome de usuário! Mas eu gostaria que você usou "vi" ou "vim" em vez disso, para que você possa escolher "Erik o vi Rei" ... (ventilador Monty Python aqui ...)
Olivier Dulac
4

V , 18 17 bytes

Salvei um byte graças ao truque de entrada de @ DJMcMayhem.

Àé*ÄJÀälÀñ2ÙÀl2x>

Experimente online!

Explicação

Àé*ÄJÀäl

Isso insere [n]*'*'+[n]*' '+[n]*'*'

        Àñ        ' [arg] times
          2Ù      ' Duplicate the current line down twice
            Àl    ' Move right [arg] times
              2x  ' Delete two characters
                > ' Indent this line one space

Cada iteração do loop do buffer passa de

|**   ***

Para

***   ***
 |** ***
***   ***

Onde |está o cursor com um por *baixo

nmjcman101
fonte
Uau. Você muuuito me outgolfed. Bom trabalho! Algumas dicas: você pode fazer em Àé*ÄJÀälvez de Àá*Àá Àá*, e você pode <M-c>, por exemplo ã(mnemônico: centro ), mover-se para o meio da linha, que é um byte menor que Àl. Experimente online!
DJMcMayhem
@DJMcMayhem Estou tentando falar com você em vários lugares diferentes. Eu vou roubar a primeira sugestão que eu penso, mas as <M-c>pausas para números mais altos
nmjcman101
3

05AB1E , 18 bytes

Å4bS{I·ƒDÂ~„ *èJ,À

Experimente online!

Explicação

Exemplo para n=2

Å4                   # push a list of 4s with length as the input
                     # STACK: [4,4]
  b                  # convert each to binary
                     # STACK: [100, 100]
   S{                # split into digit list and sort
                     # STACK: [0, 0, 0, 0, 1, 1]
     I·ƒ             # input*2+1 times do
        D            # duplicate top of stack
                     # 1st iteration: [0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1]
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 0]
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0]
         Â~          # or each item in the duplicate with its reverse
                     # 1st iteration: [0, 0, 0, 0, 1, 1], [1, 1, 0, 0, 1, 1]
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], [0, 1, 1, 1, 1, 0]
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0]
           „ *èJ     # use the resulting binary list to index into the string " *"
                     # 1st iteration: [0, 0, 0, 0, 1, 1], "**  **"
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], " **** "
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], "  **  "
                ,    # print
                 À   # rotate list left
Emigna
fonte
3

V , 23 bytes

Àé*ÄJÀälÀñÙãlxx>ñyHæGVp

Experimente online!

Hexdump:

00000000: c0e9 2ac4 4ac0 e46c c0f1 d9e3 6c78 783e  ..*.J..l....lxx>
00000010: f179 48e6 4756 70                        .yH.GVp

Por qualquer motivo, esse desafio é significativamente mais difícil em V do que o último. Como nossa abordagem geral de n vezes, crescer um 'x' não funcionará aqui, em vez disso, construiremos a parte superior do X, copiá-lo e invertê-lo e, em seguida, anexar as duas partes.

Explicação:

Àé*ÄJÀäl                " Insert ('*' * n) + (' ' * n) + ('*' * n) 
                        " The obvious way would be 'Àé*ÀÁ ÀÁ*', but this 
                        " non-obvious way saves us a byte
        Àñ      ñ       " 'n' times:
          Ù             "   Duplicate this line (below us)
           ãl           "   Move to the center of this line
             xx         "   Delete two characters
               >        "   And indent this line with one space.

Fazer o recuo no final do loop permite tirar vantagem de terminações implícitas . Isso também cria convenientemente n + 1 linhas, que é exatamente a metade superior do 'X'. Digamos que a entrada foi 4. Então, neste ponto, o buffer fica assim:

****    ****
 ****  ****
  ********
   ******
    ****

E nós estamos na última linha. Então nós:

                yH      " Copy the whole buffer and move to the first line
                  æG    " Reverse every line
                    Vp  " And paste what we just copied *over* the current
                        " line, deleting it in the process
DJMcMayhem
fonte
Também fiz a ãxxcoisa a princípio, mas acho que quebra por exemplo n = 8?
nmjcman101
@ nmjcman101 Ah, você está certo. Tudo bem se você o fizer ãl, ou se você recuar antes de centralizar, mas isso não salva nenhum bytes. Eu não entendo por que ele funciona para números menores.
DJMcMayhem
3

C #, 139 130 115 bytes

-1 byte, criando uma string e chamando WriteLine, salvando a verificação da nova linha.
-6 bytes graças a Kevin e suas técnicas principais de golfe!
-2 bytes substituindo n*3-npor n*2.
-15 bytes depois que Kevin gentilmente me apontou na direção certa: posso retornar a string em vez de imprimi-la, salvando a chamada em System.Console.WriteLine(). E algumas outras dicas também ...

n=>{var s="";for(int i,j=0;j<=n*2;j++,s+='\n')for(i=0;i<n*3;)s+=i>=j&i<j+n|i<=n*3-j-1&i++>=n*2-j?'*':' ';return s;}

Experimente online!

Ungolfed:

class Program
{
    static void Main(string[] args)
    {
        System.Func<int, string> g = n =>
        {
            var s = "";
            for (int i, j = 0; j <= n*2; j++, s += '\n')
                for (i = 0; i < n*3;)
                    s += i >= j & i < j+n | i <= n*3-j-1 & i++ >= n*2-j ? '*' : ' ';
            return s;
        };

        System.Console.Write(f(1));
        System.Console.Write(f(2));
        System.Console.Write(f(3));
        System.Console.Write(f(5));
        System.Console.Write(f(8));

        System.Console.ReadKey();
    }
}

Ele apenas percorre as linhas e colunas do espaço necessário para imprimir o X grande e imprime um '*'ou um, ' 'dependendo da condição.

Charlie
fonte
1
+1! Algumas pequenas coisas para jogar golfe. Tudo &&pode ser &e ||pode ser |neste caso. for(int j=0;pode ser for(int j=0,i;e, em seguida, você pode remover o int na frente do ino loop interno. Além disso, após a primeira alteração de &e |, você também pode remover o i++interior do loop for e alterar i==n*3-1?...para i++==n*3-1?....
Kevin Cruijssen
@KevinCruijssen muito obrigado! Alterei o loop interno e agora crio uma string para poder chamar WriteLine, salvo apenas 1 byte. Então agora não tenho certeza do que fazer com seu último conselho.
Charlie
1
Btw, por que o System.Console.WriteLine? Retornando a string: n=>{string s="";for(int i,j=0;j<n*2+1;j++,s+="\n")for(i=0;i<n*3;)s+=i>=j&i<j+n|i<=n*3-j-1&i++>n*2-j-1?'*':' ';return s;}é mais curto [ 120 bytes ] (e também se livra dos colchetes, colocando tudo dentro do loop for. Aqui está um link TIO para mostrar que funciona. Além disso, fique à vontade para adicionar isso (ou o seu) TIO-link para a sua resposta :).
Kevin Cruijssen
1
@KevinCruijssen Eu não sabia que o TIO podia lidar com código C #! Eu adicionei o WriteLineno código porque o OP solicitou a saída do X grande, não apenas para devolvê- lo, então achei que a saída do X (chamando o WriteLinemétodo) deveria fazer parte do código. No entanto, ainda não estou acostumado com as regras do code-golf e não sei quais licenças posso tirar ao escrever o código. Acabei de ver que algumas das outras respostas aqui imprimem o X no código, e outras imprimem no rodapé. Qual é a abordagem válida neste caso?
Charlie
1
Normalmente, o retorno de uma string e o uso de uma função em vez de um programa são permitidos por padrão, a menos que seja especificado o contrário. Além disso, na pergunta afirma "A saída pode ser impressa ou uma sequência de caracteres ou matriz de seqüências de caracteres ", portanto, o retorno de uma sequência de caracteres é permitido. :) Ah, e uma última coisa que você pode jogar golfe: j<n*2+1pode ser j<=n*2. Também criei uma porta Java 8 da sua resposta com a mesma contagem de bytes, creditando sua resposta incrível, é claro.
Kevin Cruijssen
3

Haskell , 88 87 86 bytes

-1 graças a @Laikoni

(!)=replicate
x n=[zipWith max(reverse m)m|m<-[i!' '++n!'*'++(n*2-i)!' '|i<-[0..n*2]]]

Experimente online!

bartavelle
fonte
1
zipWith max m(reverse m)pode ser reduzido para zipWith max(reverse m)m. É o mesmo que zipWith max=<<reverse$m, e mpode ser incorporado: Experimente online!
Laikoni
2

MATLAB, 153 126 bytes (17,6% ↓)

Graças ao comentário do @ LuisMendo, a função disp()pode gerar caracteres sem aspas simples, assim eu poderia impedir o uso fprintfcom formatse omitir alguns bytes. Além disso, o comentário dele me lembra que eu preciso usar char(32)para apresentar um espaço em vez de char(0)(nulo).

n=input('')
r=2*n+1
c=3*n
a=0
for i=0:n-1
a=a+[zeros(r,i),diag(1:r),zeros(r,c-r-i)];
end
a((a+flipud(a))>0)=10
disp([a+32 ''])

Experimente online!

MATLAB, 153 bytes

n=input('')
r=2*n+1
c=3*n
a=0
for i=0:n-1 
a=a+[zeros(r,i),diag(1:r),zeros(r,c-r-i)];
end
a((a+flipud(a))>0)=42
fprintf([repmat('%c',1,c),'\n'],char(a)')

Exemplo de resultado: n = 10

**********          **********
 **********        ********** 
  **********      **********  
   **********    **********   
    **********  **********    
     ********************     
      ******************      
       ****************       
        **************        
         ************         
          **********          
         ************         
        **************        
       ****************       
      ******************      
     ********************     
    **********  **********    
   **********    **********   
  **********      **********  
 **********        ********** 
**********          **********
Guoyang Qin
fonte
2

Python 2 , 93 90 89 83 bytes

-3 bytes graças a Freira Furada
-1 byte graças a Zachary T
-6 bytes graças a xnor

n=input()
x=n*'*'+n*'  '
exec"print`map(max,x,x[::-1])`[2::5];x=' '+x[:-1];"*(n-~n)

[Experimente online!] [TIO-j3xwsktf]

Começa com uma sequência como '*** 'for n=3, aplicando-se map/maxpara selecionar os *espaços excedentes para cada posição, depois acrescente um espaço e remova o último caractere da sequência e faça tudo isso de novo.

Cajado
fonte
90 bytes
Freira vazada
Você não pode substituir n*2*' 'com n*' '?
Zachary
O map(maxpode ser feito diretamente sem a zip. Além disso, n*2+1é n-~n.
xnor
1

Haskell , 70 bytes

f n=[[last$' ':['*'|y<-[1..n],(c-n-y)^2==r^2]|c<-[1..3*n]]|r<-[-n..n]]

Experimente online!

Produz uma lista de strings.

Para cada posição da linha r, coluna c, usa uma fórmula para determinar se ela cai em uma das duas bandas diagonais e assim é *.

xnor
fonte
1

Java 8, 119 118 bytes

n->{String r="";for(int i=0,j;i<=n*2;i++,r+="\n")for(j=0;j<n*3;r+=j>=i&j<i+n|j<=n*3-i-1&j++>=n*2-i?"*":" ");return r;}

Porto da incrível resposta C # de @CarlosAlejo , depois que eu o ajudei a jogar algumas coisas. Portanto, certifique-se de votá-lo também!

Experimente aqui.

Kevin Cruijssen
fonte
1

Javascript (ES2017), 155 157 bytes

n=>[...e=[...Array(n+1)].map((a,i)=>[...d=((b=''.padEnd(n))[c='slice'](i)+'*'.repeat(n)+b[c](0,i))[c](n/2)].reverse().join``+d[c](n%1)),...e.reverse()[c](1)]

Retorna uma matriz de seqüências de caracteres. Eu executo operações em matrizes e espelho. Provavelmente isso poderia ser otimizado com matrizes como as outras respostas, mas eu queria ser único.

Edit: Como apontado por Neil, para valores pares de n, a linha central não era nlarga, então eu adicionei um módulo para detectar pares / ímpares ao cortar a coluna.

n=5
['*****     *****',
 ' *****   ***** ',
 '  ***** *****  ',
 '   *********   ',
 '    *******    ',
 '     *****     ',
 '    *******    ',
 '   *********   ',
 '  ***** *****  ',
 ' *****   ***** ',
 '*****     *****']

Ungolfed

n => {
  e = [...Array(n+1)].map((a, i) => {   // Create and iterate over array with n+1 elements
    b = ''.padEnd(n)                    // String of n spaces
    d = (b.slice(i) + '*'.repeat(n) + b.slice(0, i)).slice(n/2) // Create row string
    return [...d].reverse().join`` + d.slice(1) // Mirror and combine row horizontally
  })
  return [...e,...e.reverse().slice(1)] // Mirror and combine vertically
}

Quadrante

n=5
   *****
  ***** 
 *****  
*****   
****    
***     

Espelhado horizontalmente

n=5
*****     *****
 *****   ***** 
  ***** *****  
   *********   
    *******    
     *****     

Espelhado verticalmente

n=5
*****     *****
 *****   ***** 
  ***** *****  
   *********   
    *******    
     *****     
    *******    
   *********   
  ***** *****  
 *****   ***** 
*****     *****
andrewarchi
fonte
Isso produz resultados incorretos para pares n- a linha central não é nlarga.
21417 Neil
0

Mathematica, 148 bytes

T=Table;(a=Join[T[T["*",i],{i,(n=#)+2,2n,2}],T[Join[t=T["*",n],T[" ",y],t],{y,1,n,2}]];Column[Row/@Join[Reverse@a,{T["*",n]},a],Alignment->Center])&
J42161217
fonte
0

R, 102 bytes

Código:

n=scan();x=matrix(" ",M<-3*n,N<-2*n+1);for(i in 1:N)x[c(i-1+1:n,M+2-i-1:n),i]="*";cat(x,sep="",fill=M)

Teste:

> n=scan();x=matrix(" ",M<-3*n,N<-2*n+1);for(i in 1:N)x[c(i-1+1:n,M+2-i-1:n),i]="*";cat(x,sep="",fill=M)
1: 10
2: 
Read 1 item
**********          **********
 **********        ********** 
  **********      **********  
   **********    **********   
    **********  **********    
     ********************     
      ******************      
       ****************       
        **************        
         ************         
          **********          
         ************         
        **************        
       ****************       
      ******************      
     ********************     
    **********  **********    
   **********    **********   
  **********      **********  
 **********        ********** 
**********          **********
djhurio
fonte
0

CJam, 24 bytes

{:T2*){S*T'**+}%_W%..e>}

Este é um bloco que pega um número da pilha e gera uma lista de linhas para a pilha.

Explicação:

{                        e# Stack:           | 2
 :T                      e# Store in T:      | 2, T=2
   2*                    e# Multiply by 2:   | 4
     )                   e# Increment:       | 5
      {                  e# Map over range:  | [0
       S                 e#   Push space:    | [0 " "
        *                e#   Repeat string: | [""
         T               e#   Push T:        | ["" 2
          '*             e#   Push char '*': | ["" 2 '*
            *            e#   Repeat char:   | ["" "**"
             +           e#   Concatenate:   | ["**"
              }%         e# End:             | ["**" " **" "  **" "   **" "    **"]
                _        e# Duplicate:       | ["**" " **" "  **" "   **" "    **"] ["**" " **" "  **" "   **" "    **"]
                 W%      e# Reverse:         | ["**" " **" "  **" "   **" "    **"] ["    **" "   **" "  **" " **" "**"]
                   ..e>  e# Overlay:         | ["**  **" " ****" "  **" " ****" "**  **"]
                       } e# End
Esolanging Fruit
fonte
0

Python 2 , 110 bytes

x=a=0
n=c=input()
while x<2*n+1:
    print ' '*a+'*'*n+' '*c+'*'*(2*n-2*a-c)
    x+=1
    a=n-abs(n-x)
    c=max(0, n-2*a)

Este programa divide cada linha em 4 partes, primeiros espaços, primeiras estrelas, segundos espaços e depois segundas estrelas. Para cada linha horizontal do X, ele calcula quantas estrelas ou espaços são necessários para cada uma das 4 seções da linha e depois constrói e imprime essa sequência.

jacoblaw
fonte
0

Retina , 144 bytes

.+
 $&$* $&$* $&
 
$`#$'¶
¶\d+$

( *)#( *)(\d+)
$1$3$**$2#$3$* #$2$3$**$1
( +)(\*+)( *)(# +#)\3\2\3 +
$3$2$1$4$1$2$3
+` (# +#)
$1 
+` #...
#
##

Experimente online! Explicação:

.+
 $&$* $&$* $&

Adicione 2n + 1 espaços antes do valor de entrada (um para cada linha de saída).

$`#$'¶

Substitua cada espaço por a #e colete os resultados. Isso fornece uma linha diagonal de #s, preenchida com espaço em ambos os lados, com o valor de entrada com sufixo.

¶\d+$

Exclua o valor de entrada original, pois agora temos uma cópia em cada linha.

( *)#( *)(\d+)
$1$3$**$2#$3$* #$2$3$**$1

Construa duas linhas diagonais de n *s, com uma coluna separadora de nespaços envolvida em um par de #s.

( +)(\*+)( *)(# +#)\3\2\3 +
$3$2$1$4$1$2$3

Nas linhas em que os *s estão mais próximos do meio, troque as duas metades. Isso dá uma aparência semelhante > | | <.

+` (# +#)
$1 

Mova os | |s para a esquerda o máximo possível, dando uma >> > <aparência.

+` #...
#

Para cada espaço entre os #, exclua os três caracteres a seguir. Isso une o > <em um X.

##

Exclua os #s agora desnecessários .

Neil
fonte