Criador de diamantes +

27

Desafio:

Dado um número inteiro ncomo entrada. Crie um diamante com o dobro do número especificado n.

Entrada :

A entrada é inteira ne 2 <n ≤ 3000.

Saída:

A saída será uma sequência e será em forma de diamante, consistindo de +uma linha de adição no início, mostrando o nuso+

Exemplos :

D (3):

+++
  +
 +++
+++++
+++++
 +++
  +

D (5):

+++++
    +
   +++
  +++++
 +++++++
+++++++++
+++++++++
 +++++++
  +++++
   +++
    +

D (6): 

++++++
     +
    +++
   +++++
  +++++++
 +++++++++
+++++++++++
+++++++++++
 +++++++++
  +++++++
   +++++
    +++
     +

Critérios de vencimento:

Este é o pelo que o código mais curto em bytes para cada linguagem de programação vence.

Muhammad Salman
fonte
1
Podemos tomar nunário?
Adám 19/04/19
3
... usando +como marca registrada ?
Adám 19/04/19
1
Você pode adicionar um caso de teste onde né par?
Salsicha
2
@ Shagy: claro, por que não. Vou acrescentar isso imediatamente. Obrigado
Muhammad Salman

Respostas:

33

brainfuck , 151 139 bytes

,[.[<]<+[>>]++++[-<++++++++>],]<[<]<<<++++++++++.>>[[>]>[-<+>]>[-<+>]>>[.>>]<<[<]<<.<<[..<<]<.>>-]>[[>]>[.>>]<<[<<]>.>>[..>>]<<,<[<]<<.>>>]

Experimente online!

Recebe entrada via unário, com +s como marcas registradas ( permitido pelo pôster ). Decidi refazer isso, pois pensei que o antigo era um pouco mais longo do que poderia ser (embora este também seja!).

Versão antiga (151 bytes):

>--[>+<++++++]<[->+>.<<]++++++++[-<+<++++>>]<++>>[<<.>>-[-<+<<.>>>]<[->+<]>>>+[-<.>>+<]>+[-<+>]<<<]>>[<<<<.>>[-<+<<.>>>]<[->+<]>+>>-[-<.>>+<]>-[-<+>]<]

Experimente online!

Recebe a entrada como célula inicial. Eu não conseguia pensar em uma maneira de aproveitar o primeiro tempo para ajudar no segundo, então há um loop para cada um deles.

Como funciona:

 >--[>+<++++++]  Create 43 ('+') two space to the left of n
 <[->+>.<<]      Print n '+'s while preserving n
 ++++++++[-<+<++++>>]<++  Create 32 (' ') and 10 ('\n')
                         Tape: 32 10 0 n 43 t
 >>
 [ Loop over the first half of the diamond
   <<.>>         Print a newline
   -[-<+<<.>>>]  Decrement n and print n spaces
   <[->+<]       Restore n
   >>>+[-<.>>+<] Increment t and print t '+'s
   >+[-<+>]<<<   Increment t again and restore it
]>>
[ Loop over the second half
  <<<<.>>        Print a newline
  [-<+<<.>>>]<   Print n spaces
  [->+<]>+       Restore and increment n
  >>-[-<.>>+<]   Decrement t and print t '+'s
  >-[-<+>]<      Decrement t again and restore it
]

E apenas por diversão:

+++++++++
        >
       --[
      >+<++
     ++++]<[
    ->+>.<<]+
   +++++++[-<+
  <++++>>]<++>>
 [<<.>>-[-<+<<.>
>>]<[->+<]>>>+[-<
.>>+<]>+[-<+>]<<<
 ]>>[<<<<.>>[-<+
  <<.>>>]<[->+<
   ]>+>>-[-<.>
    >+<]>-[-<
     +>]<]++
      +++++
       +++
        +

Experimente online!

Brincadeira
fonte
2
Você conseguiu meu voto pela coisa divertida. Resposta legal
Muhammad Salman
15

Tela , 9 bytes

