Pencipta berlian +

27

Tantangan:

Diberikan integer nsebagai input. Buat berlian yang 2x jumlah yang diberikan n.

Memasukkan :

Input bilangan bulat ndan 2 <n ≤ 3000.

Keluaran:

Output akan berupa string dan itu akan dalam bentuk berlian yang terdiri dari +dengan garis tambahan di awal menunjukkan nmenggunakan+

Contoh:

D (3):

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

D (5):

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

D (6): 

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

Kriteria Menang:

Ini adalah sehingga kode terpendek dalam byte untuk setiap bahasa pemrograman yang menang.

Muhammad Salman
sumber
1
Bisakah kita menerima nunary?
Adám
3
... menggunakan +sebagai tanda tally ?
Adám
1
Bisakah Anda menambahkan test case di mana nbahkan?
Shaggy
2
@ Shaggy: pasti kenapa tidak. Saya akan menambahkan itu segera. Terima kasih
Muhammad Salman
1
@ Adam di sini adalah posting meta pada I / O unary
Digital Trauma

Jawaban:

33

brainfuck , 151 139 bytes

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

Cobalah online!

Mengambil input melalui unary, dengan +tanda penghitungan ( diizinkan oleh poster ). Memutuskan untuk mengerjakan ulang ini, karena saya pikir yang lama sedikit lebih lama dari yang seharusnya (meskipun yang ini juga!).

Versi Lama (151 byte):

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

Cobalah online!

Mengambil input sebagai sel awal. Saya tidak bisa memikirkan cara untuk memanfaatkan babak pertama untuk membantu yang kedua, jadi ada satu putaran untuk masing-masing.

Bagaimana itu bekerja:

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

Dan hanya untuk bersenang-senang:

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

Cobalah online!

Jo King
sumber
2
Anda mendapat suara saya untuk hal yang menyenangkan saja. Jawaban keren
Muhammad Salman
15

Kanvas , 9 byte

+×O{+×]±╪

Coba di sini!

Penjelasan (beberapa karakter telah diganti agar terlihat 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
dzaima
sumber
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]

Cobalah online!


Upaya pertama saya bermain golf, saran untuk perbaikan dipersilahkan.

EDIT: disimpan 1 byte berkat Kevin Cruijssen

EDIT: menghapus kesalahpahaman tentang jumlah byte

EDIT: Disimpan lebih banyak byte berkat Jo King dan user202729

maks
sumber
5
Selamat datang di PPCG! :)
Shaggy
1
Juga, jika Anda mengubah ke Python 2, print'\n'.join(['+'*n]+a+a[::-1])dapat digunakan tanpa tanda kurung untuk menghemat 2 byte lebih. +1 dari saya. Jawaban pertama yang bagus. :)
Kevin Cruijssen
1
Kiriman dapat berupa program lengkap (tidak ada dalam header / footer) atau fungsi (yang harus mendefinisikan fungsi (atau referensi, dalam kasus fungsi anonim seperti lambda)).
user202729
2
Dan, 2*i+1 == i+i+1 == i-(-i-1) == i-~i.
user202729
2
Jawaban pertama yang bagus. sudah selesai dilakukan dengan baik.
ElPedro
8

05AB1E , 14 byte

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

Cobalah online!

Penjelasan

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

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

Emigna
sumber
1
'+×s·ÅÉ'+×∊.C»menggunakan ÅÉyang lain
Magic Gurita Guci
@MagicOctopusUrn: Pikiran awal saya menggunakan ÅÉtetapi saya membuangnya karena saya tidak berpikir untuk menggunakannya ·agar bisa berfungsi.
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]

Cobalah online!

Terima kasih untuk Tips ini untuk menjawab pertanyaan Python golf karena memberi tahu saya tentang .centerfungsinya. Mengembalikan daftar string.

Jo King
sumber
Bukankah footer termasuk dalam hitungan byte? Dalam hal ini, solusi saya adalah 58 byte
maks
@maxb Jika Anda menggunakan fungsi, umumnya tidak apa-apa untuk mengembalikan output sebagai daftar baris
Jo King
@ JoKing: Hum mungkin ingin melakukan cek ulang? COBALAH
Muhammad Salman
@ JoKing: Gagal.
Muhammad Salman
1
@MuhammadSalman 1. Anda sedang menguji fungsi saya untuk n = 3 melawan pengembalian untuk n = 5, 2. Anda memiliki baris baru di akhir tes, dan 3. Kode saya memiliki spasi tambahan di setiap baris. Mungkin Anda harus melihat outputnya lain kali
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

