У цьому виклику використовується символ "+"


28

Ваше завдання: задавши число n, генеруйте знак "+", який знаходиться nвдалині від його центру. Якщо це заплутано, перевірте тестові приклади.

Стандартні способи введення: вихід повинен бути рядок або друкованим. Застосовуються стандартні лазівки.

Input: 1
Output: +           ] 1 away from center `+`.

Input: 2
Output:  +          ] 2 away from center `+`.
        +++         ] 1 away from center `+`.  
         +

Input: 3
Output:   +         ] 3 away from center `+`.
          +
        +++++
          +
          +

Це , тому найкоротший код виграє!


Я припускаю, що пробіли у кожному рядку дозволені, щоб результат був квадратним, правда?
Луїс Мендо

@LuisMendo Так, це добре.
Товариш SparklePony


3
"генерувати знак" + ", який знаходиться на відстані n символів від його центру" - я не розумію цієї частини. До якого центру ви звертаєтесь? Як щось може бути ексцентричним для себе? Поясніть будь ласка.
Wossname

6
Було б набагато менш заплутано, якби центр знаходився в 0 від себе.
Зупиніть шкодити Моніці

Відповіді:


45

22
Що навіть це за мова?
DJMcMayhem

@DJMcMayhem В основному ви можете робити графіку черепахи ASCII мистецтва з ним. У ньому багато зручних вбудованих для надання різних форм ASCII (як P+= хрест).
fergusq

Це не багатобайтові символи?
Пета

3
@Petah Деревне вугілля використовує користувацьку кодову сторінку .
Лише ASCII

@fergusq Ви можете змішати вугілля з Turtlèd : P, вугілля насправді не є графічною мовою черепахи
лише для ASCII


12

JavaScript (ES6), 67 65 63 60 59 байт

x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
  • 2 байти, збережені заміною двох входжень x-1, першого --xі другого на x.
  • 2 байти збережено завдяки Kritixi Lithos , замінивши "\n"на `[newline]`.
  • 3 байти, збережені завдяки користувачеві2428118 , нарешті допомагають мені знайти спосіб псевдоніму таким repeatчином, що зменшив розмір. (Із почесною згадкою Марі за її старання теж)
  • 1 байт збережено опосередковано завдяки Герману.

Спробуй це

f=
x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
oninput=_=>o.innerText=f(+i.value)
o.innerText=f(i.value=3)
<input id=i min=1 type=number><pre id=o>


1
Я не зовсім впевнений, але я думаю, що ви можете замінити "\n"дві задні посилання та буквальну нову лінію між ними
Kritixi Lithos

Спасибі, @KritixiLithos; не знаю, чому я сам про це не думав раніше.
Кудлатий

1
Схоже, ви могли б, можливо, зберегти байт шляхом повторного сповіщення, наприклад, a='repeat',v=.....і` `[a]
Marie

Спасибі, @Marie; Я спробував згладжування, repeat()але перші мої спроби вийшли на 2 або 3 байти більше, тому я відмовився від нього! У мене буде інший погляд на це, коли я повернусь перед комп'ютером.
Кудлатий

2
x=>(v=(` `[r='repeat'](--x)+`+<newline>`)[r](x))+`+`[r](x*2+1)+`<newline>`+v
користувач2428118

9

MATL , 11 байт

tZv=&+g43*c

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

Пояснення на прикладі

Розглянемо n = 3.

t     % Implicitly input n. Duplicate
      % STACK: 3, 3
Zv    % Symmetric range
      % STACK: 3, [1 2 3 2 1]
=     % Equal, element-wise
      % STACK: [0 0 1 0 0]
&+    % All pair-wise additions. Gives a 2D array
      % STACK: [0 0 1 0 0;
                0 0 1 0 0;
                1 1 2 1 1;
                0 0 1 0 0;
                0 0 1 0 0]
g     % Logical: convert non-zero to one
      % STACK: [0 0 1 0 0;
                0 0 1 0 0;
                1 1 1 1 1;
                0 0 1 0 0;
                0 0 1 0 0]
43*   % Multiply by 43 (ASCII for '+'), element-wise
      % STACK: [ 0  0 43  0  0;
                 0  0 43  0  0;
                43 43 43 43 43;
                 0  0 43  0  0;
                 0  0 43  0  0]
c     % Convert to char. Char 0 is displayed as space. Implicitly display.
      % STACK: ['  +  ';
                '  +  ';
                '+++++';
                '  +  ';
                '  +  ']

8

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

Nα×+α←↑×+α‖O↘

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

Використовується інший підхід від інших відповідей Вугілля.

Пояснення

Nα                       # Take input and store it in variable α
×+α                       # α times write a +
←                         # Go left
↑×+α                      # α times write a + upwards

