Thử thách này sử dụng ký tự '+'


28

Nhiệm vụ của bạn: được cung cấp một số n, tạo dấu '+' là các nký tự cách xa trung tâm của nó. Nếu điều này gây nhầm lẫn, hãy kiểm tra các trường hợp thử nghiệm.

Các phương thức nhập chuẩn: đầu ra phải là một chuỗi hoặc được in. Tiêu chuẩn áp dụng.

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

Đây là , vì vậy mã ngắn nhất sẽ thắng!


Tôi giả sử không gian dấu trên mỗi dòng được cho phép để kết quả là hình vuông, phải không?
Luis Mendo

@LuisMendo Vâng, vậy là tốt.
Đồng chí SparklePony


3
"Tạo dấu '+' cách n ký tự cách xa trung tâm của nó" - Tôi không hiểu phần này. Trung tâm nào bạn đang đề cập đến? Làm thế nào một cái gì đó có thể lập dị với chính nó? Vui lòng làm rõ.
Wossname

6
Nó sẽ ít gây nhầm lẫn hơn nếu trung tâm cách xa 0.
Ngừng làm hại Monica

Câu trả lời:


45

Than , 5 byte

P+×+N

Hãy thử trực tuyến!


22
Ngôn ngữ này là gì?
DJMcMayhem

@DJMcMayhem Về cơ bản, bạn có thể thực hiện nghệ thuật đồ họa rùa ASCII với nó. Nó có rất nhiều nội dung tiện dụng để hiển thị các loại hình dạng ASCII khác nhau (như P+= chéo).
fergusq

Là những nhân vật không phải đa nhân?
Petah

3
@Petah Char than sử dụng một bảng mã tùy chỉnh .
ASCII - chỉ

@fergusq Bạn có thể trộn Char than với Turtlèd : P, Char than không thực sự là ngôn ngữ đồ họa rùa
ASCII-chỉ


12

JavaScript (ES6), 67 65 63 60 59 byte

x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
  • 2 byte được lưu bằng cách thay thế hai lần xuất hiện x-1, lần đầu tiên --xvà lần thứ hai bằng x.
  • 2 byte được lưu nhờ Kritixi Lithos , thay thế "\n"bằng `[newline]`.
  • 3 byte được lưu nhờ user2428118 , cuối cùng giúp tôi tìm ra cách bí danh repeattheo cách giảm kích thước. (Cũng được đề cập đến Marie vì những nỗ lực của cô ấy)
  • 1 byte được lưu gián tiếp nhờ vào Herman.

Thử nó

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
Tôi không hoàn toàn chắc chắn, nhưng tôi nghĩ bạn có thể thay thế "\n"bằng hai backticks và một dòng mới theo nghĩa đen giữa chúng
Kritixi Lithos

Cảm ơn, @KritixiLithos; không biết tại sao tôi không nghĩ về điều đó sớm hơn.
Xù xì

1
Có vẻ như bạn có thể có thể lưu một byte bằng cách lặp lại bí danh, ví dụ a='repeat',v=.....` `[a]
Marie

Cảm ơn, @Marie; Tôi đã thử răng cưa repeat()nhưng vài lần thử đầu tiên của tôi xuất hiện lớn hơn 2 hoặc 3 byte nên tôi đã từ bỏ nó! Tôi sẽ có cái nhìn khác về nó khi tôi quay lại trước máy tính.
Shaggy

2
x=>(v=(` `[r='repeat'](--x)+`+<newline>`)[r](x))+`+`[r](x*2+1)+`<newline>`+v
user2428118

9

MATL , 11 byte

tZv=&+g43*c

Hãy thử trực tuyến!

Giải thích với ví dụ

Hãy xem xét 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

Than , 16 13 byte

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

Hãy thử trực tuyến!

Sử dụng một cách tiếp cận khác với câu trả lời khác của Than.

Giải trình

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

Bây giờ góc trên cùng bên trái đã hoàn tất, nó sẽ trông giống như thế này:

  +
  +
+++

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

Bước cuối cùng là chìa khóa của chương trình này, nó sử dụng phần trên cùng bên trái của dấu cộng để tạo phần còn lại của dấu cộng bằng cách phản chiếu nó theo hướng đông nam (phải và xuống).


Char than có trang mã riêng không? Nhiều trong số các ký tự đó là nhiều byte trong UTF-8.
TRiG

@TRiG Vâng, đúng vậy !
Kritixi Lithos

8

Ngôn ngữ lập trình Shakespeare , 749 743 byte

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]

Hãy thử trực tuyến!

