Diamantschöpfer +

27

Herausforderung :

nAls Eingabe wird eine Ganzzahl angegeben . Erstellen Sie einen Diamanten, der 2x der angegebenen Zahl entspricht n.

Eingabe:

Die Eingabe ist eine Ganzzahl nund 2 <n ≤ 3000.

Ausgabe :

Die Ausgabe erfolgt als Zeichenfolge und in Form eines Diamanten, der +zu Beginn aus einer Additionslinie besteht, die nusing anzeigt+

Beispiele:

D (3):

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

D (5):

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

D (6): 

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

Gewinnkriterien:

Dies ist so dass der kürzeste Code in Bytes für jede Programmiersprache gewinnt.

Muhammad Salman
quelle
1
Dürfen wir nunary aufnehmen?
Adám
3
+Als Strichmarke verwenden ?
Adám
1
Können Sie einen Testfall hinzufügen, in dem gerade nist?
Shaggy
2
@ Shaggy: klar warum nicht. Ich werde das gleich hinzufügen. Vielen Dank
Muhammad Salman
1
@ Adám hier ist der Meta-Post zu Unary I / O
Digital Trauma

Antworten:

33

Brainfuck , 151 139 Bytes

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

Probieren Sie es online!

Nimmt Eingaben über Unär, mit +s als Zählmarken ( vom Poster erlaubt ). Beschlossen, dies zu überarbeiten, da ich dachte, der alte war etwas länger als es sein könnte (obwohl dies auch ist!).

Alte Version (151 Bytes):

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

Probieren Sie es online!

Übernimmt die Eingabe als Startzelle. Ich konnte mir keine Möglichkeit vorstellen, die erste Hälfte für die zweite zu nutzen, daher gibt es für jede eine Schleife.

Wie es funktioniert:

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

Und nur zum Spaß:

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

Probieren Sie es online!

Scherzen
quelle
2
Du hast meine Stimme für das nur für die lustige Sache. Coole Antwort
Muhammad Salman
15

Canvas , 9 Bytes

+×O{+×]±╪

Probieren Sie es hier aus!

Erklärung (einige Zeichen wurden ersetzt, um monospace auszusehen):

+×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
quelle
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]

Probieren Sie es online!


Mein erster Golfversuch, Verbesserungsvorschläge sind willkommen.

BEARBEITEN: 1 Byte dank Kevin Cruijssen gespeichert

BEARBEITEN: Missverständnisse über die Anzahl der Bytes beseitigt

BEARBEITEN: Dank Jo King und user202729 viel mehr Bytes gespart

maxb
quelle
5
Willkommen bei PPCG! :)
Shaggy
1
Wenn Sie zu Python 2 wechseln, print'\n'.join(['+'*n]+a+a[::-1])können Sie auch ohne Klammern 2 weitere Bytes sparen. +1 von mir allerdings. Schöne erste Antwort. :)
Kevin Cruijssen
1
Einreichungen können entweder ein vollständiges Programm sein (nichts in Kopf- / Fußzeile) oder eine Funktion (die eine Funktion definieren muss (oder eine Referenz im Fall einer anonymen Funktion wie lambda)).
User202729
2
Und 2*i+1 == i+i+1 == i-(-i-1) == i-~i.
user202729
2
Tolle erste Antwort. gut gemacht.
ElPedro
8

05AB1E , 14 Bytes

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

Probieren Sie es online!

Erläuterung

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

Auch 14 Bytes: L‚˜'+×ćs.∞∊.c»

Emigna
quelle
1
'+×s·ÅÉ'+×∊.C»Verwenden ÅÉist eine andere
Magic Octopus Urn
@MagicOctopusUrn: Mein erster Gedanke war die Verwendung, ÅÉaber ich habe sie verworfen, weil ich nicht daran gedacht habe, sie zum Laufen ·zu bringen.
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]

Probieren Sie es online!

Dank dieser Tipps zum Golfen antworte Python , um mich über die .centerFunktion zu informieren . Gibt eine Liste von Zeichenfolgen zurück.

