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.


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!


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

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


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»


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.


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.


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.




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

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!


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!


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
+++  
  +  
 +++ 
+++++
+++++
 +++ 
  +  



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 .


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.


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!


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


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

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)))

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!


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


@ 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

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

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

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>

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
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.