Desenhe uma barra grande X

21

Dado um número inteiro não negativo, imprima um Xque seja tão grande. Xé a saída da entrada 0e você adicionará barras iguais à entrada em cada direção para estender as Xentradas maiores.

Casos de teste

0 0

X

1

\ /
 X
/ \

2

\   /
 \ /
  X
 / \
/   \

...

10

\                   /
 \                 /
  \               /
   \             /
    \           /
     \         /
      \       /
       \     /
        \   /
         \ /
          X
         / \
        /   \
       /     \
      /       \
     /         \
    /           \
   /             \
  /               \
 /                 \
/                   \

Regras

Você pode imprimir a saída ou retornar uma sequência ou lista de sequências de uma função. É permitida uma nova linha à direita, bem como um espaço em branco interno extra que não afeta a aparência.

Isso é , então a resposta mais curta em bytes vence!

Stephen
fonte
Sandbox ; relacionado
Stephen
6
... Vou esperar pela solução de 1 byte de carvão.
Freira vazada
@LeakyNun Eu ficaria surpreso se carvão vegetal pode facilmente lidar com o Xno meio (parte do motivo pelo qual eu adicionei-lo), mas quem sabe: D
Stephen
Relacionado , relacionado
xnor 8/17

Respostas:

6

Tela , 3 bytes

╵\┼

Experimente aqui!

metade do tamanho da resposta do carvão vegetal: D

