Người tạo kim cương +


27

Thử thách :

Cho một số nguyên nlàm đầu vào. Tạo một viên kim cương gấp 2 lần số đã cho n.

Đầu vào :

Đầu vào là số nguyên nvà 2 <n 3000.

Đầu ra:

Đầu ra sẽ là một chuỗi và nó sẽ ở dạng một viên kim cương bao gồm +một dòng bổ sung khi bắt đầu hiển thị nbằng cách sử dụng+

Ví dụ:

D (3):

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

D (5):

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

D (6): 

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

Tiêu chí chiến thắng:

Đây là để mã ngắn nhất tính theo byte cho mỗi ngôn ngữ lập trình sẽ thắng.


1
Chúng ta có thể đi ntrong unary?
Adám

3
Sử dụng +như đánh dấu kiểm đếm ?
Adám

1
Bạn có thể thêm một trường hợp thử nghiệm mà nthậm chí là?
Xù xì

2
@Shaggy: chắc chắn tại sao không. Tôi sẽ thêm nó ngay lập tức. Cảm ơn
Muhammad Salman

Câu trả lời:


33

Brainfuck , 151 139 byte

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

Hãy thử trực tuyến!

Đưa đầu vào qua unary, với +s là dấu kiểm đếm ( được cho phép bởi người đăng ). Quyết định làm lại cái này, vì tôi nghĩ cái cũ dài hơn một chút so với nó (mặc dù cái này cũng vậy!).

Phiên bản cũ (151 byte):

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

Hãy thử trực tuyến!

Lấy đầu vào là ô bắt đầu. Tôi không thể nghĩ ra cách tận dụng nửa đầu để giúp với phần hai, vì vậy có một vòng lặp cho mỗi người trong số họ.

Làm thế nào nó hoạt động:

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

Và chỉ để cho vui:

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

Hãy thử trực tuyến!


2
Bạn đã nhận được phiếu bầu của tôi cho chỉ cho những điều thú vị. Câu trả lời tuyệt vời
Muhammad Salman

15

Canvas , 9 byte

+×O{+×]±╪

Hãy thử nó ở đây!

Giải thích (một số ký tự đã được thay thế để tìm kiếm không gian):

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

Hãy thử trực tuyến!


Nỗ lực đầu tiên của tôi tại một số môn đánh gôn, mọi đề xuất cải tiến đều được hoan nghênh.

EDIT: đã lưu 1 byte nhờ Kevin Cruijssen

EDIT: xóa bỏ hiểu lầm về số byte

EDIT: Đã lưu nhiều byte hơn nhờ Jo King và user202729


5
Chào mừng đến với PPCG! :)
Xù xì

1
Ngoài ra, nếu bạn thay đổi thành Python 2, print'\n'.join(['+'*n]+a+a[::-1])có thể được sử dụng mà không cần dấu ngoặc đơn để lưu thêm 2 byte. +1 từ tôi mặc dù. Câu trả lời đầu tiên tốt đẹp. :)
Kevin Cruijssen

1
Đệ trình có thể là một chương trình đầy đủ (không có gì trong tiêu đề / chân trang) hoặc một chức năng (phải xác định một chức năng (hoặc tham chiếu, trong trường hợp chức năng ẩn danh, chẳng hạn như lambda)).
dùng202729

2
Và , 2*i+1 == i+i+1 == i-(-i-1) == i-~i.
dùng202729

2
Câu trả lời tuyệt vời đầu tiên. làm tốt.
ElPedro

8

05AB1E , 14 byte

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

Hãy thử trực tuyến!

Giải trình

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

Ngoài ra 14 byte: L‚˜'+×ćs.∞∊.c»


1
'+×s·ÅÉ'+×∊.C»sử dụng ÅÉlà một thứ khác
Magic Octopus Urn

@MagicOctopusUrn: Suy nghĩ ban đầu của tôi là sử dụng ÅÉnhưng tôi đã loại bỏ nó vì tôi không nghĩ đến việc sử dụng ·để làm cho nó hoạt động.
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]

Hãy thử trực tuyến!

Nhờ vào Mẹo này để chơi gôn Python trả lời đã thông báo cho tôi về .centerchức năng. Trả về một danh sách các chuỗi.