Тепер верхній лівий кут завершений, він буде виглядати приблизно так:

  +
  +
+++

‖O↘                      # Reflect-overlap it in a SE direction

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


Чи є у вугілля власна кодова сторінка? Багато з цих символів є багатобайтовими в UTF-8.
TRiG

@TRiG Так, так !
Kritixi Lithos

8

Мова програмування Шекспіра , 749 743 байт

N.Puck,.Page,.Ford,.Ajax,.Act I:.Scene I:.[Enter Puck and Ford]Puck:Listen to thy heart!Ford:You is the difference between a cat and I.Scene V:.[Exeunt][Enter Page and Ajax]Ajax:You is the difference between a cat and Ford.Scene X:.Page:You is the product of Puck and I.Is you as big as zero?If so,you is the sum of the sum of the sum of a big big big big big cat and a big big big cat and a big cat and a cat.If not,you big big big big big cat.Speak thy mind!Ajax:You is the sum of you and a cat.Is you as big as Ford?If not,let us return to Scene X.Page:You is the sum of a big big big cat and a big cat.Speak thy mind![Exit Page][Enter Puck]Ajax:You is the sum of you and a cat.Is you as big as Ford?If not,let us return to Scene V.[Exeunt]

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

Редагувати: відповідь зробила сумісною з офіційною реалізацією SPL - я не міг змусити її працювати раніше.

Поле 6 байтів, тому що номери сцен не повинні бути послідовними.

Пояснення :

SPL - це езоланг, створений так, щоб виглядати як п'єси Шекспіра. Позитивні іменники мають значення 1 (тут використовується кішка ), а негативні іменники - -1 (жоден не вживався, але свиня - одна з них). Прикметники модифікують константу, множивши її на 2.

N.

Все до першої крапки - це заголовок і не має значення.

Puck,.                           row counter
Page,.                           column counter
Ford,.                           input
Ajax,.                           temp

Символи є цілими змінними, кожен з них також має стек, але мені не потрібно було використовувати цю функцію.

Act I:.
Scene I:.

Дії та сцени використовуються як мітки goto

[Enter Puck and Ford]

Корисно лише, якщо на сцені одночасно стоять рівно два персонажі.

Puck:Listen to thy heart!

Читає номер і змушує Форда запам'ятати його.

Ford:You is the difference between a cat and I.

Як ви бачите, англійська мова діє в SPL. Це робить значення Пука "різним між котом і я". Але що це означає? catє позитивним іменником, так це Puck = 1 - Ford.

Scene II:.
[Exeunt]

Exeunt - це лише множина "виходу", і без аргументів означає, що всі на сцені виходять.

[Enter Page and Ajax]
Ajax:You is the difference between a cat and Ford.

Це також, Page = 1 - Fordале про це говорить інший актор, тому Iбуло б неправильно. Оскільки це цикл, я не можу просто скопіювати значення Puck.

Scene III:.
Page:You is the product of Puck and I.

Досить прямо зараз. Ajax = Puck * Page.

Is you as big as zero?

"as [adj] as" є ==оператором.

If so,you is the sum of the sum of the sum of a big big big big big cat and a big big big cat and a big cat and a cat.

Якщо Ajax == 0 ... "кішка" дорівнює 1, "велика кішка" - 2, "велика велика кішка" - 4 і так далі. Підставляючи прості константи, ми отримуємо "суму суми 32 і 8 і 2 і 1" -> "сума суми 40 і 2 і 1" -> "сума 42 і 1" -> "43", що є ASCII для +.

If not,you fat fat fat fat fat cat.

інакше це просто "жирний жир, жир, жир, кішка", тому Ajax отримує значення 32, ASCII для простору.

Speak thy mind!

Це команда для виведення символу.

Ajax:
You sum you and cat.Is you as big as Ford?If not,let us return to Scene III.

Це контурна конструкція. Збільшити сторінку і "Ви сумуєте вас і кішку" та if(Page != Ford) goto Scene III. Решта програми використовує ті самі компоненти, тож ось більш читабельна версія псевдокоду:

Сцена1:
    input = [номер введення];
    рядок = 0 - вхід + 1;
Сцена2:
    col = 0 - вхід + 1;
Сцена3:
    temp = рядок * col;
    якщо (temp == 0) {
        temp = '+';
    } else {
        temp = '';
    }

    путчар (темп);
    Сторінка = Сторінка + 1;
    if (Page! = Ford) goto Scene3;
    Аякс = 10;
    путчар (Аякс);
    Шайба = шайба + 1;
    якщо (Puck! = Ford) goto Scene2;

" If not,let us return to Scene III." -1; ламає четверту стіну: П
Якоб


6