+×O{+×]±╪

Experimente aqui!

Explicação (alguns caracteres foram substituídos para parecerem monoespaços):

+×O{+×]±╪
+×         repeat "+" input times
  O        output that
   {  ]    map over 1..input
    +×       repeat "+" that many times
       ±   interpret the array as a 2D string, and reverse it
        ╪  quad-palindromize with 1 horizontal overlap and 0 vertical overlap
dzaima
fonte
12

Python 3 , 95 94 75 bytes

def f(n):a=[' '*(n+~i)+'+'*(i-~i)for i in range(n)];return['+'*n]+a+a[::-1]

Experimente online!


Minha primeira tentativa de jogar golfe, qualquer sugestão de melhoria é bem-vinda.

EDIT: economizou 1 byte graças a Kevin Cruijssen

EDIT: removido mal-entendido sobre a contagem de bytes

EDIT: salvou muito mais bytes graças a Jo King e user202729

maxb
fonte
5
Bem-vindo ao PPCG! :)
Salsicha
1
Além disso, se você alterar para Python 2, print'\n'.join(['+'*n]+a+a[::-1])poderá ser usado sem parênteses para salvar mais 2 bytes. +1 de mim. Ótima primeira resposta. :)
Kevin Cruijssen 19/04/19
1
Os envios podem ser um programa completo (nada no cabeçalho / rodapé) ou uma função (que deve definir uma função (ou referência, no caso de uma função anônima como lambda)).
usar o seguinte comando
2
E 2*i+1 == i+i+1 == i-(-i-1) == i-~i,.
usar o seguinte comando
2
Ótima primeira resposta. bem feito.
ElPedro 19/04
8

05AB1E , 14 bytes

'+×sL·<'+×∊.c»

Experimente online!

Explicação

'+×              # push "+" repeated <input> times
   sL            # push range [1 ... input]
     ·<          # multiply each element by 2 and decrement (x*2-1)
       '+×       # replace each number with the corresponding number of "+"'s
          ∊      # mirror vertically
           .c    # center
             »   # join with the "+"-row created at the start

Também 14 bytes: L‚˜'+×ćs.∞∊.c»

Emigna
fonte
1
'+×s·ÅÉ'+×∊.C»usando ÅÉé outra
Magia Octopus Urna
@MagicOctopusUrn: Meu pensamento inicial estava usando, ÅÉmas eu o descartei porque não pensei em usá ·-lo para fazê-lo funcionar.
Emigna
5

Python 3 , 79 78 bytes

def f(n):x=[('++'*i+'+').center(n*2)for i in range(n)];return[n*'+']+x+x[::-1]

Experimente online!

Graças a estas dicas para jogar golfe, o Python responde por me informar sobre a .centerfunção. Retorna uma lista de strings.

Brincadeira
fonte
O rodapé não está incluído na contagem de bytes? Nesse caso, minha solução é 58 bytes
maxb 19/04/19
@maxb Se você estiver usando uma função, é geralmente bom para retornar saída como uma lista de linhas
Jo rei
@JoKing: Hum pode querer checar novamente lil? TRY
Muhammad Salman
@ JoKing: falha.
Muhammad Salman
1
@MuhammadSalman 1. Você está testando minha função para n = 3 contra o retorno para n = 5, 2. Você tem uma nova linha à direita no teste e 3. Meu código possui espaços à direita em cada linha. Talvez você deve apenas olhar na saída próxima vez
Jo rei
4

R , 135 110 96 bytes