Không phải là chân trang được bao gồm trong số byte? Trong trường hợp đó, giải pháp của tôi là 58 byte
maxb

@maxb Nếu bạn đang sử dụng một chức năng, thông thường bạn có thể trả lại đầu ra dưới dạng danh sách các dòng
Jo King

@JoKing: Hum có thể muốn kiểm tra lại lil không? TRY
Muhammad Salman

@JoKing: Thất bại.
Muhammad Salman

1
@MuhammadSalman 1. Bạn đang kiểm tra chức năng của mình cho n = 3 so với lợi nhuận của n = 5, 2. Bạn có một dòng mới trong thử nghiệm và 3. Mã của tôi có dấu cách trên mỗi dòng. Có lẽ bạn chỉ nên nhìn vào đầu ra vào lần tới
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

Hãy thử trực tuyến!

@JayCe với lần cắt cuối cùng.

Các repchức năng được gán cho một nhà điều hành ghi hiện có, chẳng hạn như <hay ^để rep("+", n)tương đương với "<"("+", n)đó có thể được viết bằng cách sử dụng <như một nhà điều hành ghi như trong "+" < nvà rút ngắn xuống còn "+"<n.


1
Lưu 25 byte và biến nó thành một hàm.
JayCe

Vì vậy, hoàn toàn câu trả lời của bạn :) Mã gốc tuyệt vời!
JayCe

Có một số khoảng trắng ở đây có thể được loại bỏ và sử dụng "+"trực tiếp thay vì lưu nó dưới dạng zlưu một số byte! Dùng thử tại đây
Giuseppe

1
@ngm @Giuseppe Ngày đầu cải thiện Giuseppe của, thay thế <cho repđể có được dưới 100 ký tự! Tại đây
JayCe

3

Than , 15 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

G→→↙N+

In một tam giác ngược có +chiều cao của đầu vào và gần gấp đôi chiều rộng.

Di chuyển con trỏ xuống để nó nằm trên dòng bổ sung sau khi phản chiếu.

‖M↑

Tạo một hình ảnh phản chiếu của hình tam giác.

×⊕ⅈ+

Vẽ dòng bổ sung bằng cột hiện tại để tránh phải đọc lại đầu vào.

Phản ánh đầu ra để các dòng bổ sung chỉ về bên trái.




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
Chào mừng đến với PPCG! Đây là lần gửi đầu tiên tuyệt vời và tôi đã thêm nó vào danh sách các giải pháp được đăng trong khi QBasic là Ngôn ngữ của Tháng . Nếu bạn thích, bạn có thể cải thiện câu trả lời này bằng cách thêm một lời giải thích ngắn. Tận hưởng thời gian của bạn ở đây!
DLosc

2

JavaScript (Node.js) , 106 105 byte

  • cảm ơn @Kevin Cruijssen vì đã giảm 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`
`

Hãy thử trực tuyến!

Giới thiệu

Cách tiếp cận thứ hai

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

  • cảm ơn @Kevin Cruijssen vì đã giảm 1 byte
  • cảm ơn @ovs đã giảm 1 byte
n=>[X="+"[r="repeat"](n),...x=[...X].map((_,i)=>" "[r](n+~i)+"+"[r](i-~i)),...x.reverse()].join`
`

Hãy thử trực tuyến!


2
Cũng giống như một vấn đề quy ước, bạn nên có bài nộp ngắn nhất ở đầu bài nếu bạn có nhiều cách tiếp cận trong đó. Điều này cho phép người khác dễ dàng thực hiện thử thách, tìm kiếm ngôn ngữ của họ và xem họ so sánh với câu trả lời tốt nhất của bạn như thế nào (và cần thiết để bảng điểm hoạt động chính xác trên các thử thách có bảng điểm)
Taylor Scott


2

PowerShell , 55 byte

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

Hãy thử trực tuyến!


1
Câu trả lời tuyệt vời nhưng nhân vật nên được +thay thế x. Ngoài ra, bạn có thể làm cho phản hồi của mình thân thiện với cộng đồng hơn một chút bằng cách sử dụng Dùng thử trực tuyến! và thêm một liên kết đến câu trả lời của bạn
Taylor Scott

