Diamond Creator +


27

Виклик:

Дано ціле число nв якості вхідного даних. Створіть ромб, який є в 2 рази заданим числом n.

Вхід:

Вхід цілий nі 2 <n ≤ 3000.

Вихід:

Вихід буде рядком і буде мати форму алмазу, що складається +з додавання рядка на початку, що показує nвикористання+

Приклади:

D (3):

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

D (5):

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

D (6): 

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

Критерії виграшу:

Це тому найкоротший код у байтах для кожної мови програмування виграє.


1
Чи можемо ми взяти nв одинаку?
Адам

3
… Використовуючи +як позначку ?
Адам

1
Чи можете ви додати тестовий випадок, коли nрівний?
Кудлатий

2
@Shaggy: впевнений, чому б ні. Я додам це відразу. Спасибі
Мухаммад Салман

Відповіді:


33

мозковий ебать , 151 139 байт

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

Спробуйте в Інтернеті!

Здійснює введення через одинарне, з +s як позначки ( дозволені плакатом ). Вирішив переробити це, як я вважав, що старий трохи довший, ніж міг би бути (хоча і цей теж!).

Стара версія (151 байт):

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

Спробуйте в Інтернеті!

Вводиться в якості вихідної комірки. Я не міг придумати спосіб використовувати першу половину, щоб допомогти з другою, тому для кожного з них є цикл.

Як це працює:

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

І просто для розваги:

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

Спробуйте в Інтернеті!


2
Ви отримали мій голос за просто цікаве. Класна відповідь
Мухаммад Салман

15

Полотно , 9 байт

+×O{+×]±╪

Спробуйте тут!

Пояснення (деякі символи були замінені на зовнішній вигляд):

+×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 байт

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

Спробуйте в Інтернеті!


Моя перша спроба гольфу, будь-які пропозиції щодо покращення вітаються.

EDIT: збережено 1 байт завдяки Кевіну Крейсейну

EDIT: усунено непорозуміння щодо кількості байтів

EDIT: Збережено ще багато байтів завдяки Джо Кінгу та користувачеві202729


5
Ласкаво просимо до PPCG! :)
Кудлатий

1
Крім того, якщо ви перейдете на Python 2, print'\n'.join(['+'*n]+a+a[::-1])можна використовувати без дужок, щоб зберегти ще 2 байти. +1 від мене, хоча. Приємна перша відповідь. :)
Кевін Кройсейсен

1
Подання можуть бути або повною програмою (нічого в заголовку / колонтитулі), або функцією (яка повинна визначати функцію (або посилання, якщо анонімна функція, наприклад lambda)).
користувач202729

2
І 2*i+1 == i+i+1 == i-(-i-1) == i-~i,.
користувач202729

2
Чудова перша відповідь. молодець.
ElPedro

8

05AB1E , 14 байт

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

Спробуйте в Інтернеті!

Пояснення

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

Також 14 байт: L‚˜'+×ćs.∞∊.c»


1
'+×s·ÅÉ'+×∊.C»використовуючи ÅÉінший
Чарівний восьминіг Урна

@MagicOctopusUrn: Моя початкова думка використовувалась, ÅÉале я відкинув її, бо не думав використовувати, ·щоб змусити її працювати.
Емінья

5

Пітон 3 , 79 78 байт

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

Спробуйте в Інтернеті!

Завдяки цьому підказки для гри в гольф Python відповідають на те, що повідомили мене про .centerфункцію. Повертає список рядків.


Чи не колонтитул не включений до числа байтів? У такому випадку моє рішення - 58 байт
maxb

@maxb Якщо ви використовуєте функцію, звичайно добре повернути вихід у вигляді списку рядків
Jo King,

@JoKing: Хам може хотіти зробити повторну перевірку? Спробуй
Мухаммад Салман

@JoKing: не вдалося.
Мухаммед Салман

1
@MuhammadSalman 1. Ви перевіряєте мою функцію на n = 3 проти повернення для n = 5, 2. У вас є тестовий новий рядок у тесті та 3. Мій код має пробіли у кожному рядку. Можливо, варто просто подивитись на вихід наступного разу
Джо Кінг,

4

R , 135 110 96 байт

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

Спробуйте в Інтернеті!

@JayCe з остаточним розрізом.

repПризначаються функція до існуючого оператору інфіксне, наприклад, <або ^так , що rep("+", n)еквівалентно , "<"("+", n)які можуть бути записані з використанням в <якості оператора інфіксне , як в "+" < nі скорочуються до "+"<n.


1
Збережіть 25 байт і зробіть це функцією.
JayCe

Так що повністю відповідь :) Чудовий оригінальний код!
JayCe

Тут є пробіл, який можна видалити, і використовувати "+"безпосередньо, а не зберігати його, як zекономить кілька байтів! Спробуйте тут
Джузеппе

1
@ngm @Giuseppe На вершині поліпшення Джузеппе, замінити <на , repщоб отримати до 100 символів! Тут
JayCe

3

Вугілля деревне , 15 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

G→→↙N+

Роздрукуйте перевернутий трикутник +s висотою вводу та майже вдвічі шириною.

Перемістіть курсор вниз, щоб він відбився на додатковій лінії після відображення.

‖M↑

Складіть дзеркальне зображення трикутника.

×⊕ⅈ+

Накресліть додатковий рядок за допомогою поточного стовпця, щоб уникнути необхідності повторного читання введення.

Відбийте висновок так, щоб додаткова лінія вказувала ліворуч.




3