Cobalah online!

@JayCe dengan potongan terakhir.

The repFungsi ditugaskan untuk operator infiks yang ada, seperti <atau ^sehingga rep("+", n)setara dengan "<"("+", n)yang dapat ditulis dengan menggunakan <sebagai operator infiks seperti dalam "+" < ndan disingkat menjadi "+"<n.

ngm
sumber
1
Simpan 25 byte dan buat fungsinya.
JayCe
Jadi, benar-benar jawaban Anda :) Kode asli yang bagus!
JayCe
Ada beberapa spasi putih di sini yang dapat dihapus, dan menggunakan "+"langsung alih-alih menyimpannya sebagai zmenghemat beberapa byte! Cobalah di sini
Giuseppe
1
@ngm @Giuseppe Di atas peningkatan Giuseppe, gantikan <untuk repmendapatkan di bawah 100 karakter! Di sini
JayCe
3

Arang , 15 byte

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

Cobalah online!Tautan adalah untuk mengucapkan versi kode. Penjelasan:

G→→↙N+

Cetak segitiga terbalik + setinggi input dan hampir dua kali lebarnya.

Gerakkan kursor ke bawah sehingga mendarat di garis tambahan setelah refleksi.

‖M↑

Buat gambar cermin segitiga.

×⊕ⅈ+

Gambarlah garis tambahan menggunakan kolom saat ini untuk menghindari keharusan membaca input lagi.

Refleksikan output sehingga garis tambahan menunjuk ke kiri.

Neil
sumber
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
Corwin Fjeldstrom
sumber
3
Selamat datang di PPCG! Ini adalah pengiriman pertama yang bagus, dan saya telah menambahkannya ke daftar solusi yang dipasang sementara QBasic adalah Bahasa Bulan Ini . Jika suka, Anda dapat meningkatkan jawaban ini dengan menambahkan penjelasan singkat. Nikmati waktu Anda di sini!
DLosc
2

JavaScript (Node.js) , 106 105 byte

  • terima kasih kepada @Kevin Cruijssen untuk mengurangi 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`
`

Cobalah online!

________________________________________________

Pendekatan kedua

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

  • terima kasih kepada @Kevin Cruijssen untuk mengurangi 1 byte
  • terima kasih kepada @ovs untuk mengurangi 1 byte
n=>[X="+"[r="repeat"](n),...x=[...X].map((_,i)=>" "[r](n+~i)+"+"[r](i-~i)),...x.reverse()].join`
`

Cobalah online!

DanielIndie
sumber
2
Seperti halnya konvensi, Anda harus memiliki pengajuan terpendek Anda di bagian atas posting Anda jika Anda memiliki beberapa pendekatan di dalamnya. Hal ini memungkinkan orang lain untuk dengan mudah mencoba tantangan, mencari bahasa mereka, dan melihat bagaimana mereka membandingkan dengan jawaban terbaik Anda (dan diperlukan untuk papan skor untuk bekerja dengan baik pada tantangan yang memiliki papan skor)
Taylor Scott
2

Japt -R , 18 17 byte

õÈ+Y î+Ãû ê1 iUî+

Cobalah online!

Oliver
sumber
2

PowerShell , 55 byte

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

Cobalah online!

Tor
sumber
1
Jawaban yang bagus tetapi karakternya seharusnya +bukan x. Anda juga dapat membuat respons Anda sedikit lebih ramah komunitas dengan menggunakan Coba online! dan menambahkan tautan ke jawaban Anda
Taylor Scott
1
Derp - tidak percaya saya tidak melihat itu. Terima kasih!
Tor
2

J , 29 byte

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

Cobalah online!

Penjelasan:

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

Haskell , 85 82 byte

Disimpan 3 byte berkat nimi !

n!c=[1..n]>>c
f n|x<-[(n-i)!" "++(i*2-1)!"+"|i<-[1..n]]=unlines$n!"+":x++reverse x

Cobalah online!