Chỉnh sửa: làm cho câu trả lời tương thích với việc triển khai SPL chính thức - Tôi không thể làm cho nó hoạt động trước đây.

Đã đánh gôn 6 byte vì số cảnh không phải liên tiếp.

Giải thích :

SPL là một esolang được thiết kế để trông giống như vở kịch của Shakespeare. Danh từ tích cực có giá trị là 1 (ở đây mèo được sử dụng) và danh từ phủ định có giá trị -1 (không được sử dụng nhưng lợn là một trong số đó). Tính từ sửa đổi một hằng số bằng cách nhân nó với 2.

N.

Tất cả mọi thứ cho đến khi dấu chấm đầu tiên là tiêu đề và không quan trọng.

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

Các ký tự là các biến số nguyên, mỗi biến cũng có một ngăn xếp nhưng tôi không cần sử dụng tính năng đó.

Act I:.
Scene I:.

Hành vi và cảnh được sử dụng làm nhãn goto

[Enter Puck and Ford]

Nó chỉ hữu ích nếu chính xác hai nhân vật ở trên sân khấu cùng một lúc.

Puck:Listen to thy heart!

Đọc một số và làm cho Ford nhớ nó.

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

Như bạn có thể thấy Engrish có giá trị trong SPL. Điều này làm cho giá trị của Puck "khác biệt giữa một con mèo và tôi". Nhưng nó có nghĩa gì? catlà một danh từ tích cực, vì vậy nó Puck = 1 - Ford.

Scene II:.
[Exeunt]

Exe chỉ là một số nhiều của "lối ra", và không có đối số có nghĩa là tất cả mọi người trên sân khấu thoát ra.

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

Nó cũng được Page = 1 - Fordnhưng nó được nói bởi một diễn viên khác nên Isẽ sai. Vì đó là một vòng lặp, tôi không thể chỉ sao chép giá trị của Puck.

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

Khá đơn giản cho đến bây giờ. Ajax = Puck * Page.

Is you as big as zero?

"as [adj] as" là ==toán tử.

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.

Nếu Ajax == 0 ... "mèo" là 1, "mèo lớn" là 2, "mèo lớn" là 4, v.v. Sau khi thay thế các hằng số đơn giản, chúng ta nhận được "tổng của tổng của 32 và 8 và 2 và 1" -> "tổng của 40 và 2 và 1" -> "tổng của 42 và 1" -> "43", là ASCII cho +.

If not,you fat fat fat fat fat cat.

mặt khác, nó chỉ là "con mèo béo béo béo", vì vậy Ajax nhận được giá trị là 32, ASCII cho một khoảng trống.

Speak thy mind!

Đây là lệnh để xuất ra một nhân vật.

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

Đây là một cấu trúc vòng lặp. Trang tăng "Bạn tổng hợp bạn và mèo" và if(Page != Ford) goto Scene III. Phần còn lại của chương trình sử dụng các thành phần tương tự, vì vậy đây là phiên bản mã giả dễ đọc hơn:

Cảnh 1:
    đầu vào = [số đầu vào];
    hàng = 0 - đầu vào + 1;
Cảnh2:
    col = 0 - đầu vào + 1;
Cảnh 3:
    temp = hàng * col;
    if (temp == 0) {
        temp = '+';
    } khác {
        temp = '';
    }

    putar (temp);
    Trang = Trang + 1;
    if (Trang! = Ford) goto Cảnh3;
    Ajax = 10;
    putar (Ajax);
    Puck = Puck + 1;
    if (Puck! = Ford) goto Cảnh2;

" If not,let us return to Scene III." -1; phá vỡ bức tường thứ tư: P
Jakob


6

Toán học, 39 byte

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

CrossMatrixlà một tích hợp tạo ra một ma trận có hình dạng cần thiết với 1s thay vì +s và 0s thay vì khoảng trắng. Nếu chúng ta nhân ma trận đó với "+", nó sẽ thay thế 1s bằng +s trong khi 0không thay đổi s (rõ ràng ... 0*x = 01*x = x, phải không?). Sau đó, chúng tôi thay thế các số không bằng tay với không gian sử dụng /. 0->" ". Cuối cùng, chúng tôi in từng dòng của ma trận với Print@@@(...).


1
Không biết Printcó thể được sử dụng như thế.
ngenisis

6

C, 69 byte

Không thú vị lắm ... Vòng trên quảng trường, in ra ký tự phù hợp.

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 byte

-5 cảm ơn seshoumara
Bao gồm +1 cho-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/++/

Đưa đầu vào trong unary.