QB64, 82 79 байт

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! Це чудове перше подання, і я додав його до списку рішень, розміщених, поки QBasic - це мова місяця . Якщо вам подобається, ви можете покращити цю відповідь, додавши коротке пояснення. Насолоджуйтесь тут своїм часом!
DLosc

2

JavaScript (Node.js) , 106 105 байт

  • завдяки @Kevin Cruijssen за зменшення на 1 байт
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`
`

Спробуйте в Інтернеті!

________________________________________________

Другий підхід

JavaScript (Node.js) , 105 100 99 98 байт

  • завдяки @Kevin Cruijssen за зменшення на 1 байт
  • завдяки @ovs за зменшення на 1 байт
n=>[X="+"[r="repeat"](n),...x=[...X].map((_,i)=>" "[r](n+~i)+"+"[r](i-~i)),...x.reverse()].join`
`

Спробуйте в Інтернеті!


2
Що стосується конвенції, ви маєте найкоротше подання у верхній частині своєї посади, якщо у вас є кілька підходів до неї. Це дозволяє іншим людям легко спробувати виклик, шукати їхню мову та побачити, як вони порівнюються з вашою найкращою відповіддю (і це потрібно, щоб табло для належної роботи над проблемами, які мають табло)
Тейлор Скотт


2

PowerShell , 55 байт

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

Спробуйте в Інтернеті!


1
Чудова відповідь, але +замість цього повинен бути персонаж x. Крім того, ви можете зробити свою відповідь трохи більш доброзичливою для спільноти, скориставшись Спробуйте в Інтернеті! і додавши посилання на свою відповідь
Тейлор Скотт

1
Дерп - не можу повірити, я цього не бачив. Спасибі!
Тор

2

J , 29 байт

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

Спробуйте в Інтернеті!

Пояснення:

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

2

Haskell , 85 82 байт

Збережено 3 байти завдяки німі !

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

Спробуйте в Інтернеті!


Скориставшись цією порадою, ви зможете позбутися двічі використовуваної змінної, xяка економить 4 байти: Спробуйте в Інтернеті!
ბიმო



1

PowerShell , 58 байт

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

Спробуйте в Інтернеті!

Просто циклічне вгору та вниз, кожен повтор виводить відповідну кількість пробілів, а потім відповідну кількість знаків плюс. Хо-гул.


1

F # (моно) , 123 байти

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)

Спробуйте в Інтернеті!


4
Ласкаво просимо до PPCG.
Мухаммад Салман

Схоже, це не працює. Крім того, слід вводити дані STDIN, файл або аргумент функції. Ми не дозволяємо вводити заздалегідь задані змінні.
mbomb007

@ mbomb007 Чи можете ви це схвалити зараз?
Генрік Хансен

@HenrikHansen: Чому це дає помилку? /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.
Мухаммад Салман

1
@HenrikHansen: Я запропонував змінити. Погляньте
Мухаммед Салман

1

PHP 102 байти

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

Я знаю, що це може бути набагато менше, ніж це;) Манга Greetz


Ласкаво просимо до PPCG!
Мухаммед Салман

Схоже, ваш код видає помилку, коли я намагаюся запустити його?
Мухаммад Салман

Чому ви запропонували це як окрему редакцію? Це не має сенсу.
Нісса

@StephenLeppik: На жаль, помилка з мого боку. Soory
Мухаммед Салман



1

Python 3 , 98 байт

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

Спробуйте в Інтернеті!

Читаема версія:

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

Набагато краще :) Я відформатував ваш запис, щоб він виглядав як інші відповіді. Ви хочете відвідати tio.run, він формулює вашу відповідь за вас і полегшує відтворення інших коду для інших.
JayCe

1

Ябасич , 102 байти

Анонімна функція, яка приймає вхід як одинарне число з +розміченими позначками та виводить на консоль.

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

Спробуйте в Інтернеті!

Альтернативна версія, 117 байт

Відповідь анонімної функції, яка приймає введення у вигляді десяткового цілого числа та виводить на консоль.

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

Спробуйте в Інтернеті!


Анонімні функції? Вони виглядають як цілі програми для мене ...
Ørjan Johansen

@ ØrjanJohansen, цей термін для Yabasic означає лише те, що вони не зафіксовані як визначені користувачем subрутини, не є частиною будь-якої бібліотеки, і тому їх не можна назвати дискретно, як можуть бути вбудовані функції (наприклад, Abs(x)). Ви можете прочитати трохи більше про це тут, якщо хочете.
Тейлор Скотт

1

JavaScript (Node.js) , 183 байти

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

Спробуйте в Інтернеті!

Оновлено мою відповідь завдяки @JoKing


@JoKing Вибачте, моя помилка, я просто оновлюю свою відповідь, дякую друже.
NTCG

@JoKing, дякую за ваш час
NTCG

1

APL (Dyalog Unicode) , 25 байт SBCS

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

Спробуйте в Інтернеті!

Пояснення:

⍪∘⊖⍨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↓або ще краще: c,⍨⌽1↓[2]c←->⍉(⊖⍪1↓⊢)⍉
ngn

0

Java 8, 159 байт

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

Однозначно можна пограти ще трохи, але це початок.

Пояснення:

Спробуйте в Інтернеті.

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 байт

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

Спробуй це


Пояснення

                     :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 байти

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

Спробуйте в Інтернеті!

Лямбда, яка приймає ціле число як аргумент.

Приклад

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 байти

Згідно з нашими правилами вводу- виводу , введення приймається через попередню таблицю t з цілим полем 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

Цикл ручного підрахунку, не дуже "схожий на SQL". Відформатовано:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.