Este desafio usa o caractere '+'

28

Sua tarefa: dado um número n, gere um sinal de '+' ndistante dos caracteres do centro. Se isso for confuso, verifique os casos de teste.

Métodos padrão de entrada: a saída deve ser uma sequência ou impressa. Aplicam-se brechas padrão.

Input: 1
Output: +           ] 1 away from center `+`.

Input: 2
Output:  +          ] 2 away from center `+`.
        +++         ] 1 away from center `+`.  
         +

Input: 3
Output:   +         ] 3 away from center `+`.
          +
        +++++
          +
          +

Isso é , então o código mais curto vence!

Camarada SparklePony
fonte
Eu assumo espaços à direita em cada linha são permitidos para que o resultado seja quadrado, certo?
Luis Mendo
@LuisMendo Sim, tudo bem.
precisa saber é o seguinte
Relacionado .
1111 Neil
3
"gera um sinal de '+' que está n caracteres fora do centro" - não entendo esta parte. A que centro você está se referindo? Como algo pode ser excêntrico para si mesmo? Por favor, esclareça.
Wossname
6
Teria sido muito menos confuso se o centro estivesse 0 longe de si.
parar de prejudicar Monica

Respostas:

45

Carvão , 5 bytes

P+×+N

Experimente online!

fergusq
fonte
22
O que é essa linguagem?
DJMcMayhem
@DJMcMayhem Basicamente, você pode criar arte ASCII com gráficos de tartaruga. Ele possui muitos recursos úteis para renderizar diferentes tipos de formas ASCII (como P+= cruz).
Fergusq 11/04/19
Esses não são caracteres multibyte?
Petah
3
O @Petah Charcoal usa uma página de código personalizada .
somente ASCII
@fergusq Você pode estar misturando carvão com turtled : P, carvão vegetal não é realmente uma linguagem de gráficos de tartaruga
ASCII-only
25

Python 2 , 53 bytes

n=2*input()-1;C='+'.center
for c in C(n):print C(n,c)

Experimente online!

Dennis
fonte
12

JavaScript (ES6), 67 65 63 60 59 bytes

x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
  • 2 bytes salvos substituindo duas ocorrências de x-1, a primeira com --xe a segunda com x.
  • 2 bytes salvos graças ao Kritixi Lithos , substituindo "\n"por `[newline]`.
  • 3 bytes salvos graças ao user2428118 , finalmente me ajudando a descobrir uma maneira de usar o pseudônimo de repeatuma maneira que reduzisse o tamanho. (Com menção honrosa a Marie por seus esforços também)
  • 1 byte economizado indiretamente graças a Herman.

Tente

f=
x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
oninput=_=>o.innerText=f(+i.value)
o.innerText=f(i.value=3)
<input id=i min=1 type=number><pre id=o>

Shaggy
fonte
11
Eu não estou totalmente certo, mas acho que você pode substituir o "\n"com dois acentos graves e uma nova linha literal entre eles
Kritixi Lithos
Obrigado, @KritixiLithos; Não sei por que não pensei nisso antes.
Shaggy
11
Parece que você provavelmente poderia salvar um byte por aliasing repetição, por exemplo, a='repeat',v=.....e` `[a]
Marie
Obrigado, @Marie; Eu tinha tentado fazer alias, repeat()mas minhas primeiras tentativas foram 2 ou 3 bytes maiores, então eu a abandonei! Vou dar uma outra olhada quando voltar à frente de um computador.
Shaggy
2
x=>(v=(` `[r='repeat'](--x)+`+<newline>`)[r](x))+`+`[r](x*2+1)+`<newline>`+v
precisa saber é o seguinte
9

MATL , 11 bytes

tZv=&+g43*c

Experimente online!

Explicação com exemplo

Considere n = 3.

t     % Implicitly input n. Duplicate
      % STACK: 3, 3
Zv    % Symmetric range
      % STACK: 3, [1 2 3 2 1]
=     % Equal, element-wise
      % STACK: [0 0 1 0 0]
&+    % All pair-wise additions. Gives a 2D array
      % STACK: [0 0 1 0 0;
                0 0 1 0 0;
                1 1 2 1 1;
                0 0 1 0 0;
                0 0 1 0 0]
g     % Logical: convert non-zero to one
      % STACK: [0 0 1 0 0;
                0 0 1 0 0;
                1 1 1 1 1;
                0 0 1 0 0;
                0 0 1 0 0]