Hãy thử trực tuyến!

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 Bạn có thể lưu 5 byte bằng cách sử dụng s/( *2)2(2*)/\1\n\1\2/s/(.*)(\n1*)/&\n\1/như được hiển thị ở đây , với tổng số điểm là 99.
seshoumara

5

Lua 113 , 90 byte

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 byte

Cạo sạch 7 byte nhờ @Jarko Dubbeldam:

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

câu trả lời trước:

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

1
Bạn không phải đặt tên hàm, vì vậy function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}sẽ là 59 byte!
JAD

1
Ngoài ra, bạn có thể lưu một byte bằng cách sử dụngmatrix("",y<-n*2-1,y)
JAD

1
a[n,]=a[,n]="x"hoạt động quá, tiết kiệm thêm một số byte.
JAD

Bạn có thể lưu thêm 4 byte bằng cách sử dụng scan()và biến nó thành một chương trình chứ không phải là một hàm:n=scan();a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="+";a
rturnbull

4

PowerShell , 48 byte

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

Hãy thử trực tuyến!

Đưa đầu vào $n. Bắt đầu bằng cách xây dựng một chuỗi các --$nkhông gian, nối với +. Điều đó đã được chuyển đổi thành một mảng bằng cách sử dụng toán tử dấu phẩy, (mới giảm dần) $nlần. Mảng đó được lưu trữ $xvà đóng gói trong các ô để đặt một bản sao trên đường ống.

Sau đó chúng tôi thực hiện phần giữa, đó là +chuỗi nhân với số lần thích hợp. Đó là trái trên đường ống. Cuối cùng, chúng tôi đưa $xvào đường ống một lần nữa.

Tất cả những thứ còn lại trên đường ống khi hoàn thành chương trình và ẩn Write-Outputsẽ chèn một dòng mới giữa các phần tử.


4

Perl 5 , 45 byte

44 byte mã + -pcờ.

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

Hãy thử trực tuyến!


Một số cách tiếp cận tương tự (nhưng vẫn khác nhau):

48 byte (47+ -p):

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

50 byte (49+ -n):

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


3

CJam , 23 byte

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

Hãy thử trực tuyến!

Giải trình

Điều này cảm thấy một chút tối ưu, nhưng ý tưởng là để chồng lên hai lưới sau:

  +
  +
  +
  +
  +



+++++

Mà cho kết quả mong muố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 tuổi

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

Dùng thử trực tuyến

Giải trình:

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 byte

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

Hãy thử trực tuyến!

-2 cảm ơn Emigna.


1
Bạn có thể làm F'+}¹·<×)û.ccho 12.
Emigna

Liên kết thử trực tuyến của bạn rất tệ - nó không liên kết đến bản sửa đổi hiện tại của bài đăng để nó hiển thị "đầu ra xấu" không khớp với các trường hợp thử nghiệm ở trên.
Thomas Ward

@ThomasWard: Bắt tốt! Tôi đã sửa liên kết.
Emigna


2

JS (ES6), 88 74 73 byte

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

Có lẽ có thể được chơi golf nhiều hơn.

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
Tôi không hoàn toàn chắc chắn, nhưng tôi nghĩ bạn có thể thay thế "\n"bằng hai backticks và một dòng mới theo nghĩa đen giữa chúng
Kritixi Lithos

Chỉ thấy giải pháp này bây giờ, bạn đã đánh bại tôi trong vài phút. Những nghi thức xung quanh đây về các giải pháp tương tự trong cùng một ngôn ngữ được đăng trong một cửa sổ nhỏ của thời gian là gì?
Shaggy

2

JavaScript (ES6), 60 byte

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>

Đầu ra hai dòng mới. Công thức thay thế, cũng 60 byte:

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

2

PowerShell, 48

Dường như không thể rút ngắn hơn thế (và khá nhiều cách tiếp cận tương tự như giải pháp khác):

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

hoặc là

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


2

REXX, 81 byte

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 byte

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

83 byte

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

1
Bạn có thể lưu một vài byte bằng cách sử dụng $m=$argnvà tăng trước $ithay vì tăng bài. bạn cũng có thể lưu một byte bằng cách di chuyển $mphép gán vào cuối và thả dấu ngoặc.
dùng59178

@ user59178 Tôi không thể hiểu chính xác ý bạn là gì
Jörg Hülsermann

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

while(++$y<2*$n=$argn)echo"\n",str_pad("+",$n*2-1," +"[$y==$n],2);66 byte (và lưu thêm một byte với ngắt dòng vật lý)
Titus


2

Brain-Flak , 216 + 1 = 217 byte

+1 byte từ -Acờ

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

Hãy thử trực tuyến!

Giải thích sắp tới

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.