Математика, 39 байт

Print@@@(CrossMatrix[#-1]"+"/. 0->" ")&

CrossMatrix- це вбудована, яка генерує матрицю необхідної форми з 1s замість +s та 0s замість пробілів. Якщо ми помножимо цю матрицю на "+", це замінить 1s на +s, залишаючи 0s незмінним (очевидно ... 0*x = 0і 1*x = x, правда?). Потім замінюємо нулі вручну пробілами за допомогою /. 0->" ". Нарешті, ми друкуємо кожен рядок матриці за допомогою Print@@@(...).


1
Не знав, Printчи можна так використовувати.
ngenisis

6

C, 69 байт

Не дуже цікаво ... Петлі над квадратом, роздруковуючи відповідний символ.

r,c;f(n){for(r=-n;++r<n;puts(""))for(c=-n;++c<n;putchar(r*c?32:43));}


6

GNU sed , 104 99 байт

-5 завдяки seshoumara
Включає +1 для-r

s/1//;h;:;s/(.*)1/ \12/;t;s/( *2)2(2*)/\1\n\1\2/
t;G;s/1+/&&1/;s/(.*)(\n1*)/&\n\1/;/1/!c+
y/12/++/

Здійснює введення в одинаковому режимі.

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

s/1//                    # Subtract 1 from input
h                        # Hold onto input
:                        # Start loop
s/(.*)1/ \12/            #   Remove a 1, prepend a space, and append a 2
t                        # Loop until all 1s are 2s
                         # Start Loop (uses the previous label)
s/( *2)2(2*)/\1\n\1\2/   #   Shift all but the first 2 from the last line to a new line 
                         #   E.g.  "  2"      "  2"
                         #         "  222" -> "  2"
                         #                    "  22"
t                        # Loop until all 2s are on their own line
G                        # Append a newline and input
s/1+/&&1/                # Double the number of 1s and append an extra
s/(.*)(\n1*)/&\n\1/      # Copy all of the lines with 2s to the end
/1/!c+                   # If there aren't any 1s print a '+'
y/12/++/                 # Convert all 1s and 2s to +s

+1 Ви можете зберегти 5 байт, використовуючи s/( *2)2(2*)/\1\n\1\2/та, s/(.*)(\n1*)/&\n\1/як показано тут , загальний бал 99.
seshoumara

5

Луа 113 , 90 байт

r,w,p=string.rep,io.read(),io.write;s=r(' ',w-1)p(r(s..'+'..'\n',w-1))p(r('+',w*2-1)..'\n')p(r(s..'+'..'\n',w-1))

r,w=string.rep,io.read()d=w*2-1;for a=1,d do print(a~=w and r(' ',w-1)..'+'or r('+',d))end


5

R, 54 байти

Гоління 7 байтів завдяки @Jarko Dubbeldam:

function(n){a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="x";a}

попередня відповідь:

f=function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}

1
Не потрібно називати функції, так що function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}це буде 59 байт!
JAD

1
Також байт можна зберегти за допомогоюmatrix("",y<-n*2-1,y)
JAD

1
a[n,]=a[,n]="x"також працює, економлячи ще кілька байт.
JAD

Ви можете зберегти ще 4 байти, скориставшись scan()програмою, а не функцією:n=scan();a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="+";a
rturnbull

4

PowerShell , 48 байт

param($n)($x=,(" "*--$n+"+")*$n);'+'*(1+2*$n);$x

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

Бере введення $n. Починається з побудови рядка --$nпробілів, з'єднаних з +. Це перетворюється в масив за допомогою оператора комами (щойно зменшено) $n. Цей масив зберігається в $xі інкапсульований в паренах, щоб розмістити копію на конвеєрі.

Потім робимо середній розділ, на який +рядок множимо відповідну кількість разів. Це залишилось на конвеєрі. Нарешті, ми знову поставимо $xтрубопровід.

Усі вони залишилися на конвеєрі після завершення програми, і неявна Write-Outputвставка нового елемента між елементами.


4

Perl 5 , 45 байт

44 байти коду + -pпрапор.

$_=join"+
",@%=($"x--$_)x$_,"+"x($_*2),@%,""

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


Деякі подібні (але все ж різні) підходи:

48 байт (47+ -p):