1
Derp - không thể tin rằng tôi đã không nhìn thấy điều đó. Cảm ơn!
Tor

2

J , 29 byte

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

Hãy thử trực tuyến!

Giải trình:

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

Chạy như đường ống với `-nR, hoặc thử trực tuyến .


1

PowerShell , 58 byte

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

Hãy thử trực tuyến!

Đơn giản chỉ là một vòng lặp và xuống, mỗi lần lặp xuất ra số lượng khoảng trống thích hợp và sau đó là số dấu cộng thích hợp. Hồ-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)

Hãy thử trực tuyến!


4
Chào mừng đến với PPCG.
Muhammad Salman

Điều này dường như không hoạt động. Ngoài ra, đầu vào nên được lấy từ STDIN, tệp hoặc đối số chức năng. Chúng tôi không cho phép các biến được gán trước làm đầu vào.
mbomb007

@ mbomb007 Bạn có thể phê duyệt nó bây giờ không?
Henrik Hansen

@HenrikHansen: Tại sao điều này gây ra lỗi? /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: Tôi đề nghị chỉnh sửa. Hãy xem
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);

Tôi biết nó có thể nhỏ hơn thế này nhiều;) Greetz mangas


Chào mừng đến với PPCG!
Muhammad Salman

Mã của bạn dường như tạo ra một lỗi khi tôi cố chạy nó?
Muhammad Salman

Tại sao bạn đề nghị đây là một chỉnh sửa riêng biệt? Không có nghĩa lý gì.
Nissa

@StephenLeppik: Rất tiếc, có thể là một lỗi về phía tôi. 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]))

Hãy thử trực tuyến!

Phiên bản dễ đọc:

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

Tốt hơn nhiều :) Tôi định dạng mục nhập của bạn để nó trông giống như các câu trả lời khác. Bạn muốn truy cập tio. Hãy định dạng câu trả lời cho bạn và giúp người khác dễ dàng tạo lại mã của bạn.
JayCe

1

Yabasic , 102 byte

Một hàm ẩn danh lấy đầu vào là một số đơn vị có +dấu kiểm và đầu ra cho bàn điều khiển.

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

Hãy thử trực tuyến!

Phiên bản thay thế, 117 byte

Một câu trả lời hàm ẩn danh lấy đầu vào là số nguyên thập phân và xuất ra bàn điều khiển.

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

Hãy thử trực tuyến!


Chức năng ẩn danh? Chúng trông giống như toàn bộ chương trình đối với tôi ...
Ørjan Johansen

@ ØrjanJohansen thuật ngữ này, đối với Yabasic, chỉ có nghĩa là chúng không được bao bọc như một subthói quen do người dùng xác định , không phải là một phần của bất kỳ thư viện nào và do đó không thể được gọi một cách riêng biệt như các hàm dựng sẵn có thể (ví dụ Abs(x)). Bạn có thể đọc thêm một chút về điều này ở đây nếu bạn muốn.
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);}

Hãy thử trực tuyến!

Đã cập nhật câu trả lời của tôi nhờ @JoKing


@JoKing xin lỗi, lỗi của tôi, tôi chỉ cập nhật câu trả lời của tôi, cảm ơn bạn của tôi.
NTCG

@JoKing, cảm ơn bạn đã dành thời gian
NTCG

1

APL (Dyalog Unicode) , 25 byte SBCS

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

Hãy thử trực tuyến!

Giải trình:

⍪∘⊖⍨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↓hoặc thậm chí tốt hơn: 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();}

Chắc chắn có thể được chơi gôn nhiều hơn, nhưng đó là một sự khởi đầu.

Giải trình:

Hãy thử trực tuyến.

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

Thử nó


Giải trình

                     :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

Tùy viên , 62 byte

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

Hãy thử trực tuyến!

Một lambda lấy số nguyên làm đối số.

Thí dụ

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

Theo quy tắc IO của chúng tôi , đầu vào được lấy thông qua bảng t có sẵn với trường số nguyên 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

Vòng lặp đếm thủ công, không giống "SQL". Định dạng:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.