Diamond Creator +


27

Вызов :

Дано целое число в nкачестве входных данных. Создайте алмаз, который в 2 раза превышает указанное число n.

Вход:

Входные данные целые nи 2 <n ≤ 3000.

Выход :

Вывод будет строкой, и он будет в форме ромба, состоящего из +строки добавления в начале, показывающей nиспользование+

Примеры :

D (3):

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

D (5):

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

D (6): 

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

Критерии победы:

Это поэтому выигрывает самый короткий код в байтах для каждого языка программирования.


1
Можем ли мы принять nв одинарном?
Адам

3
... используя +как метку ?
Адам

1
Можете ли вы добавить тестовый пример, где nдаже?
Лохматый

2
@ Шэгги: конечно, почему нет. Я добавлю это прямо сейчас. Спасибо
Мухаммад Салман,

Ответы:


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]

Попробуйте онлайн!


Моя первая попытка игры в гольф, любые предложения по улучшению приветствуются.

РЕДАКТИРОВАТЬ: сэкономил 1 байт благодаря Кевину Круйссену

РЕДАКТИРОВАТЬ: устранено недоразумение о количестве байтов

РЕДАКТИРОВАТЬ: Сохранено гораздо больше байтов благодаря Джо Кинга и user202729


5
Добро пожаловать в PPCG! :)
Лохматый

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

1
Представления могут быть либо полной программой (ничего в верхнем / нижнем колонтитуле), либо функцией (которая должна определять функцию (или ссылку, в случае анонимной функции, такой как lambda)).
user202729

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

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: Моя первоначальная мысль использовалась, ÅÉно я отказался от нее, потому что не думал использовать ·ее, чтобы она работала.
Emigna

5

Python 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 Если вы используете функцию, обычно можно возвращать вывод в виде списка строк
Джо Кинг,

@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+

Выведите перевернутый треугольник +с высотой ввода и почти в два раза большей ширины.

Переместите курсор вниз, чтобы он попал на дополнительную строку после отражения.

‖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 байта благодаря NIMI !

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-$_)+"+"*$_+"+"*--$_}

Попробуйте онлайн!

Просто цикл вверх и вниз, каждая итерация выводит соответствующее количество пробелов, а затем соответствующее количество знаков плюс. Ho-гул.


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

Я знаю, что это может быть намного меньше, чем это;) Привет мангас


Добро пожаловать в PPCG!
Мухаммед Салман,

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

Почему вы предложили это как отдельное редактирование? Это не имеет никакого смысла.
Нисса

@StephenLeppik: Ой, наверное, ошибка с моей стороны. Соори
Мухаммед Салман



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

YaBasic , 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

Попробуйте онлайн!


Анонимные функции? Они выглядят как целые программы для меня ...
Орджан Йохансен

@ Ø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


@ Прошу прощения, моя ошибка, я просто обновляю свой ответ, спасибо, мой друг.
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↓⊢)⍉
нгн

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

Атташе , 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.