$_=join"+"x($_*2-1).$/,(~~($"x--$_."+\n")x$_)x2

50 байт (49+ -n):

$,="+"x($_*2-1).$/;print+(~~($"x--$_."+\n")x$_)x2


3

CJam , 23 байти

ri_(S*'++a\2*(*_z..e>N*

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

Пояснення

Це виглядає трохи неоптимально, але ідея полягає в накладанні наступних двох сіток:

  +
  +
  +
  +
  +



+++++

Що дає бажаний результат.

ri    e# Read input and convert to integer N.
_(    e# Duplicate and decrement.
S*    e# Get a string of N-1 spaces (indentation of the vertical bar).
'++   e# Append a + (the vertical bar).
a     e# Wrap the line in an array.
\2*(  e# Swap with the other copy of N and compute 2N-1.
*     e# Repeat the line that many times.
_z    e# Duplicate the grid and transpose it.
..e>  e# Pairwise maximum between the two grids. This superimposes them.
N*    e# Join with linefeeds.

3

CJam, 17

ri(S*_]'+*_ffe>N*

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

Пояснення:

ri(      read n, convert to int and decrement
S*       make a string of n-1 spaces
_]       duplicate it and put the 2 strings in an array
'+*_     join the strings with a '+' and duplicate the result
ffe>     for each pair of characters from the 2 (identical) strings,
          get the larger character (results in a matrix)
N*       join the rows with newlines


3

05AB1E , 15 14 12 байт

F'+}¹·<×)û.c

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

-2 завдяки Еміньї.


1
Ви могли б зробити F'+}¹·<×)û.cза 12.
Емінья

Спроба в Інтернеті - це погано - вона не посилається на поточну редакцію публікації, тому вона показує "поганий результат", який не відповідає вищевказаним тестам.
Thomas Ward

@ThomasWard: Гарний улов! Я виправив посилання.
Емінья


2

JS (ES6), 88 74 73 байт

x=>(x--,y=y=>(" ".repeat(x)+`+
`).repeat(x),y``+"+".repeat(x+x+1)+"\n"+y``)

Напевно, можна більше пограти в гольф.

Snippetify(x=>(x--,y=y=>(" ".repeat(x)+`+
`).repeat(x),y``+"+".repeat(x+x+1)+"\n"+y``))
<script src="https://programmer5000.com/snippetify.min.js"></script>
<input type = "number">
<pre data-output></pre>


1
Я не зовсім впевнений, але я думаю, що ви можете замінити "\n"дві задні посилання та буквальну нову лінію між ними
Kritixi Lithos

Тільки побачивши це рішення зараз, ти побив мене декількома хвилинами. Який тут етикет щодо подібних рішень на тій же мові, які розміщені протягом невеликого часу?
Кудлатий

2

JavaScript (ES6), 60 байт

f=
n=>(r=([s,t])=>(s=s.repeat(n-1))+t+s+`
`)([r(` +`),r(`++`)])
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

Виводить два останніх рядки. Альтернативна рецептура, також 60 байт:

n=>(r=a=>(s=a[0].repeat(n-1))+a[1]+s+`
`)([r(` +`),r(`++`)])

2

PowerShell, 48

Здається, це не коротше (і майже такий же підхід, як і інше рішення):

($a=,(' '*($n="$args"-1)+'+')*$n)
'+'+'++'*$n
$a

або

($a=(' '*($n="$args"-1)+'+
')*$n)+'++'*$n+"+
$a"


2

REXX, 81 байт

arg a
b=a*2-1
do i=1 to b
  if i=a then say copies('+',b)
  else say right('+',a)
  end

2

PHP, 68 байт

for(;$i<$c=-1+2*$m=$argn;)echo"\n".str_pad("+",$c," +"[$m==++$i],2);

83 байт

for(;$i<($c=($n=$argn)*2-1)**2;)echo$i%$c?"":"\n".!++$k," +"[$k==$n|$i++%$c==$n-1];

1
Ви можете зберегти кілька байтів, використовуючи $m=$argnта попередньо збільшуючи, $iа не збільшуючи його. Ви також можете зберегти байт, перемістивши $mпризначення від кінця та опустивши дужки.
користувач59178

@ user59178 Я не міг зрозуміти, що ти точно маєш на увазі
Jörg Hülsermann

1
for(;$i<$c=-1+2*$m=$argn;)echo"\n".str_pad("+",$c," +"[$m==++$i],2);
користувач59178

while(++$y<2*$n=$argn)echo"\n",str_pad("+",$n*2-1," +"[$y==$n],2);66 байт (і збережіть ще один за допомогою фізичної лінії)
Тит


2

Мозок-Флак , 216 + 1 = 217 байт

+1 байт від -Aпрапора

([{}]())(()()){<>(((((()()()()()){})){}()){}())<>(({}[()])<({}<(({})){({}()<(({}<<>(({}<(({})<>)>)<>)<>>)<{({}()<(((((()()){}){}){}){})>)}{}>)>)}{}>){(<{}(({}<<>({}<({}<>)>)>)<(({}){}){({}()<(({}))>)}{}>)>)}{}>)}{}{}

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

Пояснення про майбутнє

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