В этом вызове используется символ «+»


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 от самого себя.
Стоп Harm Monica

Ответы:


45

22
Что вообще это за язык?
DJMcMayhem

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

Это не многобайтовые символы?
Петах


@fergusq Возможно, вы смешиваете Charcoal с Turtlèd : P, Charcoal на самом деле не является языком графики для черепах
только для 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]`.
  • Благодаря пользователю 2428118 удалось сэкономить 3 байта , что помогло мне найти способ создать псевдоним 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"двумя пробелами и буквальным
переводом

Спасибо, @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
user2428118

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


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 - esolang, разработанный, чтобы быть похожим на пьесы Шекспира. Положительные существительные имеют значение 1 (здесь используется cat ), а отрицательные существительные имеют значение -1 (ни один не использовался, но свинья - одна из них). Прилагательные изменяют константу, умножая ее на 2.

N.

Все до первой точки является названием и не имеет значения.

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

Символы являются целочисленными переменными, у каждого из них также есть стек, но мне не нужно было использовать эту функцию.

Act I:.
Scene I:.

Акты и сцены используются в качестве меток

[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:
    вход = [номер входа];
    строка = 0 - вход + 1;
СЦЕНЫ2:
    col = 0 - вход + 1;
SCENE3:
    temp = row * col;
    if (temp == 0) {
        temp = '+';
    } Еще {
        temp = '';
    }

    putchar (температура);
    Страница = Страница + 1;
    if (Page! = Ford) перейти к Scene3;
    Аякс = 10;
    putchar (Аякс);
    Шайба = шайба + 1;
    if (Puck! = Ford) перейти к сцене 2;

" If not,let us return to Scene III." -1; разбивает четвертую стену: P
Якоб


6

Mathematica, 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 благодаря сешумаре
Включает +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.
Emigna

Ваша ссылка "Попробовать онлайн" плохая - она ​​не ссылается на текущую редакцию поста, поэтому показывает "плохой вывод", который не соответствует тестовым примерам выше.
Томас Уорд

@ThomasWard: Хороший улов! Я исправил ссылку.
Emigna


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"двумя пробелами и буквальным
переводом

Только увидев это решение сейчас, ты избил меня на несколько минут. Каков здесь этикет подобных решений на том же языке, которые публикуются в течение небольшого промежутка времени?
Лохматый

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назначение на конец и опустив скобки.
user59178

@ user59178 Я не мог понять, что именно вы имеете в виду
Йорг Хюльсерманн

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

while(++$y<2*$n=$argn)echo"\n",str_pad("+",$n*2-1," +"[$y==$n],2);66 байт (и сохранить еще один с физическим разрывом строки)
Титус


2

Brain-Flak , 216 + 1 = 217 байт

+1 байт от -Aфлага

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

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

Объяснение приехать

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.