43*   % Multiply by 43 (ASCII for '+'), element-wise
      % STACK: [ 0  0 43  0  0;
                 0  0 43  0  0;
                43 43 43 43 43;
                 0  0 43  0  0;
                 0  0 43  0  0]
c     % Convert to char. Char 0 is displayed as space. Implicitly display.
      % STACK: ['  +  ';
                '  +  ';
                '+++++';
                '  +  ';
                '  +  ']
Luis Mendo
fonte
8

Carvão , 16 13 bytes

Nα×+α←↑×+α‖O↘

Experimente online!

Usa uma abordagem diferente da outra resposta do carvão vegetal.

Explicação

Nα                       # Take input and store it in variable α
×+α                       # α times write a +
←                         # Go left
↑×+α                      # α times write a + upwards

Agora o canto superior esquerdo está completo, será algo parecido com isto:

  +
  +
+++

‖O↘                      # Reflect-overlap it in a SE direction

O último passo é a chave para este programa, ele usa a parte superior esquerda do sinal de adição para gerar o resto do sinal de mais, refletindo-o na direção sudeste (para a direita e para baixo).

Kritixi Lithos
fonte
O carvão vegetal tem sua própria página de código? Muitos desses caracteres têm vários bytes em UTF-8.
TRiG 12/04
@TRiG Sim, tem !
precisa saber é o seguinte
8

Linguagem de programação de Shakespeare , 749 743 bytes

N.Puck,.Page,.Ford,.Ajax,.Act I:.Scene I:.[Enter Puck and Ford]Puck:Listen to thy heart!Ford:You is the difference between a cat and I.Scene V:.[Exeunt][Enter Page and Ajax]Ajax:You is the difference between a cat and Ford.Scene X:.Page:You is the product of Puck and I.Is you as big as zero?If so,you is the sum of the sum of the sum of a big big big big big cat and a big big big cat and a big cat and a cat.If not,you big big big big big cat.Speak thy mind!Ajax:You is the sum of you and a cat.Is you as big as Ford?If not,let us return to Scene X.Page:You is the sum of a big big big cat and a big cat.Speak thy mind![Exit Page][Enter Puck]Ajax:You is the sum of you and a cat.Is you as big as Ford?If not,let us return to Scene V.[Exeunt]

Experimente online!

Editar: tornou a resposta compatível com a implementação oficial do SPL - eu não conseguia fazê-lo funcionar antes.

Golpeou 6 bytes porque os números das cenas não precisam ser consecutivos.

Explicação :

SPL é um esolang projetado para se parecer com peças de Shakespeare. Substantivos positivos têm o valor de 1 (aqui gato é usado) e substantivos negativos têm o valor de -1 (nenhum foi usado, mas porco é um deles). Os adjetivos modificam uma constante multiplicando-a por 2.

N.

Tudo até o primeiro ponto é o título e não importa.

Puck,.                           row counter
Page,.                           column counter
Ford,.                           input
Ajax,.                           temp

Os caracteres são variáveis ​​inteiras, cada um deles também tem uma pilha, mas eu não precisava usar esse recurso.

Act I:.
Scene I:.

Atos e cenas são usados ​​como marcadores de goto

[Enter Puck and Ford]

Só é útil se exatamente dois personagens estiverem no palco ao mesmo tempo.

Puck:Listen to thy heart!

Lê um número e faz Ford se lembrar dele.

Ford:You is the difference between a cat and I.

Como você pode ver, o Engrish é válido no SPL. Isso torna o valor de Puck "o diferente entre um gato e eu". Mas o que isso significa? caté um substantivo positivo, por isso é Puck = 1 - Ford.

Scene II:.
[Exeunt]

Exeunt é apenas um plural de "saída", e sem argumentos significa que todos no palco saem.

[Enter Page and Ajax]
Ajax:You is the difference between a cat and Ford.

Também é, Page = 1 - Fordmas é falado por um ator diferente, então isso Iseria errado. Como é um loop, não posso simplesmente copiar o valor de Puck.

Scene III:.
Page:You is the product of Puck and I.

Bem direto agora. Ajax = Puck * Page.

Is you as big as zero?

"as [adj] as" é o ==operador.

If so,you is the sum of the sum of the sum of a big big big big big cat and a big big big cat and a big cat and a cat.