function(n){cat("+"<n,"
",sep="")
for(i in c(1:n,n:1))cat(" "<n-i,"+"<2*i-1,"
",sep="")}
"<"=rep

Experimente online!

@ JayCe com o corte final.

A repfunção é atribuída a um operador infixa existente, tal como <ou ^de modo que rep("+", n)é equivalente ao "<"("+", n)que pode ser escrito utilizando <, como um operador infixa como em "+" < ne encurtado para "+"<n.

ngm
fonte
1
Salve 25 bytes e torne-o uma função.
JayCe
Totalmente sua resposta :) Ótimo código original!
JayCe
Há algum espaço em branco aqui que pode ser removido e usado "+"diretamente em vez de salvá-lo comoz economiza alguns bytes! Tente aqui
Giuseppe
1
@ngm @Giuseppe Além da melhoria de Giuseppe, substitua <por repmenos de 100 caracteres! Aqui
JayCe 16/05
3

Carvão , 15 bytes

G→→↙N+↓‖M↑×⊕ⅈ+‖

Experimente online! Link é a versão detalhada do código. Explicação:

G→→↙N+

Imprima um triângulo invertido de +s a altura da entrada e quase o dobro da largura.

Mova o cursor para baixo para que ele caia na linha adicional após a reflexão.

‖M↑

Faça uma imagem espelhada do triângulo.

×⊕ⅈ+

Desenhe a linha adicional usando a coluna atual para evitar ter que ler a entrada novamente.

Reflita a saída para que a linha adicional aponte para a esquerda.

Neil
fonte
3

QB64, 82 79 bytes

INPUT n
?STRING$(n,43):FOR a=1TO 2*n:d=a-(a>n)*2*(n-a):?SPC(n-d);STRING$(2*d-1,43):NEXT
Corwin Fjeldstrom
fonte
3
Bem-vindo ao PPCG! Este é um ótimo primeiro envio e o adicionei à lista de soluções postadas enquanto QBasic é o idioma do mês . Se desejar, você pode melhorar esta resposta adicionando uma breve explicação. Aproveite o seu tempo aqui!
DLosc
2

JavaScript (Node.js) , 106 105 bytes

  • graças a @Kevin Cruijssen por reduzir em 1 byte
n=>[...Array(n*2+1)].map((_,i)=>" ".repeat(i?i>n?i+~n:n-i:0)+"+".repeat(i?i>n?4*n-2*i+1:i*2-1:n)).join`
`

Experimente online!

________________________________________________

Segunda abordagem

JavaScript (Node.js) , 105 100 99 98 bytes

  • graças a @Kevin Cruijssen por reduzir em 1 byte
  • graças a @ovs por reduzir em 1 byte
n=>[X="+"[r="repeat"](n),...x=[...X].map((_,i)=>" "[r](n+~i)+"+"[r](i-~i)),...x.reverse()].join`
`

Experimente online!

DanielIndie
fonte
2
Por uma questão de convenção, você deve ter o menor envio no topo de sua postagem, se tiver várias abordagens. Isso permite que outras pessoas tentem o desafio com facilidade, pesquisem o idioma delas e vejam como elas se comparam à sua melhor resposta (e é necessário que os placares funcionem corretamente nos desafios que possuem placares)
Taylor Scott
2

PowerShell , 55 bytes

param($l)'+'*$l;1..$l+$l..1|%{" "*($l-$_)+'+'*($_*2-1)}

Experimente online!

Tor
fonte
1
Ótima resposta, mas o personagem deve estar em +vez de x. Além disso, você pode tornar sua resposta um pouco mais favorável à comunidade usando o Experimente online! e acrescentando um link para a sua resposta
Taylor Scott
1
Derp - não acredito que não vi isso. Obrigado!
Tor
2

J , 29 bytes

'+'(,]\(}:@|."1,.])@,]\.)@$~]

Experimente online!

Explicação:

'+'$~] - generates the line at the start, which is a seed for the diamond:

   '+'$~]  3
+++

]\,]\. - finds the prefixes (]\) and suffixes (]\.) of the line, making "half" the diamond 

   '+'(]\,]\.)@$~] 3
+  
++ 
+++
+++
++ 
+  

}:@|."1,.] - makes the other "half" of the diamond by reversing each line (|."1)
and dropping its last '+' (}:) and stitches the first half to it (,.])

 '+'(]\(}:@|."1,.])@,]\.)@$~] 3
  +  
 +++ 
