Diamentowy twórca +


27

Wyzwanie:

Podano liczbę całkowitą njako dane wejściowe. Utwórz diament, który jest 2x podaną liczbą n.

Wejście:

Dane wejściowe są liczbami całkowitymi ni 2 <n ≤ 3000.

Wyjście:

Wyjście będzie sznurkiem i będzie miało postać diamentu składającego się +z linii dodawania na początku pokazującej nużycie+

Przykłady:

D (3):

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

D (5):

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

D (6): 

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

Zwycięskie kryteria:

To jest więc wygrywa najkrótszy kod w bajtach dla każdego języka programowania.


1
Czy możemy przyjąć njednomyślnie?
Adám

3
... używając +jako znak tally ?
Adám

1
Czy możesz dodać przypadek testowy, gdzie njest parzysty?
Kudłaty

2
@Shaggy: jasne, dlaczego nie. Dodam to od razu. Dzięki
Muhammad Salman,

Odpowiedzi:


33

pieprzenie mózgu , 151 139 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe za pomocą unary, ze +s jako znaczniki tally ( dozwolone przez plakat ). Postanowiłem to przerobić, ponieważ myślałem, że stary był nieco dłuższy niż mógłby (choć ten też jest!).

Stara wersja (151 bajtów):

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

Wypróbuj online!

Pobiera dane wejściowe jako komórkę początkową. Nie mogłem wymyślić sposobu na wykorzystanie pierwszej połowy, aby pomóc w drugiej, więc dla każdej z nich jest pętla.

Jak to działa:

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

I dla zabawy:

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

Wypróbuj online!


2
Masz mój głos na zabawę. Fajna odpowiedź
Muhammad Salman,

15

Płótno , 9 bajtów

+×O{+×]±╪

Wypróbuj tutaj!

Objaśnienie (niektóre postacie zostały zastąpione, aby wyglądały w przestrzeni kosmicznej):

+×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 bajtów

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

Wypróbuj online!


Moja pierwsza próba gry w golfa, wszelkie sugestie dotyczące ulepszeń są mile widziane.

EDYCJA: zapisano 1 bajt dzięki Kevinowi Cruijssenowi

EDYCJA: usunięto nieporozumienie dotyczące liczby bajtów

EDYCJA: Zaoszczędź o wiele więcej bajtów dzięki Jo King i user202729


5
Witamy w PPCG! :)
Kudłaty

1
Ponadto, jeśli zmienisz język na Python 2, print'\n'.join(['+'*n]+a+a[::-1])możesz go użyć bez nawiasów, aby zaoszczędzić 2 bajty. +1 ode mnie. Dobra pierwsza odpowiedź. :)
Kevin Cruijssen

1
Zgłoszenia mogą być pełnym programem (nic w nagłówku / stopce) lub funkcją (która musi definiować funkcję (lub odwołanie, w przypadku funkcji anonimowej takiej jak lambda)).
user202729,

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

2
Świetna pierwsza odpowiedź. dobra robota.
ElPedro,

8

05AB1E , 14 bajtów

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

Wypróbuj online!

Wyjaśnienie

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

Również 14 bajtów: L‚˜'+×ćs.∞∊.c»


1
'+×s·ÅÉ'+×∊.C»używanie ÅÉjest inne
Magic Octopus Urn

@MagicOctopusUrn: Moja początkowa myśl była używana, ÅÉale odrzuciłem ją, ponieważ nie myślałem o użyciu, ·aby działała.
Emigna,

5

Python 3 , 79 78 bajtów

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

Wypróbuj online!

Dzięki tym Poradom do gry w golfa odpowiedz na Python za poinformowanie mnie o .centerfunkcji. Zwraca listę ciągów.


Czy stopka nie jest uwzględniona w liczbie bajtów? W takim przypadku moje rozwiązanie ma 58 bajtów
maks.

@maxb Jeśli używasz funkcji, generalnie dobrze jest zwracać dane wyjściowe jako listę wierszy
Jo King

