Elmas yaratıcısı +


27

Meydan okuma :

nGiriş olarak bir tamsayı verildi . Verilen sayının 2 katı olan bir elmas oluşturun n.

Giriş:

Giriş tamsayı nve 2 <n ≤ 3000.

Çıktı :

Çıktı bir dize olacaktır ve onu oluşan bir elmas şeklinde olacaktır +başlangıç gösteren bir ekleme hattı ile nkullanarak+

Örnekler:

D (3):

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

D (5):

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

D (6): 

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

Kazanma Kriterleri:

Bu yani her programlama dili için bayt cinsinden en kısa kod kazanır.


1
nUnary alabilir miyiz ?
Ad

3
... kullanarak +olarak taksitli işareti ?
Adám

1
Nerede nolduğu bir test vakası ekleyebilir misiniz ?
Shaggy

2
@Shaggy: neden olmasın eminim. Bunu hemen ekleyeceğim. Teşekkürler
Muhammad Salman

1
@ Adám, burada
Digital Trauma,

Yanıtlar:


33

brainfuck , 151 139 bayt

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

Çevrimiçi deneyin!

Girdiyi unary üzerinden alır, +s (tally tarafından izin verilen ) ile taklit işaretler . Eski olanın olabileceğinden biraz daha uzun olduğunu düşündüğüm gibi, bunu düzeltmeye karar verdim (bu da olsa!).

Eski Sürüm (151 bayt):

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

Çevrimiçi deneyin!

Giriş hücresi olarak girdi alır. İkinciye yardımcı olmak için ilk yarıyı kaldıracak bir yol düşünemedim, bu yüzden her biri için bir döngü var.

Nasıl çalışır:

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

Ve sadece eğlence için:

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

Çevrimiçi deneyin!


2
Sadece eğlence olayı için oyumu aldın. Harika bir cevap
Muhammad Salman,

15

Tuval , 9 bayt

+×O{+×]±╪

Burada dene!

Açıklama (bazı karakterleri monospace bakmak için değiştirildi):

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

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

Çevrimiçi deneyin!


Bazı golf oynamaya ilk girişimi, iyileştirilmesi için önerilerinizi bekliyoruz.

EDIT: Kevin Cruijssen sayesinde 1 byte kurtarıldı

EDIT: bayt sayısı hakkında yanlış anlama kaldırıldı

EDIT: Jo King ve user202729 sayesinde çok daha fazla bayt kaydedildi


5
PPCG'ye Hoşgeldiniz! :)
Shaggy

1
Ayrıca, Python 2'ye geçerseniz, print'\n'.join(['+'*n]+a+a[::-1])2 bayt daha fazla parantez kullanmadan kullanabilirsiniz. Yine de benden +1. Güzel ilk cevap. :)
Kevin Cruijssen

1
Gönderimler tam bir program (başlık / altbilgide hiçbir şey yok) veya bir işlev (bir işlevi tanımlaması gerekir (veya bunun gibi adsız bir işlev olması durumunda lambda)) olabilir.
user202729

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

2
Harika ilk cevap. aferin.
ElPedro

8

05AB1E , 14 bayt

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

Çevrimiçi deneyin!

açıklama

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

Ayrıca 14 bayt: L‚˜'+×ćs.∞∊.c»


1
'+×s·ÅÉ'+×∊.C»ÅÉbaşka bir şey kullanıyor
Magic Octopus Urn

@MagicOctopusUrn: İlk düşüncem kullanıyordu ÅÉama ·atmak için kullanmayı düşünmedim çünkü atmıştım .
Emigna

5

Python 3 , 79 78 bayt

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

Çevrimiçi deneyin!

Golf için Python cevabını bana .centerişlevi hakkında bilgilendirmek için cevap için bu teşekkürler . Dizelerin bir listesini döndürür.


Altbilgi bayt sayımına dahil değil mi? Bu durumda, benim çözüm 58 bayt olduğunu
maxb

@ maxb Bir işlev kullanıyorsanız, çıktıyı satır listesi olarak döndürmek genellikle tamamdır
Jo King

@JoKing: Hum bir lil recheck yapmak isteyebilir mi? TRY
Muhammad Salman

@JoKing: Başarısız.
Muhammad Salman

1
@MuhammadSalman 1. İşlevimi n = 3 için n = 5, 2'ye karşı döndürürsünüz. 2. Testte izleyen bir yeni hattınız var, ve 3. Kodumun her satırda sonda boşlukları var. Belki de bir dahaki sefere çıktıya bakmalısın
Jo King

4

R , 135 110 96 bayt

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

Çevrimiçi deneyin!

Son kesim ile @JayCe.

repFonksiyonu gibi, mevcut bir çatı ve çatı operatöre tahsis edilir <ya da ^o kadar rep("+", n)eşdeğerdir "<"("+", n)kullanılarak yazılabildiği <gibi bir çatı ve çatı operatörü olarak "+" < nve kısaltılmış "+"<n.


1
25 bayt kaydedin ve bir işlev haline getirin.
JayCe

Yani tamamen cevabınız :) Harika orijinal kod!
JayCe

Burada kaldırılabilen bir boşluk var ve "+"onu bir zkaç bayttan tasarruf etmek yerine doğrudan kullanmak yerine ! Burada deneyin
Giuseppe,

1
@ngm @Giuseppe Giuseppe'nun gelişiminde, 100 karakterin altına düşmek <için yerine rep! İşte
JayCe

3

Kömür , 15 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

G→→↙N+

+Girdi yüksekliğinin ters üçgenini ve genişliğinin neredeyse iki katı kadar yazdırın .

İmleci aşağı doğru hareket ettirin, böylece yansıma sonrası ilave satıra inecektir.

‖M↑

