Creatore di diamanti +


27

Sfida:

Dato un numero intero ncome input. Crea un diamante che è il doppio del numero indicato n.

Input:

L'input è intero ne 2 <n ≤ 3000.

Produzione :

L'output sarà una stringa e avrà la forma di un diamante costituito +da una linea di addizione all'inizio che mostra l' nutilizzo+

Esempi:

D (3):

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

D (5):

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

D (6): 

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

Criteri vincenti:

Questo è quindi vince il codice più breve in byte per ogni linguaggio di programmazione.


1
Possiamo prendere nall'unario?
Adám,

3
... usando +come segno di conteggio ?
Adám,

1
Puoi aggiungere un caso di prova dove nè pari?
Shaggy,

2
@Shaggy: sicuro perché no. Lo aggiungerò subito. Grazie
Muhammad Salman,

Risposte:


33

Brainfuck , 151 139 byte

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

Provalo online!

Riceve input tramite unario, con +s come segni di conteggio ( consentiti dal poster ). Ho deciso di rielaborare questo, poiché pensavo che quello vecchio fosse un po 'più lungo di quanto potesse essere (anche se questo è troppo!).

Vecchia versione (151 byte):

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

Provalo online!

Accetta l'input come cella iniziale. Non riuscivo a pensare a un modo per sfruttare la prima metà per aiutare con la seconda, quindi c'è un ciclo per ciascuno di essi.

Come funziona:

 >--[>+<++++++]  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 solo per divertimento:

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

Provalo online!


2
Hai ottenuto il mio voto per il solo per la cosa divertente. Bella risposta
Muhammad Salman,

15

Tela , 9 byte

+×O{+×]±╪

Provalo qui!

Spiegazione (alcuni personaggi sono stati sostituiti per sembrare monospace):

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

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

Provalo online!


Il mio primo tentativo di golf, eventuali suggerimenti per il miglioramento sono i benvenuti.

EDIT: salvato 1 byte grazie a Kevin Cruijssen

EDIT: rimosso malinteso sul conteggio dei byte

EDIT: salvato molti più byte grazie a Jo King e user202729


5
Benvenuti in PPCG! :)
Shaggy,

1
Inoltre, se si passa a Python 2, print'\n'.join(['+'*n]+a+a[::-1])può essere utilizzato senza parentesi per salvare altri 2 byte. +1 da me però. Bella prima risposta. :)
Kevin Cruijssen,

1
Gli invii possono essere un programma completo (niente nell'intestazione / piè di pagina) o una funzione (che deve definire una funzione (o riferimento, in caso di funzione anonima come lambda)).
user202729,

2
E 2*i+1 == i+i+1 == i-(-i-1) == i-~i,.
user202729,

2
Ottima prima risposta. molto bene.
ElPedro,

8

05AB1E , 14 byte

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

Provalo online!

Spiegazione

'+×              # 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

Anche 14 byte: L‚˜'+×ćs.∞∊.c»


1
'+×s·ÅÉ'+×∊.C»usare ÅÉè un altro
Magic Octopus Urn

@MagicOctopusUrn: il mio pensiero iniziale stava usando ÅÉma l'ho scartato perché non pensavo di usarlo ·per farlo funzionare.
Emigna,

5

Python 3 , 79 78 byte

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

Provalo online!

Grazie a questo Suggerimenti per giocare a golf risposta Python per informarmi sulla .centerfunzione. Restituisce un elenco di stringhe.


Il piè di pagina non è incluso nel conteggio dei byte? In tal caso, la mia soluzione è di 58 byte
massimo

@maxb Se si utilizza una funzione, in genere va bene restituire l'output come un elenco di righe
Jo King,

@JoKing: Hum potrebbe voler fare un nuovo controllo? PROVA
Muhammad Salman,

@JoKing: fallisce.
Muhammad Salman,

1
@MuhammadSalman 1. Stai testando la mia funzione per n = 3 contro il ritorno per n = 5, 2. Hai una nuova riga finale nel test e 3. Il mio codice ha spazi finali su ogni riga. Forse dovresti guardare l'output la prossima volta
Jo King,

4

R , 135 110 96 byte

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

Provalo online!

@JayCe con il taglio finale.

La repfunzione è assegnata ad un operatore infisso esistente, come <o ^in modo che rep("+", n)è equivalente a "<"("+", n)cui può essere scritto usando <come operatore infisso come in "+" < ne abbreviato "+"<n.


1
Salva 25 byte e rendilo una funzione.
JayCe,

Quindi totalmente la tua risposta :) Ottimo codice originale!
JayCe,

C'è un po 'di spazio qui che può essere rimosso e utilizzato "+" direttamente invece di salvarlo come fa zrisparmiare qualche byte! Provalo qui
Giuseppe,

1
@ngm @Giuseppe In cima a un miglioramento di Giuseppe, sostituto <per repottenere meno di 100 caratteri!Qui
JayCe,

3

Carbone , 15 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

G→→↙N+

Stampa un triangolo invertito di +s l'altezza dell'input e quasi il doppio della larghezza.

Sposta il cursore verso il basso in modo che atterri sulla riga aggiuntiva dopo il riflesso.

‖M↑

Crea un'immagine speculare del triangolo.

×⊕ⅈ+