@JoKing: Hum może chcieć ponownie sprawdzić? WYPRÓBUJ
Muhammad Salman,

@JoKing: Nie udaje się.
Muhammad Salman,

1
@MuhammadSalman 1. Testujesz moją funkcję dla n = 3 w stosunku do zwrotu dla n = 5, 2. Masz w teście końcowy znak nowej linii i 3. Mój kod ma końcowe spacje w każdej linii. Może następnym razem po prostu spójrz na wynik
Jo King

4

R , 135 110 96 bajtów

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

Wypróbuj online!

@JayCe z ostatecznym cięciem.

repFunkcja jest przypisana do istniejącego infiksowych operatora, jak <i ^dlatego, że rep("+", n)jest równoważne "<"("+", n), które mogą być zapisywane z użyciem <jako operator Infix jak w "+" < ni skraca się do "+"<n.


1
Zaoszczędź 25 bajtów i włącz funkcję.
JayCe

Więc całkowicie twoja odpowiedź :) Świetny oryginalny kod!
JayCe

Jest tutaj trochę białych znaków, które można usunąć, a używanie "+"bezpośrednio zamiast zapisywania, ponieważ zoszczędza niektóre bajty! Spróbuj tutaj
Giuseppe

1
@ngm @Giuseppe na szczycie poprawy Giuseppe, substytutem <dla repuzyskać pod 100 znaków! Tutaj
JayCe

3

Węgiel drzewny , 15 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

G→→↙N+

Wydrukuj odwrócony trójkąt o +wysokości wejściowej i prawie dwa razy większej.

Przesuń kursor w dół, aby po odbiciu wylądował na dodatkowej linii.

‖M↑

Zrób lustrzane odbicie trójkąta.

×⊕ⅈ+

Narysuj dodatkową linię, używając bieżącej kolumny, aby uniknąć konieczności ponownego odczytu danych wejściowych.

Odbij dane wyjściowe, tak aby dodatkowa linia była skierowana w lewo.




3

QB64, 82 79 bajtów

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
Witamy w PPCG! To świetne pierwsze zgłoszenie, które dodałem do listy opublikowanych rozwiązań, podczas gdy QBasic jest językiem miesiąca . Jeśli chcesz, możesz poprawić tę odpowiedź, dodając krótkie wyjaśnienie. Życzymy miłego pobytu tutaj!
DLosc

2

JavaScript (Node.js) , 106 105 bajtów

  • dzięki @Kevin Cruijssen za zmniejszenie o 1 bajt
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`
`

Wypróbuj online!

________________________________________________

Drugie podejście

JavaScript (Node.js) , 105 100 99 98 bajtów

  • dzięki @Kevin Cruijssen za zmniejszenie o 1 bajt
  • dzięki @ovs za zmniejszenie o 1 bajt
n=>[X="+"[r="repeat"](n),...x=[...X].map((_,i)=>" "[r](n+~i)+"+"[r](i-~i)),...x.reverse()].join`
`

Wypróbuj online!


2
Zasadniczo powinieneś mieć najkrótsze zgłoszenie na początku postu, jeśli masz w nim wiele podejść. Pozwala to innym osobom łatwo podjąć wyzwanie, wyszukać ich język i zobaczyć, jak porównują się do najlepszej odpowiedzi (i jest potrzebne, aby tablice wyników działały poprawnie na wyzwaniach, które mają tablice wyników)
Taylor Scott


2

PowerShell , 55 bajtów

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

Wypróbuj online!


1
Świetna odpowiedź, ale postać powinna być +zamiast x. Możesz także uczynić swoją odpowiedź nieco bardziej przyjazną dla społeczności, używając Wypróbuj online! i dodając link do swojej odpowiedzi
Taylor Scott

1
Derp - nie mogę uwierzyć, że tego nie widziałem. Dzięki!
Tor

2

J , 29 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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

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