Üçgenin ayna görüntüsünü alın.

×⊕ⅈ+

Girişi tekrar okumak zorunda kalmamak için mevcut sütunu kullanarak ek bir çizgi çizin.

Çıkışı, ek satır sola gösterecek şekilde yansıtın.




3

QB64, 82 79 bayt

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
PPCG'ye Hoşgeldiniz! Bu harika bir ilk sunum ve bunu QBasic Ayın Dili iken gönderdiğim çözümler listesine ekledim . İsterseniz, kısa bir açıklama ekleyerek bu cevabı geliştirebilirsiniz. Burada iyi eğlenceler!
DLosc

2

JavaScript (Node.js) , 106 105 bayt

  • 1 byte azaltan @Kevin Cruijssen'e teşekkürler
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`
`

Çevrimiçi deneyin!

________________________________________________

İkinci yaklaşım

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

  • 1 byte azaltan @Kevin Cruijssen'e teşekkürler
  • 1 byte azalması için @ovs sayesinde
n=>[X="+"[r="repeat"](n),...x=[...X].map((_,i)=>" "[r](n+~i)+"+"[r](i-~i)),...x.reverse()].join`
`

Çevrimiçi deneyin!


2
Bir kongre meselesi gibi, içinde birden fazla yaklaşımınız varsa en kısa gönderinizi yazınızın en üstünde yapmalısınız. Bu, diğer kişilerin kolayca mücadeleye girmelerini, dillerini aramalarını ve en iyi cevabınızı nasıl karşılaştırdıklarını görmelerini sağlar (ve puan tablolarının puan tablolarındaki zorluklar üzerinde düzgün çalışması için gereklidir)
Taylor Scott



2

J , 29 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

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

`-NR 'ile pipoyu çalıştırın veya çevrimiçi deneyin .


1

PowerShell , 58 bayt

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

Çevrimiçi deneyin!

Basitçe bir döngü ve-aşağı, her yinelenen uygun sayıda boşluk ve ardından uygun sayıda artı işareti çıktısı. Ho-hum.


1

F # (Mono) , 123 bayt

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)

Çevrimiçi deneyin!


4
PPCG'ye Hoşgeldiniz.
Muhammad Salman

Bu işe görünmüyor. Ayrıca, giriş STDIN'den, bir dosyadan veya bir fonksiyon argümanından alınmalıdır. Önceden atanmış değişkenlere girdi olarak izin vermiyoruz.
mbomb007

@ mbomb007 Şimdi onaylayabilir misin?
Henrik Hansen

@HenrikHansen: Bu neden bir hata veriyor? /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: Bir düzenleme önerdim. Bir göz at
Muhammad Salman

1

PHP 102 bayt

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

Bundan daha küçük olabileceğini biliyorum;) Greetz mangas


PPCG'ye Hoşgeldiniz!
Muhammed Salman,

Çalıştırmaya çalıştığımda kodunuz hata veriyor gibi görünüyor?
Muhammad Salman,

Bunu neden ayrı bir düzenleme olarak önerdiniz? Hiç bir anlamı yok.
Nissa

@StephenLeppik: Hata, muhtemelen benim açımdan bir hata. Soory
Muhammad Salman



1

Python 3 , 98 bayt

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

Çevrimiçi deneyin!

Okunabilir sürüm:

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

Çok daha iyi :) Girişinizi diğer cevaplar gibi görünecek şekilde biçimlendirdim. Tio.run adresini ziyaret etmek istediğinizde, cevabınızı sizin için biçimlendirir ve başkalarının kodunuzu yeniden oluşturmasını kolaylaştırır.
JayCe

1

Yabasic , 102 bayt

Girdiyi +taksitli işaretler ve konsola çıkaran birleşik bir sayı olarak alan anonim bir işlev .

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

Çevrimiçi deneyin!

Alternatif Sürüm, 117 bayt

Ondalık bir tamsayı olarak girişi alan ve konsola çıkan bir anonim işlev yanıtı.

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

Çevrimiçi deneyin!


İsimsiz fonksiyonlar? Bana bütün programlara benziyorlar ...
Ørjan Johansen

@ ØrjanJohansen, Yabasiç için, yalnızca kullanıcı tanımlı bir subyordam olarak sarılmadıkları anlamına gelmez, herhangi bir kütüphanenin parçası değildir ve bu nedenle yerleşik işlevler (örneğin Abs(x)) gibi isteğe bağlı olarak adlandırılamaz . Sen biraz daha bu konuda okuyabilir burada isterseniz.
Taylor Scott

1

JavaScript (Node.js) , 183 bayt

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

Çevrimiçi deneyin!

@JoKing sayesinde cevabım güncellendi


@JoKing üzgünüm, hatam, sadece cevabımı güncelliyorum, teşekkür ederim arkadaşım.
NTCG

@JoKing, zaman
ayırdığınız

1

APL (Dyalog Unicode) , 25 bayt SBCS

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

Çevrimiçi deneyin!

Açıklama:

⍪∘⊖⍨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↓veya daha da iyisi: c,⍨⌽1↓[2]c←->⍉(⊖⍪1↓⊢)⍉
ngn

0

Java 8, 159 bayt

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

Kesinlikle biraz daha golf oynayabilir, ama bu bir başlangıç.

Açıklama:

Çevrimiçi deneyin.

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 bayt

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

Dene


açıklama

                     :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

Ataşesi , 62 bayt

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

Çevrimiçi deneyin!

Tamsayıyı argüman olarak alan bir lambda.

Örnek

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 bayt

IO kurallarımıza göre , giriş önceden var olan tablo t ile bir n tamsayısı alanıyla alınır .

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

Manuel sayma döngüsü, çok "SQL benzeri" değil. biçimlendirilmiş:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.