+++++
+++++
 +++ 
  +  

, - prepends the initial line to the diamond

'+'(,]\(}:@|."1,.])@,]\.)@$~] 3
+++  
  +  
 +++ 
+++++
+++++
 +++ 
  +  
Galen Ivanov
fonte
1

Ruby , 71 61 bytes

->n{[?+*n]+(a=(1..n).map{|x|?\s*(n-x)+?+*(x+x-1)})+a.reverse}

Experimente online!


fonte
1

PHP, 103 bytes

for(;$i++<$argn;$s.="
".str_pad(str_pad("",$i*2-1,"+",2),$argn*2-1," ",2))echo"+";echo"$s
",strrev($s);

Corra como pipe com `-nR 'ou experimente online .

Titus
fonte
1

PowerShell , 58 bytes

param($n)'+'*$n;1..$n+$n..1|%{" "*($n-$_)+"+"*$_+"+"*--$_}

Experimente online!

Simplesmente um loop up e down, cada iteração produzindo o número apropriado de espaços e, em seguida, o número apropriado de sinais de adição. Ho-hum.

AdmBorkBork
fonte
1

F # (Mono) , 123 bytes

let d n=
 let t n=String('+',n)
 let s n=t(n*2-1)
 [1..n]@[n.. -1..1]|>Seq.fold(fun a x->a+sprintf"\n%*s"(n+x-1)(s x))(t n)

Experimente online!

Henrik Hansen
fonte
4
Bem-vindo ao PPCG.
Muhammad Salman
Isso não parece funcionar. Além disso, a entrada deve ser obtida de STDIN, um arquivo ou um argumento de função. Não permitimos variáveis ​​pré-atribuídas como entrada.
precisa
@ mbomb007 Você pode aprová-lo agora?
Henrik Hansen
@HenrikHansen: Por que isso está dando um erro? /home/runner/code.fs(2,10): error FS0039: The value or constructor 'String' is not defined. Cannot open assembly 'code.exe': No such file or directory.
Muhammad Salman
1
@HenrikHansen: sugeri uma edição. Dê uma olhada
Muhammad Salman
1

PHP 102 bytes

for($r=str_pad;$i++<$a;$s.="\n".$r($r("",$i*2-1,"+",2),$a*2-1," ",2))echo"+";echo"$s\n",strrev($s);

Ik sei que pode ser muito menor do que isso;) Greetz mangas

mangas
fonte
Bem-vindo ao PPCG!
Muhammad Salman
Seu código parece produzir um erro quando tento executá-lo?
Muhammad Salman
Por que você sugeriu isso como uma edição separada? Isso não faz sentido.
Nissa19
@StephenLeppik: Opa, provavelmente um erro da minha parte. Soory
Muhammad Salman
1

sed 4.2.2 , 69

A pontuação inclui +1 para a -ropção sed.

h
y/1/+/
p
x
s/1\B/ /g
y/1/+/
p
:
s/ \+/+++/p
t
p
:a
s/\+\+/ /p
ta
d

Experimente online!

Trauma Digital
fonte
1

Ruby , 59 bytes

->i{[?+*i,b=(1..i).map{|c|' '*(i-c)+?+*(2*c-1)},b.reverse]}

Experimente online!

lfvt
fonte
1

Python 3 , 98 bytes

def d(s):print("+"*s);t=[("+"*i).center(2*s-1)for i in range(1,2*s,2)];print("\n".join(t+t[::-1]))

Experimente online!

Versão legível:

def diamond(size):
    print(size * "+")
    top = [("+" * i).center(2*size - 1) for i in range(1, 2*size, 2)]
    print("\n".join(top))
    print("\n".join(reversed(top)))
SlayerGames44
fonte
Muito melhor :) Formatei sua entrada para que ela se pareça com outras respostas. Você deseja visitar tio.run, ele formata sua resposta e facilita a reprodução de seu código por outras pessoas.
21418 JayCe
1

Yabasic , 102 bytes

Uma função anônima que recebe entrada como um número unário com +marcas de contagem e saídas para o console.

Input""s$
n=Len(s$)
?s$
For i=-n To n
j=Abs(i)
If i For k=2To j?" ";Next:?Mid$(s$+s$,1,2*(n-j)+1)
Next

Experimente online!

Versão alternativa, 117 bytes

Uma resposta de função anônima que recebe entrada como um número decimal e sai para o console.

Input""n
For i=1To n s$=s$+"+"Next
?s$
For i=-n To n
j=Abs(i)
If i For k=2To j?" ";Next:?Mid$(s$+s$,1,2*(n-j)+1)
Next

Experimente online!

Taylor Scott
fonte
Funções anônimas? Eles se parecem com programas integrais para mim ...
Ørjan Johansen
@ ØrjanJohansen este termo, para o Yabasic, significa apenas que eles não são agrupados como uma subrotina definida pelo usuário , não fazem parte de nenhuma biblioteca e, portanto, não podem ser chamados discretamente como as funções internas (por exemplo Abs(x)). Você pode ler um pouco mais sobre isso aqui, se quiser.
Taylor Scott
1

JavaScript (Node.js) , 183 bytes

a=x=>{g='\n';r=(m,n)=>String.prototype.repeat.call(m,n);k='+';l=r(k,x)+g;c=d='';for(i=0;i++<x;c+=r(' ',x-i)+r(k,i)+r(k,i-1)+g,d+=r(' ',i-1)+r(k,x+1-i)+r(k,x-i)+g);console.log(l+c+d);}

Experimente online!

Atualizei minha resposta graças a @JoKing

NTCG
fonte
@ JoKing desculpe, meu erro, eu acabei de atualizar minha resposta, obrigado meu amigo.
NTCG 15/0518
@JoKing, obrigado pelo seu tempo
NTCG
1

APL (Dyalog Unicode) , SBCS de 25 bytes

⍪∘⊖⍨c,⍨⌽1↓[2]c←↑,\⎕←⎕/'+'

Experimente online!

Explicação:

⍪∘⊖⍨c,⍨⌽1↓[2]c←↑,\⎕←⎕/'+'   Full program
                       ⎕/'+'   Get input from user as N, replicate '+' N times
                    ⎕←         Print above string
                  ,\            Find all prefixes of above string, e.g. '+','++','+++' etc.
                               Mix the above into a matrix - right-pads with spaces as needed
               c               Assign above matrix to 'c' for 'corner'
          1↓[2]                 Drop the first column
                              Reverse the resulting matrix
     c,⍨                       Append 'c' to above - this gives us the top half
⍪∘⊖⍨                          Take the above, flip it about the horizontal axis,
                               and append it to itself
voidhawk
fonte
1↓[2]-> 0 1↓ou até melhor: c,⍨⌽1↓[2]c←->⍉(⊖⍪1↓⊢)⍉
ngn 11/03
0

Java 8, 159 bytes

n->{String r="",N="\n",t=r;for(int i=n,j,k;i-->0;t+="+",r+=i>0?N:"")for(j=-n;++j<n;r+=k<n?"+":" ")k=i+(j<0?-j:j);return t+N+r+N+new StringBuffer(r).reverse();}

Definitivamente pode ser jogado um pouco mais, mas é um começo.

Explicação:

Experimente online.

n->{                    // Method with integer parameter and String return-type
  String r="",          //  Result-String, starting empty
         N="\n",        //  Temp-String for new-line to save bytes
         t=r;           //  First-line String, starting empty
  for(int i=n,j,k;i-->0 //  Loop `i` in the range (n,0]
      ;                 //    After every iteration:
       t+="+",          //     Append a "+" to the first-line String
       r+=i>0?N:"")     //     Add a new-line if this isn't the last iteration of `i` yet
    for(j=-n;++j<n;     //   Inner loop `j` in the range (-n,n]
        r+=             //     After every iteration, append the result with:
           k<n?         //      If `k` is smaller than the input `n`:
            "+"         //       Append a "+"
           :            //      Else:
            " ")        //       Append a space instead
      k=i+(j<0?-j:j);   //    Set `k` to `i` plus the absolute value of `j`
  return t+N            //  Return the first-line String plus new-line,
         +r+N           //   plus the result-String plus new-line,
         +new StringBuffer(r).reverse();}
                        //   plus the result-String again reversed
Kevin Cruijssen
fonte
0

Japonês -R , 18 16 bytes

õ_ç+ êÃê1 û i+pU

Tente


Explicação

                     :Implicit input of integer U
õ                    :Range [1,U]
 _    Ã              :Pass each Z through a function
  ç+                 :  Repeat "+" Z times
     ê               :  Palindromise
       ê1            :Mirror
          û          :Centre pad each element to the length of the longest element
            i        :Prepend
             +pU     :  "+" repeated U times
                     :Implicitly join with newlines and output
Shaggy
fonte
0

Anexo , 62 bytes

{"+"*_+lf+UnGrid!Bounce=>"+ "[Table[`>,1:_]|>~`'#Reverse|>@N]}

Experimente online!

Um lambda que aceita o número inteiro como argumento.

Exemplo

A> n := 3
3
A> Table[`>,1:n]
 false false false
  true false false
  true  true false