Uruchom jako potok z `-nR 'lub wypróbuj online .


1

PowerShell , 58 bajtów

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

Wypróbuj online!

Po prostu pętla w górę i w dół, każda iterująca generuje odpowiednią liczbę spacji, a następnie odpowiednią liczbę znaków plus. Ho-hum.


1

F # (mono) , 123 bajty

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)

Wypróbuj online!


4
Witamy w PPCG.
Muhammad Salman,

To nie wydaje się działać. Ponadto dane wejściowe należy pobierać z STDIN, pliku lub argumentu funkcji. Nie zezwalamy na wcześniej przypisane zmienne jako dane wejściowe.
mbomb007

@ mbomb007 Czy możesz to teraz zatwierdzić?
Henrik Hansen

@HenrikHansen: Dlaczego powoduje to błąd? /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: Zasugerowałem edycję. Spójrz
Muhammad Salman,

1

PHP 102 bajty

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

Wiem, że może być o wiele mniejszy;) Greetz mangas


Witamy w PPCG!
Muhammad Salman,

Twój kod wydaje się powodować błąd, gdy próbuję go uruchomić?
Muhammad Salman,

Dlaczego zaproponowałeś to jako osobną edycję? To nie ma sensu.
Nissa,

@StephenLeppik: Ups, prawdopodobnie błąd z mojej strony. Soory
Muhammad Salman



1

Python 3 , 98 bajtów

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

Wypróbuj online!

Wersja do odczytu:

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

Znacznie lepiej :) Sformatowałem twój wpis, aby wyglądał jak inne odpowiedzi. Chcesz odwiedzić tio.run it formatuje twoją odpowiedź i ułatwia innym odtwarzanie Twojego kodu.
JayCe

1

Yabasic , 102 bajty

Anonimowa funkcja, która pobiera dane wejściowe jako liczbę jednoznaczną ze +znakami sumy i dane wyjściowe do konsoli.

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

Wypróbuj online!

Wersja alternatywna, 117 bajtów

Anonimowa odpowiedź funkcji, która pobiera dane w postaci liczb całkowitych dziesiętnych i wysyła je do konsoli.

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

Wypróbuj online!


Anonimowe funkcje? Dla mnie wyglądają jak całe programy ...
Ørjan Johansen

@ ØrjanJohansen ten termin, dla Yabasic, oznacza tylko, że nie są one pakowane jako subprocedura zdefiniowana przez użytkownika , nie są częścią żadnej biblioteki, a zatem nie mogą być wywoływane w sposób dyskretny, jak mogą to być funkcje wbudowane (np. Abs(x)). Możesz przeczytać więcej o tym tutaj, jeśli chcesz.
Taylor Scott,

1

JavaScript (Node.js) , 183 bajtów

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

Wypróbuj online!

Zaktualizowałem moją odpowiedź dzięki @JoKing


@JoKing przepraszam, mój błąd, właśnie aktualizuję swoją odpowiedź, dziękuję przyjacielu.
NTCG

@JoKing, dziękuję za
poświęcony

1

APL (Dyalog Unicode) , 25 bajtów SBCS

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

Wypróbuj online!

Wyjaśnienie:

⍪∘⊖⍨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↓lub nawet lepiej: c,⍨⌽1↓[2]c←->⍉(⊖⍪1↓⊢)⍉
ngn

0

Java 8, 159 bajtów

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

Zdecydowanie można jeszcze zagrać w golfa, ale to dopiero początek.

Wyjaśnienie:

Wypróbuj 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 bajtów

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

Spróbuj


Wyjaśnienie

                     :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 bajty

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

Wypróbuj online!

Lambda, która przyjmuje liczbę całkowitą jako argument.

Przykład

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 bajty

Zgodnie z naszymi regułami We / Wy , dane wejściowe są pobierane przez wcześniej istniejącą tabelę tz polem całkowitym 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

Pętla zliczania ręcznego, niezbyt „podobna do SQL”. Sformatowany:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.