Scherzen
quelle
Ist die Fußzeile nicht in der Byteanzahl enthalten? In diesem Fall ist meine Lösung 58 Bytes
maxb
@maxb Wenn Sie eine Funktion verwenden, ist es im Allgemeinen in Ordnung, die Ausgabe als Liste von Zeilen zurückzugeben
Jo King,
@JoKing: Hum willst du vielleicht einen kleinen Recheck machen? TRY
Muhammad Salman
@JoKing: Es schlägt fehl.
Muhammad Salman
1
@ MuhammadSalman 1. Sie testen meine Funktion für n = 3 gegen die Rückgabe für n = 5, 2. Sie haben eine abschließende neue Zeile im Test und 3. Mein Code hat abschließende Leerzeichen in jeder Zeile. Vielleicht solltest du dir das nächste Mal einfach die Ausgabe ansehen
Jo King
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

Probieren Sie es online!

@ JayCe mit dem finalen Schnitt.

Die repFunktion wird zu einem bestehenden Infixoperator zugeordnet, wie <oder ^so , dass rep("+", n)entspricht , "<"("+", n)die unter Verwendung schrieben werden kann <als Infixoperator wie in "+" < nauf und verkürzt "+"<n.

ngm
quelle
1
Sparen Sie 25 Bytes und machen Sie es zu einer Funktion.
JayCe
Also total deine Antwort :) Toller Originalcode!
JayCe
Es gibt hier einige Leerzeichen, die entfernt werden können und die "+"direkt verwendet werden können, anstatt sie zu zspeichern, um einige Bytes zu sparen! Versuchen Sie es hier
Giuseppe
1
@ngm @Giuseppe Oben Giuseppe Verbesserung, Ersatz <für repunter 100 Zeichen zu erhalten! Hier
JayCe
3

Kohle , 15 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

G→→↙N+

Drucken Sie ein umgekehrtes Dreieck mit +der Höhe der Eingabe und fast der doppelten Breite.

Bewegen Sie den Cursor nach unten, damit er nach der Reflektion auf der zusätzlichen Zeile landet.

‖M↑

Machen Sie ein Spiegelbild des Dreiecks.

×⊕ⅈ+

Zeichnen Sie die zusätzliche Linie mit der aktuellen Spalte, um zu vermeiden, dass Sie die Eingabe erneut lesen müssen.

Reflektieren Sie die Ausgabe so, dass die zusätzliche Linie nach links zeigt.

Neil
quelle
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
quelle
3
Willkommen bei PPCG! Dies ist eine großartige erste Einreichung, die ich der Liste der veröffentlichten Lösungen hinzugefügt habe, während QBasic die Sprache des Monats ist . Wenn Sie möchten, können Sie diese Antwort verbessern, indem Sie eine kurze Erläuterung hinzufügen. Genieße deine Zeit hier!
DLosc
2

JavaScript (Node.js) , 106 bis 105 Byte

  • danke an @Kevin Cruijssen für die Reduzierung um 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`
`

Probieren Sie es online!

________________________________________________

Zweiter Ansatz

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

  • danke an @Kevin Cruijssen für die Reduzierung um 1 Byte
  • Dank an @ovs für die Reduzierung um 1 Byte
n=>[X="+"[r="repeat"](n),...x=[...X].map((_,i)=>" "[r](n+~i)+"+"[r](i-~i)),...x.reverse()].join`
`

Probieren Sie es online!

DanielIndie
quelle
2
Nur als Konvention sollten Sie Ihre kürzeste Einreichung oben in Ihrem Beitrag haben, wenn Sie mehrere Ansätze darin haben. Auf diese Weise können andere Personen problemlos die Herausforderung annehmen, nach ihrer Sprache suchen und sehen, wie sie mit Ihrer besten Antwort verglichen werden (und dies ist erforderlich, damit Anzeigetafeln bei Herausforderungen mit Anzeigetafeln ordnungsgemäß funktionieren)
Taylor Scott
2

PowerShell , 55 Byte

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

Probieren Sie es online!

Tor
quelle
1
Gute Antwort, aber der Charakter sollte +statt x. Sie können Ihre Antwort auch ein bisschen Community-freundlicher gestalten, indem Sie Try it online! und einen Link zu Ihrer Antwort hinzufügen
Taylor Scott
1
Derp - kann nicht glauben, dass ich das nicht gesehen habe. Vielen Dank!
Tor
2