Se Ajax == 0 ... "gato" é 1, "gato grande" é 2, "gato grande" é 4 e assim por diante. Depois de substituir as constantes simples, obtemos "a soma da soma da soma de 32 e 8 e 2 e 1" -> "a soma da soma de 40 e 2 e 1" -> "a soma de 42 e 1" -> "43", que é o ASCII para +.

If not,you fat fat fat fat fat cat.

caso contrário, é apenas "gordo gordo gordo gordo gordo", então o Ajax recebe o valor de 32, o ASCII por um espaço.

Speak thy mind!

Este é o comando para gerar um caractere.

Ajax:
You sum you and cat.Is you as big as Ford?If not,let us return to Scene III.

Esta é uma construção de loop. "Você soma você e gato" incrementa a página e if(Page != Ford) goto Scene III. O restante do programa usa os mesmos componentes, portanto, aqui está uma versão mais legível do pseudocódigo:

Scene1:
    input = [número da entrada];
    linha = 0 - entrada + 1;
Scene2:
    col = 0 - entrada + 1;
Scene3:
    temp = linha * col;
    if (temp == 0) {
        temp = '+';
    }outro{
        temp = '';
    }

    putchar (temp);
    Página = Página + 1;
    if (Página! = Ford) vá para Scene3;
    Ajax = 10;
    putchar (Ajax);
    Disco = Disco + 1;
    if (Puck! = Ford) vá para Scene2;
NieDzejkob
fonte
" If not,let us return to Scene III." -1; quebra a quarta parede: P
Jakob
6

Mathematica, 39 bytes

Print@@@(CrossMatrix[#-1]"+"/. 0->" ")&

CrossMatrixé um embutido que gera uma matriz da forma necessária com 1s em vez de +s e 0s em vez de espaços. Se multiplicarmos essa matriz por "+", isso substitui 1s por +s, deixando-os 0inalterados (obviamente ... 0*x = 0e 1*x = x, certo?). Em seguida, substituímos os zeros manualmente por espaços usando /. 0->" ". Finalmente, imprimimos cada linha da matriz com Print@@@(...).

Martin Ender
fonte
11
Não sabia que Printpoderia ser usado assim.
Ngenisis 12/04
6

C, 69 bytes

Não é muito interessante ... Loops sobre o quadrado, imprimindo o caractere apropriado.

r,c;f(n){for(r=-n;++r<n;puts(""))for(c=-n;++c<n;putchar(r*c?32:43));}
Quentin
fonte
6

Rubi, 41. 40 bytes

->x{puts k=[?\s*(r=x-1)+?+]*r,?+*r+=x,k}

Experimente online!

Ventero
fonte
6

GNU sed , 104 99 bytes

-5 graças a seshoumara
Inclui +1 para-r

s/1//;h;:;s/(.*)1/ \12/;t;s/( *2)2(2*)/\1\n\1\2/
t;G;s/1+/&&1/;s/(.*)(\n1*)/&\n\1/;/1/!c+
y/12/++/

Recebe entrada em unário.

Experimente online!

s/1//                    # Subtract 1 from input
h                        # Hold onto input
:                        # Start loop
s/(.*)1/ \12/            #   Remove a 1, prepend a space, and append a 2
t                        # Loop until all 1s are 2s
                         # Start Loop (uses the previous label)
s/( *2)2(2*)/\1\n\1\2/   #   Shift all but the first 2 from the last line to a new line 
                         #   E.g.  "  2"      "  2"
                         #         "  222" -> "  2"
                         #                    "  22"
t                        # Loop until all 2s are on their own line
G                        # Append a newline and input
s/1+/&&1/                # Double the number of 1s and append an extra
s/(.*)(\n1*)/&\n\1/      # Copy all of the lines with 2s to the end
/1/!c+                   # If there aren't any 1s print a '+'
y/12/++/                 # Convert all 1s and 2s to +s
Riley
fonte
+1 Você pode salvar 5 bytes usando s/( *2)2(2*)/\1\n\1\2/e s/(.*)(\n1*)/&\n\1/como mostrado aqui , para uma pontuação total de 99.
seshoumara
5

Lua 113 , 90 bytes

r,w,p=string.rep,io.read(),io.write;s=r(' ',w-1)p(r(s..'+'..'\n',w-1))p(r('+',w*2-1)..'\n')p(r(s..'+'..'\n',w-1))

r,w=string.rep,io.read()d=w*2-1;for a=1,d do print(a~=w and r(' ',w-1)..'+'or r('+',d))end
Blab
fonte
5

Python 2 , 52 bytes

n=input()-1
p=(' '*n+'+\n')*n
print p+'++'*n+'+\n'+p

Experimente online!

Uma alternativa de 53 bytes ( TIO ):

n=input()-1
for c in' '*n+'+'+' '*n:print c*n+'+'+c*n
xnor
fonte
5

R, 54 bytes

Raspando 7 bytes graças a @Jarko Dubbeldam:

function(n){a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="x";a}

resposta anterior:

f=function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}
contagem
fonte
11
Você não precisa nomear funções, então function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}seriam 59 bytes!
JD #
11
Além disso, você pode salvar um byte usando:matrix("",y<-n*2-1,y)
JAD
11
a[n,]=a[,n]="x"também funciona, economizando mais alguns bytes.
JAD
Você pode economizar mais 4 bytes usando scan()e torná-lo um programa em vez de uma função:n=scan();a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="+";a
rturnbull
4