Traccia la riga aggiuntiva utilizzando la colonna corrente per evitare di dover leggere nuovamente l'input.

Riflette l'output in modo che la riga aggiuntiva punti a sinistra.




3

QB64, 82 79 byte

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
Benvenuti in PPCG! Questo è un ottimo primo invio, e l'ho aggiunto all'elenco delle soluzioni pubblicate mentre QBasic è la lingua del mese . Se lo desideri, puoi migliorare questa risposta aggiungendo una breve spiegazione. Goditi il ​​tuo tempo qui!
DLosc,

2

JavaScript (Node.js) , 106 105 byte

  • grazie a @Kevin Cruijssen per la riduzione di 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`
`

Provalo online!

________________________________________________

Secondo approccio

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

  • grazie a @Kevin Cruijssen per la riduzione di 1 byte
  • grazie a @ovs per la riduzione di 1 byte
n=>[X="+"[r="repeat"](n),...x=[...X].map((_,i)=>" "[r](n+~i)+"+"[r](i-~i)),...x.reverse()].join`
`

Provalo online!


2
Proprio come una questione di convenzione, dovresti avere il tuo invio più breve nella parte superiore del tuo post se hai più approcci al suo interno. Ciò consente ad altre persone di tentare facilmente la sfida, cercare la loro lingua e vedere come si confrontano con la tua migliore risposta (ed è necessario affinché i tabelloni segnapunti funzionino correttamente sulle sfide che hanno tabelloni segnapunti)
Taylor Scott


2

PowerShell , 55 byte

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

Provalo online!


1
Ottima risposta ma il personaggio dovrebbe essere +invece di x. Inoltre puoi rendere la tua risposta un po 'più favorevole alla comunità usando Provalo online! e aggiungendo un link alla tua risposta
Taylor Scott,

1
Derp - non posso credere di non averlo visto. Grazie!
Tor

2

J , 29 byte

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

Provalo online!

Spiegazione:

'+'$~] - 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 byte

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

Esegui come pipe con `-nR´ o provalo online .


1

PowerShell , 58 byte

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

Provalo online!

Semplicemente un loop-up e -down, ciascuno ripetendo il numero appropriato di spazi e quindi il numero appropriato di segni più. Ho-hum.


1

F # (Mono) , 123 byte

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)

Provalo online!


4
Benvenuti in PPCG.
Muhammad Salman,

Questo non sembra funzionare. Inoltre, l'input deve essere preso da STDIN, un file o un argomento di funzione. Non consentiamo variabili pre-assegnate come input.
mbomb007,

@ mbomb007 Puoi approvarlo ora?
Henrik Hansen,

@HenrikHansen: Perché questo dà un errore? /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: ho suggerito una modifica. Guarda
Muhammad Salman,

1

PHP 102 byte

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

So che può essere molto più piccolo di questo;) Greetz mangas


Benvenuti in PPCG!
Muhammad Salman,

Il tuo codice sembra produrre un errore quando provo a eseguirlo?
Muhammad Salman,

Perché l'hai suggerito come modifica separata? Non ha senso.
Nissa,

@StephenLeppik: Oops, probabilmente un errore da parte mia. Soory
Muhammad Salman,



1

Python 3 , 98 byte

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

Provalo online!

Versione leggibile:

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

Molto meglio :) Ho formattato la tua voce in modo che appaia come altre risposte. Vuoi visitare tio.run che formatta la tua risposta per te e rende facile per gli altri riprodurre il tuo codice.
JayCe,

1

Yabasic , 102 byte

Una funzione anonima che accetta input come numero unario con +segni di conteggio e output sulla 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

Provalo online!

Versione alternativa, 117 byte

Una risposta di funzione anonima che accetta input come numero intero decimale e li invia alla 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

Provalo online!


Funzioni anonime? A me sembrano interi programmi ...
Ørjan Johansen,

@ ØrjanJohansen questo termine, per Yabasic, significa solo che non sono racchiusi come una subroutine definita dall'utente , non fanno parte di alcuna libreria e quindi non possono essere chiamati discretamente come possono essere le funzioni incorporate (ad es. Abs(x)). Puoi leggere qualcosa in più qui se vuoi.
Taylor Scott,

1

JavaScript (Node.js) , 183 byte

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

Provalo online!

Aggiornato la mia risposta grazie a @JoKing


@JoKing scusa, errore mio, ho appena aggiornato la mia risposta, grazie amico mio.
NTCG

@JoKing, grazie per il tuo tempo
NTCG

1

APL (Dyalog Unicode) , SBCS da 25 byte

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

Provalo online!

Spiegazione:

⍪∘⊖⍨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↓o meglio ancora: c,⍨⌽1↓[2]c←->⍉(⊖⍪1↓⊢)⍉
ngn l'

0

Java 8, 159 byte

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();}

Può sicuramente giocare a golf ancora un po ', ma è un inizio.

Spiegazione:

Provalo 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

Japt -R , 18 16 byte

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

Provalo


Spiegazione

                     :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

Attache , 62 byte

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

Provalo online!

Un lambda che accetta l'intero come argomento.

Esempio

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 byte

Secondo le nostre regole IO , l'input viene preso tramite la tabella t preesistente con un campo intero 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

Ciclo di conteggio manuale, non molto "simile a SQL". formattato:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.