Cristian Lupascu
sumber
Dengan menggunakan tip ini, Anda dapat menyingkirkan variabel dua kali digunakan xyang menyimpan 4 byte: Coba online!
ბიმო
1

Ruby , 71 61 byte

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

Cobalah online!


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

Jalankan sebagai pipa dengan `-nR 'atau coba online .

Titus
sumber
1

PowerShell , 58 byte

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

Cobalah online!

Cukup loop-up dan -down, masing-masing iterasi menghasilkan jumlah ruang yang sesuai dan kemudian jumlah tanda plus yang sesuai. Ho-hum.

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

Cobalah online!

Henrik Hansen
sumber
4
Selamat datang di PPCG.
Muhammad Salman
Tampaknya ini tidak berfungsi. Juga, input harus diambil dari STDIN, file, atau argumen fungsi. Kami tidak mengizinkan variabel yang ditugaskan sebelumnya sebagai input.
mbomb007
@ mbomb007 Bisakah Anda menyetujuinya sekarang?
Henrik Hansen
@HenrikHansen: Mengapa ini memberikan kesalahan? /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: Saya menyarankan suntingan. Lihatlah
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);

Aku tahu ini bisa jauh lebih kecil dari ini;) Greetz manga

mangga
sumber
Selamat datang di PPCG!
Muhammad Salman
Kode Anda tampaknya menghasilkan kesalahan ketika saya mencoba menjalankannya?
Muhammad Salman
Mengapa Anda menyarankan ini sebagai suntingan terpisah? Itu tidak masuk akal.
Nissa
@StephenLeppik: Ups, mungkin ada kesalahan di pihak saya. Soory
Muhammad Salman
1

sed 4.2.2 , 69

Skor termasuk +1 untuk -ropsi sed.

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

Cobalah online!

Trauma Digital
sumber
1

Ruby , 59 byte

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

Cobalah online!

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

Cobalah online!

Versi yang dapat dibaca:

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
sumber
Jauh lebih baik :) Saya memformat entri Anda sehingga terlihat seperti jawaban lain. Anda ingin mengunjungi tio.run itu memformat jawaban Anda untuk Anda dan membuatnya mudah bagi orang lain untuk mereproduksi kode Anda.
JayCe
1

Yabasic , 102 byte

Fungsi anonim yang mengambil input sebagai angka unary dengan +tanda penghitungan dan keluaran ke konsol.

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

Cobalah online!

Versi Alternatif, 117 byte

Fungsi anonim menjawab yang mengambil input sebagai bilangan bulat desimal dan output ke konsol.

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

Cobalah online!

Taylor Scott
sumber
Fungsi anonim? Mereka tampak seperti seluruh program bagi saya ...
Ørjan Johansen
@ ØrjanJohansen istilah ini, untuk Yabasic, hanya berarti bahwa mereka tidak dibungkus sebagai subrutin yang ditetapkan pengguna , bukan bagian dari pustaka dan dengan demikian tidak dapat disebut secara terpisah seperti fungsi builtin dapat (mis. Abs(x)). Anda dapat membaca sedikit lebih banyak tentang ini di sini jika Anda mau.
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);}

Cobalah online!

Memperbarui jawaban saya berkat @JoKing

NTCG
sumber
@JoKing maaf, kesalahan saya, saya baru saja memperbarui jawaban saya, terima kasih teman saya.
NTCG
@JoKing, terima kasih atas waktu Anda
NTCG
1

APL (Dyalog Unicode) , 25 byte SBCS

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

Cobalah online!

Penjelasan:

⍪∘⊖⍨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
sumber
1↓[2]-> 0 1↓atau bahkan lebih baik: c,⍨⌽1↓[2]c←->⍉(⊖⍪1↓⊢)⍉
ngn
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();}

Pasti bisa bermain golf lagi, tapi ini awal.

Penjelasan:

Cobalah 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
sumber
0

Japt -R , 18 16 byte

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

Cobalah


Penjelasan

                     :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
sumber
0

Attache , 62 byte

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

Cobalah online!

Sebuah lambda yang menganggap integer sebagai argumen.

Contoh

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

T-SQL, 152 byte

Sesuai aturan IO kami , input diambil melalui tabel t yang sudah ada dengan bidang bilangan bulat 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

Putaran penghitungan manual, tidak terlalu "seperti SQL". Diformat:

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
sumber