J , 29 Bytes

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

Probieren Sie es online!

Erläuterung:

'+'$~] - 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
quelle
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);

Laufen Sie als Pipe mit -nR oder versuchen Sie es online .

Titus
quelle
1

PowerShell , 58 Byte

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

Probieren Sie es online!

Einfach eine Auf- und Ab-Schleife, wobei jede Iteration die entsprechende Anzahl von Leerzeichen und dann die entsprechende Anzahl von Pluszeichen ausgibt. Ho-hum.

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

Probieren Sie es online!

Henrik Hansen
quelle
4
Willkommen bei PPCG.
Muhammad Salman
Dies scheint nicht zu funktionieren. Die Eingabe sollte auch von STDIN, einer Datei oder einem Funktionsargument stammen. Wir erlauben keine vorab zugewiesenen Variablen als Eingabe.
mbomb007
@ mbomb007 Kannst du es jetzt genehmigen?
Henrik Hansen
@HenrikHansen: Warum gibt es einen Fehler? /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: Ich habe eine Bearbeitung vorgeschlagen. Sehen Sie sich das an
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);

Ich weiß, es kann viel kleiner sein;) Greetz Mangas

Mangas
quelle
Willkommen bei PPCG!
Muhammad Salman
Ihr Code scheint einen Fehler zu erzeugen, wenn ich versuche, ihn auszuführen?
Muhammad Salman
Warum haben Sie dies als separate Bearbeitung vorgeschlagen? Das macht keinen Sinn.
Nissa
@StephenLeppik: Ups, wahrscheinlich ein Fehler von meiner Seite. 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]))

Probieren Sie es online!

Lesbare Version:

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
quelle
Viel besser :) Ich habe Ihren Eintrag so formatiert, dass er wie andere Antworten aussieht. Sie möchten tio.run besuchen? Es formatiert Ihre Antwort für Sie und erleichtert anderen die Reproduktion Ihres Codes.
JayCe
1

Yabasic , 102 Bytes

Eine anonyme Funktion, die Eingaben als unäre Zahlen mit annimmt + Zählmarken und an die Konsole ausgibt.

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

Probieren Sie es online!

Alternative Version, 117 Byte

Eine anonyme Funktionsantwort, die Eingaben als Dezimalzahl akzeptiert und an die Konsole ausgibt.

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

Probieren Sie es online!

Taylor Scott
quelle
Anonyme Funktionen? Sie sehen für mich wie ganze Programme aus ...
Ørjan Johansen
@ ØrjanJohansen dieser Begriff bedeutet für Yabasic nur, dass sie nicht als benutzerdefinierte subRoutine verpackt sind, nicht Teil einer Bibliothek sind und daher nicht diskret wie eingebaute Funktionen aufgerufen werden können (z. B. Abs(x)). Sie können ein bisschen mehr über das lesen hier , wenn Sie mögen.
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);}

Probieren Sie es online!

Meine Antwort wurde dank @JoKing aktualisiert

NTCG
quelle
@JoKing sorry, mein Fehler, ich aktualisiere gerade meine Antwort, danke mein Freund.
NTCG
@JoKing, vielen Dank für Ihre Zeit
NTCG
1

APL (Dyalog Unicode) , 25 Byte SBCS

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

Probieren Sie es online!

Erläuterung:

⍪∘⊖⍨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
quelle
1↓[2]-> 0 1↓oder noch besser: c,⍨⌽1↓[2]c←->⍉(⊖⍪1↓⊢)⍉
ngn
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();}

Kann definitiv noch mehr golfen, aber es ist ein Anfang.

Erläuterung:

Probieren Sie es online aus.

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
quelle
0

Japt -R , 18 16 Bytes

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

Versuch es


Erläuterung

                     :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
Zottelig
quelle
0

Attache , 62 Bytes

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

Probieren Sie es online!

Ein Lambda, das die Ganzzahl als Argument verwendet.

Beispiel

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
quelle
0

T-SQL, 152 Bytes

Gemäß unseren E / A-Regeln erfolgt die Eingabe über die bereits vorhandene Tabelle t mit einem ganzzahligen Feld 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

Manuelle Zählschleife, nicht sehr "SQL-ähnlich". Formatiert:

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
quelle