PowerShell , 48 bytes

param($n)($x=,(" "*--$n+"+")*$n);'+'*(1+2*$n);$x

Experimente online!

Recebe entrada $n. Começa construindo uma sequência de --$nespaços concatenados com +. Isso é convertido em uma matriz usando o operador de vírgula ( $nvezes decrescido) . Essa matriz é armazenada $xe encapsulada em parênteses para colocar uma cópia no pipeline.

Em seguida, fazemos a seção do meio, que é uma +sequência multiplicada pelo número apropriado de vezes. Isso fica na calha. Finalmente, colocamos $xo pipeline novamente.

Todos são deixados no pipeline na conclusão do programa e o implícito Write-Outputinsere uma nova linha entre os elementos.

AdmBorkBork
fonte
4

Perl 5 , 45 bytes

44 bytes de código + -psinalizador.

$_=join"+
",@%=($"x--$_)x$_,"+"x($_*2),@%,""

Experimente online!


Algumas abordagens semelhantes (mas ainda diferentes):

48 bytes (47+ -p):

$_=join"+"x($_*2-1).$/,(~~($"x--$_."+\n")x$_)x2

50 bytes (49+ -n):

$,="+"x($_*2-1).$/;print+(~~($"x--$_."+\n")x$_)x2
dada
fonte
4

Python 2 , 60, 56 bytes

n=input()-1
z=(' '*n+'+\n')*n
print z+'+'*(2*n+1)+'\n'+z

Experimente online!

  • -4 bytes - graças ao viciado em matemática!
Keerthana Prabhakaran
fonte
11
Salve 4 bytes como este: TIO
math junkie
3

CJam , 23 bytes

ri_(S*'++a\2*(*_z..e>N*

Experimente online!

Explicação

Isso parece um pouco abaixo do ideal, mas a idéia é sobrepor as duas grades a seguir:

  +
  +
  +
  +
  +



+++++

O que dá o resultado desejado.

ri    e# Read input and convert to integer N.
_(    e# Duplicate and decrement.
S*    e# Get a string of N-1 spaces (indentation of the vertical bar).
'++   e# Append a + (the vertical bar).
a     e# Wrap the line in an array.
\2*(  e# Swap with the other copy of N and compute 2N-1.
*     e# Repeat the line that many times.
_z    e# Duplicate the grid and transpose it.
..e>  e# Pairwise maximum between the two grids. This superimposes them.
N*    e# Join with linefeeds.
Martin Ender
fonte
3

CJam, 17

ri(S*_]'+*_ffe>N*

Experimente online

Explicação:

ri(      read n, convert to int and decrement
S*       make a string of n-1 spaces
_]       duplicate it and put the 2 strings in an array
'+*_     join the strings with a '+' and duplicate the result
ffe>     for each pair of characters from the 2 (identical) strings,
          get the larger character (results in a matrix)
N*       join the rows with newlines
aditsu
fonte
3

Oitava, 36 31 bytes

Inspirado na resposta MATL de @LuisMendo.

@(n)' +'(((a=1:n*2-1==n)|a')+1)

Experimente online!

Resposta anterior:

@(n)' +'(1+((a=padarray(1,n-1))|a'))

Experimente online!

rahnema1
fonte
3

05AB1E , 15 14 12 bytes

F'+}¹·<×)û.c

Experimente online!

-2 graças a Emigna.

Urna de polvo mágico
fonte
11
Você poderia fazer F'+}¹·<×)û.cpara 12.
Emigna
O link do try it online está ruim - ele não está vinculado à revisão atual da postagem, portanto mostra "saída ruim" que não corresponde aos casos de teste acima.
Thomas Ward
@ThomasWard: Boa captura! Corrigi o link.
Emigna
2

Python 2, 65 bytes

lambda n:('g+\n'*~-n+'+'*~-(2*n)+'\ng+'*~-n).replace('g',' '*~-n)

Experimente Online!

viciado em matemática
fonte
2

JS (ES6), 88 74 73 bytes

x=>(x--,y=y=>(" ".repeat(x)+`+
`).repeat(x),y``+"+".repeat(x+x+1)+"\n"+y``)

Provavelmente pode ser jogado mais.

Snippetify(x=>(x--,y=y=>(" ".repeat(x)+`+
`).repeat(x),y``+"+".repeat(x+x+1)+"\n"+y``))
<script src="https://programmer5000.com/snippetify.min.js"></script>
<input type = "number">
<pre data-output></pre>

programmer5000
fonte
11
Eu não estou totalmente certo, mas acho que você pode substituir o "\n"com dois acentos graves e uma nova linha literal entre eles
Kritixi Lithos
Só de ver essa solução agora, você me venceu por alguns minutos. Qual é a etiqueta por aqui em soluções semelhantes no mesmo idioma que são publicadas em uma pequena janela de tempo?
Shaggy
2

JavaScript (ES6), 60 bytes

f=
n=>(r=([s,t])=>(s=s.repeat(n-1))+t+s+`
`)([r(` +`),r(`++`)])
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

Gera duas novas linhas finais. Formulação alternativa, também 60 bytes:

n=>(r=a=>(s=a[0].repeat(n-1))+a[1]+s+`
`)([r(` +`),r(`++`)])
Neil
fonte
2

PowerShell, 48

Parece não ficar mais curto que isso (e praticamente a mesma abordagem que a outra solução):

($a=,(' '*($n="$args"-1)+'+')*$n)
'+'+'++'*$n
$a

ou

($a=(' '*($n="$args"-1)+'+
')*$n)+'++'*$n+"+
$a"
Joey
fonte
2

REXX, 81 bytes

arg a
b=a*2-1
do i=1 to b
  if i=a then say copies('+',b)
  else say right('+',a)
  end
idrougge
fonte
2

PHP, 68 bytes

for(;$i<$c=-1+2*$m=$argn;)echo"\n".str_pad("+",$c," +"[$m==++$i],2);

83 bytes

for(;$i<($c=($n=$argn)*2-1)**2;)echo$i%$c?"":"\n".!++$k," +"[$k==$n|$i++%$c==$n-1];
Jörg Hülsermann
fonte
11
Você pode salvar alguns bytes usando $m=$argne pré-incrementando em $ivez de incrementá-lo. você também pode salvar um byte movendo a $matribuição no final e soltando os colchetes.
precisa saber é o seguinte
@ user59178 eu não conseguia entender o que exatamente média
Jörg Hülsermann
11
for(;$i<$c=-1+2*$m=$argn;)echo"\n".str_pad("+",$c," +"[$m==++$i],2);
user59178
while(++$y<2*$n=$argn)echo"\n",str_pad("+",$n*2-1," +"[$y==$n],2);66 bytes (e excepto um mais com uma quebra de linha física)
Titus
2

MUMPS, 48 50 53 bytes

F i=1-n:1:n-1 W ! F j=1-n:1:n-1 W $C(i&j*-11+43)
caxumba
fonte
Bem-vindo ao PPCG!
Martin Ender
2

Brain-Flak , 216 + 1 = 217 bytes

+1 bytes da -Abandeira

([{}]())(()()){<>(((((()()()()()){})){}()){}())<>(({}[()])<({}<(({})){({}()<(({}<<>(({}<(({})<>)>)<>)<>>)<{({}()<(((((()()){}){}){}){})>)}{}>)>)}{}>){(<{}(({}<<>({}<({}<>)>)>)<(({}){}){({}()<(({}))>)}{}>)>)}{}>)}{}{}

Experimente online!

Explicação por vir

0 '
fonte