A> Table[`>,1:n]|>~`'#Reverse
  true  true false
  true false false
 false false false
 false false false
  true false false
  true  true false
A> Table[`>,1:n]|>~`'#Reverse|>@N
 1 1 0
 1 0 0
 0 0 0
 0 0 0
 1 0 0
 1 1 0
A> "+ "[Table[`>,1:n]|>~`'#Reverse|>@N]
 " " " " "+"
 " " "+" "+"
 "+" "+" "+"
 "+" "+" "+"
 " " "+" "+"
 " " " " "+"
A> Bounce=>"+ "[Table[`>,1:n]|>~`'#Reverse|>@N]
 " " " " "+" " " " "
 " " "+" "+" "+" " "
 "+" "+" "+" "+" "+"
 "+" "+" "+" "+" "+"
 " " "+" "+" "+" " "
 " " " " "+" " " " "
A> UnGrid!Bounce=>"+ "[Table[`>,1:n]|>~`'#Reverse|>@N]
"  +  \n +++ \n+++++\n+++++\n +++ \n  +  "
A> lf+UnGrid!Bounce=>"+ "[Table[`>,1:n]|>~`'#Reverse|>@N]
"\n  +  \n +++ \n+++++\n+++++\n +++ \n  +  "
A> "+"*n+lf+UnGrid!Bounce=>"+ "[Table[`>,1:n]|>~`'#Reverse|>@N]
"+++\n  +  \n +++ \n+++++\n+++++\n +++ \n  +  "
A> Print[_]
+++
  +
 +++
+++++
+++++
 +++
  +
["+++\n  +  \n +++ \n+++++\n+++++\n +++ \n  +  "]
A>
Conor O'Brien
fonte
0

T-SQL, 152 bytes

De acordo com nossas regras de E / S , a entrada é obtida por meio da tabela preexistente t com um campo inteiro n .

DECLARE @n INT,@ INT=1,@k INT=1SELECT @n=n FROM t
PRINT REPLICATE('+',@n)a:PRINT SPACE(@n-@)+REPLICATE('+',2*@-1)IF @=@n SET @k-=1SET @+=@k IF @>0GOTO a

Loop de contagem manual, não muito "semelhante ao SQL". Formatado:

DECLARE @n INT,@ INT=1,@k INT=1
SELECT @n=n FROM t
PRINT REPLICATE('+',@n)
a:
    PRINT SPACE(@n-@)+REPLICATE('+',2*@-1)
    IF @=@n SET @k-=1
    SET @+=@k
IF @>0 GOTO a
BradC
fonte