╵    increment the input
 \   create a diagonal that long
  ┼  and quad-palindromize, mirroring what's required, with 1 overlap;
     This overlaps the `/` and `\`, resulting in `X`
dzaima
fonte
Dang que é curto.
dylnan
: ||||||| +1 para golfiness
somente ASCII
Também me pergunto se linguagens baseadas em pilha basicamente sempre superam outras línguas?
somente ASCII
@
Jelly
@Okx * baseado em pilha / tácito
ASCII-only
22

Carvão , 6 bytes

PX⁺¹NX

Seu absurdo não está me impedindo;)

Experimente online!

Okx
fonte
2
Os olhares TIO ... interessante quando você colocar um número muito grande para ele
Stephen
@StephenS Somente por causa da embalagem.
Okx
Eu sei, é apenas intuitivo que todos os envolvidos `\` s ficar alinhado à esquerda (porque os espaços não se envolveu)
Stephen
5 caracteres (é posterior desafiar) apenas para obter um pouco mais perto de lona
ASCII-only
16

JavaScript (ES6), 79 bytes

Usa uma função recursiva g que percorre uma grade e constrói o caractere de saída por caractere.

n=>(g=x=>`/\\ X
`[~x?x-y?x+y-w&&2:x-n?1:3:4]+(~y?g(~x--?x:y--&&w):''))(y=w=n*2)

Quão?

Ambas as variáveis x e y iteram de 2n a -1 , onde n é a entrada.

Para cada posição (x, y) na grade, escolhemos um destes caracteres:

  • 0: /
  • 1: \
  • 2: espaço
  • 3: X
  • 4: nova linha

usando os seguintes testes:

  • ~x: Falsy se x == -1 : chegamos ao fim da linha.
  • x-y: Falsy se x == y : estamos localizados na anti-diagonal.
  • x+y-w: Falsy se x + y == w : estamos localizados na diagonal.
  • x-n: Falsy se x == n : como esse teste é realizado apenas quando x == y , isso significa que estamos localizados no centro exato da grade.

e a seguinte árvore de decisão:

árvore de decisão

Demo

Arnauld
fonte
4
Isto é ... JavaScript? O que aconteceu com você, velho amigo.
roberrrt-s
13

MATL , 16 bytes

'\/X 'iEQXytEP+)

Experimente online!

Considere a entrada 2como um exemplo. A pilha é mostrada aqui de cabeça para baixo, ou seja, os elementos inferiores são os mais recentemente empurrados.

'\/X '  % Push this string
        %   STACK: '\/X '
iEQ     % Input a number, n. Multiply by 2, add 1: gives 2*n+1
        %   STACK: '\/X '
                   5
Xy      % Identity matrix of that size
        %   STACK: '\/X '
                   [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]
tEP     % Duplicate, multiply each entry by 2, flip vertically
        %   STACK: '\/X '
                   [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]
                   [0 0 0 0 2;
                    0 0 0 2 0;
                    0 0 2 0 0;
                    0 2 0 0 0;
                    2 0 0 0 0]
+       % Add the two matrices
        %   STACK: '\/X '
                   [1 0 0 0 2;
                    0 1 0 2 0;
                    0 0 3 0 0;
                    0 2 0 1 0;
                    2 0 0 0 1]
)       % Index into the string. Indexing is 1-based and modular, so 1 picks
        % the first character ('\'), ..., 0 picks the last (space)
        %   STACK: ['\   /';
                    ' \ / ';
                    '  X  ';
                    ' / \ ';
                    '/   \']
        % Implicit display
Luis Mendo
fonte
Eu queria fazer algo semelhante no Octave, mas você me venceu e no MATL é ainda mais curto que o Octave, um ótimo trabalho!
precisa saber é
@Michthan Thanks! Uma versão do Octave com certeza também valeria a pena ser postada. Minha tentativa é de 38 bytes, qual é a sua?
Luis Mendo
Eu estive pensando nisso durante todo o fim de semana e não consegui encontrar uma maneira mais eficiente do que a que você está usando aqui. Portanto, todos os créditos devem ir para você para uma versão de oitava.
12337 Michthan
6

C, 108 106 bytes

a;g(n){for(int b=2*n,i=1,c=47;a+=i;b?puts(""):(i=-i,c=92),b-=2*i)printf("%*c%*c",a,b?c+45*i:88,b,b?c:10);}

Experimente online!

(-2 golfe graças ao MD XF)

Ele imprime dois caracteres (a princípio, c = 47que é uma barra e c + 45, que é uma barra invertida; depois são trocados) com uma largura de campo dinâmica.

As larguras dos campos começam em 1e 2n, e a cada iteração, a primeira largura é incrementada em 1 e a segunda é diminuída em 2.

Quando a largura do segundo campo se torna 0, ela gera 'X'uma nova linha em vez dos caracteres regulares e inverte a direção dos incrementos ( i). Uma nova linha é impressa para todas as outras linhas separadamente ( puts("")).

anatolyg
fonte
106 bytes: a,b,i=1,c;g(n){for(b=2*n,c=47;a+=i;b?puts(""):(i=-i,c=92),b-=2*i)printf("%*c%*c",a,b?c+45*i:88,b,b?c:10);} Experimente online!
MD XF
Obrigado pela ideia! Eu usei apenas uma parte dele para garantir que o código possa ser chamado duas vezes.
anatolyg
5

shortC , 111 bytes

s(x){Wx--)R" ")}j;f(x){O;j<x;j++)s(j),P92),s((x-j)*2-1),R"/\n");s(x);R"X\n");Wj--)s(j),P47),s((x-j)*2-1),R"\\\n

Com base na minha resposta C . Conversões:

  • R -> printf(
  • P -> putchar(
  • W -> while(
  • O -> for(
  • Fechamento inserido automaticamente ");}

Isso também usa códigos ASCII para \e /.

Experimente online!

MD XF
fonte
5

C, 168 155 150 bytes

-5 graças a Computronium

#define p printf(
s(x){while(x--)p" ");}j;f(x){for(;j<x;j++)s(j),p"\\"),s((x-j)*2-1),p"/\n");s(x);p"X\n");while(j--)s(j),p"/"),s((x-j)*2-1),p"\\\n");}

Certamente pode ser jogado golfe; Eu estou fazendo isso. Experimente online!

Ungolfed:

int space(int x)
{
    while (x--)
        putchar(' ');
}

int f(int x)
{
    for (int j = 0; j < x; j++) {
        space(j);
        printf("\\");
        space((x-j)*2-1);
        printf("/\n");
    }

    space(x);
    puts("X");

    while (j--) {
        space(j);
        putchar('/');
        space((x-j)*2-1);
        printf("\\\n");
    }
}
MD XF
fonte
2
Você pode perder 5 caracteres definindo p como "printf" ("em vez de" "printf").
Computronium
3

V , 21 bytes

éXÀñ>HÄÒ r\Á/YGpr/$r\

Experimente online!

Hexdump:

00000000: e958 c0f1 3e48 c4d2 2072 5cc1 2f59 4770  .X..>H.. r\./YGp
00000010: 722f 2472 5c                             r/$r\

Explicação:

éX                      " Insert an 'X'
  Àñ                    " Arg1 times:
    >H                  "   Add a space to every line.
                        "   Conveniently, this also puts us on the first line
      Ä                 "   Duplicate this line
       Ò                "   And replace the whole line with spaces
         r\             "   Replace the first char with '\'
           Á/           "   Append a '/' char
             Y          "   Yank this line
              G         "   Move to the last line
               p        "   And paste the line we yanked
                r/      "   Replace the first character with a '/'
                  $     "   Move to the end of the line
                   r\   "   And replace the last character with a '\'

Basicamente, temos Inserir um X, n vezes estendemos as barras .

Mas não é tão simples assim, porque também precisamos adicionar as barras na primeira vez. Se as barras já estavam lá, poderíamos escrever estender as barras como:

>HÄX2pGÙX2p

O que nos pouparia 6 bytes.

DJMcMayhem
fonte
3

C #, 157 122 120 bytes

_=d=>"".PadLeft(d)
a=>{var s=_(a)+"X\n";for(int i=0;++i<=a;)s=$@"{_(a-i)}\{_(i*2-1)}/
{s+_(a-i)}/{_(i*2-1)}\
";return s;}

Versão não destruída:

 Func<int, string> _ = (d) =>"".PadLeft(d);
        Func<int, string> func = a => {

            var s = _(a) + "X\n";

            for (int i = 0; ++i <= a;) {

                s = $@"{_(a - i)}\{_(i * 2 - 1)}/
{s + _(a - i)}/{_(i * 2 - 1)}\
";

            }
            return s;
        };
LiefdeWen
fonte
1
Você pode mover a outra função anônima da primeira e incluí-la como _=d=>new string(' ',d);(note que não há necessidade de chaves d). Você pode remover as chaves ao redor do loop for. Utilize uma sequência literal com, para não precisar escapar de todas as barras invertidas. Se você definir i=0, poderá fazer ++i<a+1e remover o i++.
TheLethalCoder
Além disso, com strings textuais, você não precisa incluir \num feed de linha real, mas não tenho certeza se será possível remover os chavetas ao redor do loop for, você precisaria tentar.
TheLethalCoder
1
Depois de aplicar a primeira sugestão de TheLethalCoder , você também pode substituir o ++i<a+1para ++i<=a EDIT Você também pode economizar mais 4 bytes por mudar a Funcpartir new string(' ',d)de"".PadLeft(d)
auhmaan
Obrigado por sugestões, @TheLethalCoder, posso declarar 2 funções como essa, isso não tornaria muito mais o C # golf mais curto, se pudermos fazer isso?
precisa saber é o seguinte
1
@StefanDelport Há uma meta-discussão em algum lugar, mas, como está, acredito que você pode, desde que mostre o nome das funções. Nesse caso _.
TheLethalCoder 9/17
3

Mathematica, 71 bytes

(Parcialmente inspirado na solução de 104 bytes de Jenny_mathy)

""<>#&/@(#"\\"+Reverse@#"/"&@IdentityMatrix[2#+1]/.{0->" ",a_+_->"X"})&

Retorna uma lista de strings.

Explicação: IdentityMatrix[2#+1]cria uma matriz do tamanho certo com 1s na diagonal e 0s em outro lugar. Em seguida, multiplicamos por "\\"(uma barra invertida escapada), o que a torna uma matriz com barras invertidas ao longo da diagonal e 0s em outros lugares, pois é claro que 1 vezes a barra invertida é invertida e 0 vezes a barra invertida é 0. Adicionamos isso às "/"vezes seu reverso para fazer a forma X. Estamos quase terminando, exceto que ainda existem 0s em todos os lugares, e o meio está "\\" + "/". Corrigimos essas duas coisas substituindo " "por 0e "X"para a_+_, que corresponde a qualquer soma de duas coisas (como _+_deveria, exceto que o Mathematica é inteligente demais para o seu próprio bem e interpreta isso como 2 vezes _). Finalmente, ""<>#&/@transforma isso em uma lista de strings.

Não é uma árvore
fonte
3

Java (OpenJDK 8) , 135 bytes

i->{int k=0,j,l=2*i+1;String[]s=new String[l];for(;k<l;k++)for(s[k]="",j=0;j<l;j++)s[k]+=j==k?j==i?"X":"\\":j==l-1-k?"/":" ";return s;}

Expressão lambda que pega e número inteiro e retorna uma matriz de Strings

Experimente online!

Ungolfed:

i->{
    int k=0,j,l=2*i+1;                // Some variables to be used
    String[]s=new String[l];            // Return array (size 2*i+1)
    for(;k<l;k++)                       // For each array entry
        for(s[k]="",j=0;j<l;j++)        // Set each character to 
            s[k]+=j==k?j==i?"X":"\\"    // \ or X if it's the jth character of the jth row
                 :j==l-1-k?"/"          // / if it's the opposite char
                 :" ";                  // else blank
    return s;
}
PunPun1000
fonte
3

T-SQL, 201 bytes

DECLARE @ INT SELECT @=a FROM t DECLARE @i INT=@
WHILE @>0BEGIN PRINT SPACE(@i-@)+'\'+SPACE(2*@-1)+'/'SET @-=1 END
PRINT SPACE(@i)+'X'WHILE @<@i BEGIN SET @+=1 PRINT SPACE(@i-@)+'/'+SPACE(2*@-1)+'\'END

Formatado:

DECLARE @ INT 
SELECT @=a FROM t 
DECLARE @i INT=@
WHILE @>0
    BEGIN
        PRINT SPACE(@i-@)+'\'+SPACE(2*@-1)+'/'
        SET @-=1 
    END
PRINT SPACE(@i)+'X'
WHILE @<@i 
    BEGIN 
        SET @+=1 
        PRINT SPACE(@i-@)+'/'+SPACE(2*@-1)+'\'
    END

A entrada é via coluna a na tabela nomeada t , de acordo com nossas diretrizes .

BradC
fonte
3

Rubi , 66 bytes

Função recursiva.

f=->x{?X[x]||"\\#{s=' '*(2*x-1)}/
#{f[x-1].gsub /^/,' '}
/#{s}\\"}

Experimente online!

Explicação

f=->x{                  # Start of recursive function named `f`
      ?X[x]||           # Return 'X' if x==0, otherwise the following:
"\\#{s=' '*(2x-1)}/     #  Top edge of the cross. Save no. of spaces needed
#{f[x-1]                #  Get result of f[x-1]
        .gsub /^/,' '}  #  Regex sub to left-pad every line w/ a space
/#{s}\\"                #  Bottom edge of cross (insert saved no. of spaces)
Value Ink
fonte
3

Geléia , 24 17 bytes

Ḥ‘=þ`µḤ+Uị“/\x ”Y

