이 도전은 '+'문자를 사용합니다


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 `+`.
          +
        +++++
          +
          +

이것은 이므로 가장 짧은 코드가 승리합니다!


각 줄의 후행 공백이 허용되어 결과가 정사각형이라고 가정합니다.
Luis Mendo

@LuisMendo 예, 좋습니다.
동지 SparklePony


3
"중심에서 n 문자 떨어진 '+'부호를 생성합니다."-이 부분을 이해하지 못합니다. 어떤 센터를 언급하고 있습니까? 어떻게 무언가가 편심 할 수 있습니까? 명확히하십시오.
Wossname

6
중심이 0에서 멀어지면 훨씬 덜 혼란 스러웠을 것입니다.
Monica Harming 중지

답변:


45

, 5 바이트

P+×+N

온라인으로 사용해보십시오!


22
이 언어는 무엇입니까?
DJMcMayhem

@DJMcMayhem 기본적으로 거북이 그래픽 ASCII 아트를 사용할 수 있습니다. 다른 종류의 ASCII 모양을 렌더링하기위한 많은 편리한 내장 기능이 있습니다 (예 P+: 십자가).
fergusq

멀티 바이트 문자가 아닌가?
Petah

3
@Petah Charcoal은 사용자 정의 코드 페이지를 사용합니다 .
ASCII 전용

@fergusq Charcoal을 Turtlèd 와 혼합 할 수 있습니다 : P, Charcoal은 실제로 거북이 그래픽 언어가 아닙니다
ASCII 전용


12

자바 스크립트 (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]`.
  • user2428118 덕분에 3 바이트가 절약되어 마침내 repeat크기를 줄이는 방식으로 별칭 을 지정하는 방법을 찾을 수있었습니다. ( 그녀의 노력에 대해 Marie에 대한 언급도 훌륭합니다 )
  • Herman 덕분에 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; 내가 왜 그렇게 빨리 생각하지 않았는지 모르겠다.
Shaggy

1
당신은 아마 예를 들어, 반복 앨리어싱에 의해 바이트를 저장할 수있는 것 같습니다 a='repeat',v=.....` `[a]
마리

감사합니다, @Marie; 앨리어싱을 시도 repeat()했지만 처음 몇 번의 시도가 2 또는 3 바이트 더 커져 버렸습니다. 나는 컴퓨터 앞에서 돌아올 때 그것을 다시 볼 것이다.
Shaggy

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 (여기서는 고양이 가 사용됨)이고 음의 명사는 -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가 기억하도록합니다.

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

보시다시피 Engrish는 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 ... "cat"이 1이면 "big cat"은 2이고 "big big cat"는 4입니다. 단순 상수를 대체 한 후 "32와 8과 2와 1의 합의 합"-> "40과 2와 1의 합의 합"-> "42와 1의 합"을 얻는다 -> "43", +의 ASCII입니다.

If not,you fat fat fat fat fat cat.

그렇지 않으면 그냥 "뚱뚱한 뚱뚱한 뚱뚱한 뚱뚱한 고양이"이므로 Ajax는 공간의 ASCII 인 32의 값을 얻습니다.

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;
장면 3 :
    임시 = 행 * 열;
    if (temp == 0) {
        온도 = '+';
    }그밖에{
        온도 = '';
    }

    putchar (temp);
    페이지 = 페이지 + 1;
    if (Page! = Ford) goto Scene3;
    아약스 = 10;
    putchar (아약스);
    퍽 = 퍽 + 1;
    if (Puck! = Ford) goto Scene2;

" If not,let us return to Scene III."-1; 4 번째 벽을 깨다 : P
Jakob


6

Mathematica, 39 바이트

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

CrossMatrixA는 내장되어 그와 함께 필요한 형상의 생성 행렬 1들 대신 +들과 0공백 대신이야. 이 행렬에을 곱 "+"하면 1s는 +s로 바뀌고 0s는 변경하지 않습니다 (분명히 ... 0*x = 01*x = x, 맞습니까?). 그런 다음을 사용하여 0을 공백으로 수동으로 바꿉니다 /. 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을
위해 일을 포함-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 바이트

@Jarko Dubbeldam 덕분에 7 바이트를 줄였습니다.

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

scan()함수가 아닌 프로그램 을 사용하여 프로그램을 만들어 4 바이트를 더 절약 할 수 있습니다 .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파이프 라인에 사본을 배치하기 위해 parens에 저장 되고 캡슐화됩니다.

그런 다음 +문자열에 적절한 횟수를 곱한 중간 섹션을 수행합니다 . 파이프 라인에 남아 있습니다. 마지막으로 $x파이프 라인을 다시 장착했습니다.

그것들은 모두 프로그램 완료시 파이프 라인에 남아 있으며 암시 적 Write-Output요소 사이에 줄 바꿈을 삽입합니다.


4

펄 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

온라인으로 사용해보십시오!

Emigna에게 -2 감사합니다.


1
당신은 F'+}¹·<×)û.c12에 대해 할 수 있습니다.
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"두 개의 백틱과 그 사이에 문자 그대로의 줄 바꿈으로 바꿀 수 있다고 생각 합니다.
Kritixi Lithos

지금이 솔루션 만보고 ​​몇 분만 나를 이겼습니다. 작은 시간 내에 게시 된 동일한 언어의 유사한 솔루션에 대한 에티켓은 무엇입니까?
Shaggy

2

자바 스크립트 (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 April

@ user59178 나는 당신이 정확히 무슨 뜻인지 이해할 수 없었습니다
Jörg Hülsermann

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

while(++$y<2*$n=$argn)echo"\n",str_pad("+",$n*2-1," +"[$y==$n],2);66 바이트 (물리적 줄 바꿈으로 하나 더 저장)
Titus


2

Brain-Flak , 216 + 1 = 217 바이트

-A플래그 에서 +1 바이트

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

온라인으로 사용해보십시오!

올 설명

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.