Experimente online!

Como funciona

Ḥ‘=þ`µḤ+Uị“/\x ”Y   main link, input a
Ḥ‘                  input doubled and incremented
   þ                Make a table: Apply  
  =                 "equals"/ to      
    `               each element in range(2a+1) cartesian multiplied with itself.
                      eg. For input 1: [1=1,1=2,1=3],[2=1,2=2,2=3],[3=1,3=2,3=3]      
     µ              on this array:
       +            add: 
      Ḥ             double of it to
        U           its reverse (changes south-east to north-west)
         ị“/\x ”    index into the string "/\x " to get the right characters
                Y   join by newlines for the final output.

-6 bytes graças a @LeakyNun e -1 byte com uma melhoria adicional

fireflame241
fonte
18 bytes
Freira vazada
2

Lote, 201 bytes

@echo off
set s= /
for /l %%i in (2,1,%1)do call set s=  %%s%%
set s=\%s%
for /l %%i in (-%1,1,%1)do call:c
exit/b
:c
echo %s%
set s=%s:\ = \%
set s=%s:X =/\%
set s=%s:\/=X %
set s=%s: /=/ %

Começa construindo a linha superior e, depois de imprimir cada linha, move o \espaço direito e /esquerdo uma vez, certificando-se de que eles fazem um Xno meio.

Neil
fonte
2

PHP , 115 bytes

for(;$i<$c=1+2*$argn;$b?:$t[$i-1]="\\".!$t[$c-$i]="/",$o.="$t\n")$t=str_pad(" X"[$b=$argn==+$i++],$c," ",2);echo$o;

Experimente online!

Jörg Hülsermann
fonte
2

Retina , 74 bytes

.+
$* X
+`^ ( *).( *)
$1\  $2/¶$&
+`¶ ( *).( *).?$
$&¶$1/  $2\
m` (\W)$
$1

Experimente online! Explicação:

.+
$* X

Coloque o X.

+`^ ( *).( *)
$1\  $2/¶$&

Começando em X, trabalhando para cima, coloque uma \diagonal para a esquerda a cada vez. Coloque também /mais dois espaços após a /última vez.

+`¶ ( *).( *).?$
$&¶$1/  $2\

Começando em X, trabalhando para baixo, coloque uma /diagonal para a esquerda a cada vez. Coloque também \mais dois espaços após a /última vez.

m` (\W)$
$1

O número de espaços entre as duas diagonais precisa ser ímpar; portanto, o último espaço em cada linha (exceto a Xlinha original ) é excluído.

Neil
fonte
2

Mathematica, 131 bytes

(F[x_,y_]:=Table[x<>StringJoin@Table[" ",i]<>y,{i,1,#*2,2}];Column[Join[Reverse@F["\\","/"],{"X"},F["/","\\"]],Alignment->Center])&


Mathematica, 104 bytes

aqui está outra abordagem usando o Grid

(S=DiagonalMatrix[Table["\\",r=2#+1]];Table[S[[r+1-i,0+i]]="/",{i,r}];S[[#+1,#+1]]="X";Grid@S/. 0->" ")&
J42161217
fonte
2

APL (Dyalog) , 25 bytes

Requer ⎕IO←0qual é o padrão em muitos sistemas.

' \/X'[(⊢+2×⌽)∘.=⍨⍳1+2×⎕]

Experimente online!

' \/'[] Indexe a string com

 obter entrada

 multiplicar por dois

1+ Adicione um

 do que muitos números inteiros

∘.=⍨ tabela de igualdade (ou seja, matriz de identidade; diagonal NW-SE)

() Aplique a seguinte função tácita nesse

   o argumento

  + mais

   duas vezes

   o argumento espelhado horizontalmente (ou seja, diagonal NE-SW)

Adão
fonte
2

Bash , 138 bytes

for i in `seq $1;seq $[$1-1] -1 1`
{ $[a++]
printf "%*c%*s\n" `echo ' '$i $[a>$1?1:2] $[($1-i)*2]' '$[a<$1?1:2]`
}|sed 's/22/X/'|tr 12 /\\

Experimente online!

Muito longo, o bash aquece '\ e /'

Menos golfe

 for i in {1..10} {9..1};{
   $[a++];                      #argument as padding, prints 1 for \ and 2 for /
   printf "%*c%*s\n" `echo ' '$i $[a>$1?1:2] $[($1-i)*2]' '$[a<$1?1:2]`;
  }|sed 's/22/X/g' | tr 12 /\\
marcosm
fonte
2

Python 2 , 95 84 bytes

-10 bytes graças a @FelipeNardiBatista

f=lambda s,i='\n':i+(s and'\\'+'  '*~-s+' /'+f(s-1,i+' ')+i+'/'+'  '*~-s+' \\'or'X')

Experimente online!

ovs
fonte
1
85 bytes: TIO
Felipe Nardi Batista
@FelipeNardiBatista thanks much
ovs
1

Perl 5, 110 + 1 = 111 bytes

Usa -nsinalizador.

$x=$_;$,="\n";push@x,$"x($x-$_)."\\".$"x(2*--$_+1)."/"while$_>0;say@x,$"x$x."x";for(reverse@x){y!\\/!/\\!;say}
Chris
fonte
1

QBIC , 90 bytes

~b=0|?@X`\[0,:-1|X=space$(a)┘Z=Z+X+@\`+space$((b-a)*2-1)+@/`+X+@┘`]Z=Z+space$(b)+A+_fZ

Como essa monstruosidade funciona, é deixado como um exercício para o leitor ...

Saída de amostra:

Command line: 3
\     /
 \   / 
  \ /  
   X
  / \  
 /   \ 
/     \
steenbergh
fonte
1

Visual Basic.Net , 454 450 bytes

Option Strict Off
module m
sub main(a As String())
dim v=Convert.toInt32(a(0))
for i as Integer=v to 1 step -1
for j as Object=1 to v-i
w(" ")
next
w("\")
for j as Object=1 to i*2-1
w(" ")
next
console.writeline("/")
next
console.writeline(new String(" ",v)&"X")
for i as Object=1 to v
for j as Object=1 to v-i
w(" ")
next
w("/")
for j as Object=1 to i*2-1
w(" ")
next
console.writeline("\")
next
end sub
sub w(s)
console.write(s)
end Sub
end module

Não tenho certeza se fazer uma func para writelinevai economizar alguns bytes graças a Stephen S para apontando para as ...remoção também mudou integerna object última edição mudou a primeira volta

polyglotrealIknow
fonte
Você é corajoso :) Eu acredito que você pode remover tudo isso as Types, porque, se o tiver Option Strict Off, o VB.NET age como uma linguagem pouco digitada.
Stephen
Actualmente em Linux mono é anoying
polyglotrealIknow
mono faz não se preocupa com Option Strict, ou pelo menos isso é o que eu penso
polyglotrealIknow
Oh parecia functions =! for loops Agradecimentos para o golfe
polyglotrealIknow
Não está Option Strictdesativado por padrão? É no Visual Studio, pelo menos
Stephen
1

05AB1E , 22 bytes

F'\IN-úR.∞})Âí'Xs)˜.c»

Experimente online!

Explicação

F                        # for N in [0...input-1] do
 '\                      # push a backslash
   IN-ú                  # prepend input-N spaces
       R                 # reverse
        .∞               # mirror
          }              # end loop
           )             # wrap stack in a list
            Â            # bifurcate
             í           # reverse each item
              'Xs        # push an "X" between the 2 lists on the stack
                 )˜      # wrap in flattened list
                   .c    # pad lines to equal length
                     »   # join on newlines

Solução alternativa de 22 bytes

F'\N·>ú'/ì})Âí'X¸«ì.c»
Emigna
fonte
1

Pyke, 14 bytes

\XQV.X \   /\/

Experimente aqui!

\X             - "X"
  QV           - repeat input times:
    .X \   /\/ -  surround(^, all=" ", 
                              tl="\", 
                              left=" ",  
                              right=" ",  
                              lower=" ",  
                              tr="/",  
                              br="\",  
                              bl="/")
Azul
fonte
1

tcl, 134

proc P {x s b} {time {puts [format %[incr ::i $x]s%[expr ($::n-$::i)*2+2]s $s $b]} $::n}
P 1 \\ /
puts [format %[incr i]s X]
P -1 / \\

demonstração

Conjunto n na primeira linha.

Pode ser que eu possa jogar mais usando uma abordagem recursiva

sergiol
fonte
1

R , 75 72 bytes

y=diag(b<-2*scan()+1);write(c(" ",'\\','/','X')[y+2*y[,b:1]+1],'',b,,'')

Inspirado por esta resposta , gera uma matriz implícita e a grava no stdout; lê o tamanho de stdin. Ele precisa criar uma matriz de caracteres de espaço e usar sep=''b / c, caso contrário, ele terá problemas de espaçamento.

diag(b)                     # generates a main diagonal of 1, rest 0
2*diag(b)[,b:1]             # the other diagonal is 2
                            # [,b:1] reverses columns
                            # [b:1,] reverses the rows; they're equivalent
diag(b)+2*diag(b)[,b:1]     # sums, so we get 1 for main diagonal
                            # 2 for other diagonal, 3 for center
diag(b)+2*diag(b)[,b:1]+1   # add 1 since R is 1-indexed
                            # the result is indices for the vector
c(' ','\\','/','X')

Experimente online!

Giuseppe
fonte