In N Bình phương


57

Viết chương trình hoặc hàm lấy số nguyên N không âm từ stdin hoặc làm đối số hàm. Nó phải in hoặc trả về một chuỗi hình vuông nghệ thuật ASCII rỗng có các cạnh được tạo bằng N bản sao của số N.

Đặc biệt:

Nếu N là 0, không có bản sao nào của N được sử dụng, do đó sẽ không có đầu ra (hoặc chỉ có một dòng mới duy nhất).

Nếu N là 1, đầu ra là:

1

Nếu N là 2:

22
22

Nếu N là 3:

333
3 3
333

Nếu N là 4:

4444
4  4
4  4
4444

Nếu N là 5:

55555
5   5
5   5
5   5
55555

Các mô hình tiếp tục cho 6thông qua 9.

Nếu N là 10, đầu ra là:

10101010101010101010
10                10
10                10
10                10
10                10
10                10
10                10
10                10
10                10
10101010101010101010

Lưu ý rằng đây không thực sự là hình vuông. Nó cao 10 hàng nhưng rộng 20 cột vì 10dài hai ký tự. Đây là dự định. Vấn đề là mỗi cạnh của "hình vuông" chứa N bản sao của N. Vì vậy, tất cả các yếu tố đầu vào bên ngoài 9về mặt kỹ thuật sẽ là hình chữ nhật ASCII.

Ví dụ: nếu N là 23, đầu ra là:

2323232323232323232323232323232323232323232323
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
23                                          23
2323232323232323232323232323232323232323232323

Dưới đây là Pastebins của kết quả đầu ra yêu cầu cho 99, 100, 111, và 123(họ có thể nhìn sai trong một trình duyệt nhưng trong một trình soạn thảo văn bản họ sẽ xem xét chính xác). Đầu ra cho 1000lớn cho Pastebin nhưng nó sẽ có 1000 hàng và 4000 cột. Các số có 4 chữ số trở lên phải hoạt động giống như các số nhỏ hơn.

Chi tiết:

  • N phải được viết bằng cách biểu diễn số thập phân thông thường, không có +dấu hoặc các chữ số khác.
  • Các khu vực rỗng chỉ phải được lấp đầy với không gian.
  • Không có dòng nên có không gian hàng đầu hoặc dấu.
  • Một dòng mới sau dòng cuối cùng của hình vuông được cho phép tùy chọn.
  • Các ngôn ngữ được viết sau khi thử thách này được thực hiện đều được chào đón, chúng chỉ không đủ điều kiện để giành chiến thắng .
  • Mã ngắn nhất tính bằng byte thắng!

18
Hình vuông cho n = 10 trông vuông hơn so với n = 5. Hoan hô, phông chữ không vuông!
nneonneo

Chúng ta có thể lấy số nguyên làm một chuỗi không?
Adám

1
@ Nᴮᶻ Có, bạn có thể
Sở thích của Calvin

Câu trả lời:


6

Jolf, 31 27 25 23 byte

?=1i1ρρ,aii+*3έέi*li

Điều này được mã hóa trong mã hóa ISO-8859-7 và chứa các dấu vết không thể in được, vì vậy đây là một hexdump:

0000000: 3f3d 3169 31f1 f12c 6169 692b 2a33 dd05  ?=1i1..,aii+*3..
0000010: dd69 052a 056c 69                        .i.*.li

Hãy thử trực tuyến fiddle này hoặc xác minh tất cả các trường hợp thử nghiệm (sử dụng nút chạy đầy đủ) .

Điều này thoát với một lỗi cho n = 0, được cho phép theo mặc định.

Rất cảm ơn Conor vì đã chơi golf 4 6! byte. inb4 gạch bỏ bốn vẫn trông giống như một bình luận bốn

Giải trình

?=1i1ρρ,aii+*3έ\x05έi\x05*\x05li

?=1i1                             if input is 1 return 1, otherwise...
       ,aii+*3έ\x05               draw an input x input hollow box of tabs
      ρ            έi             replace all tabs with input
     ρ               \x05*\x05li  replace all spaces with spaces * length of input

Làm thế nào bạn tạo ra hexdump?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Tôi đã sử dụng xxd. Bạn có thể đảo ngược nó với xxd -r.
một spaghetto

16

Shtriped , 317 byte

Trong khi tôi đang đặt câu hỏi, tôi có thể thể hiện ngôn ngữ "thuần túy" mới của mình.

@ f x
 d x
 f
 @ f x
+ x y
 +
  i x
 @ + y
 h x
} x y
 e 1
 i 1
 d y
 d 1
 d x
 } x y
e 0
e 2
i 2
i 2
e 6
+ 2 2 6
+ 2 6 6
e T
+ 2 2 T
+ 6 T T
e N
t N
e P
+ T 0 P
e L
i L
*
 e x
 *
  + P x x
 @ * T
 h x
~
 } N P 0
 d 0
 i L
 * P
 ~
~
#
 p N
-
 s 6
_
 @ - L
$
 #
 @ _ n
 #
 s 2
@ # N
e n
+ N 0 n
d n
d n
s 2
@ $ n
@ # N

(chắc chắn hoạt động trong v1.0.0 )

Không có phép toán nào được tích hợp trong Shtriped ngoại trừ tăng và giảm. Cũng không có vòng lặp hoặc điều kiện, vì vậy tất cả những điều này cần phải được xây dựng từ đầu trong mọi chương trình.

Đó là những gì chương trình của tôi không, ví dụ như @về cơ bản một là vòng lặp for, +là một hàm addition, }>=. Đầu ra thực tế chỉ được sản xuất trong 8 dòng cuối cùng của chương trình.

Không có chuỗi nào trong Shtriped. Bạn có thể lấy và in ra các chuỗi, nhưng tất cả chúng đều được biểu diễn bên trong dưới dạng các số nguyên chính xác tùy ý chỉ có thể tăng và giảm. Vì vậy, không có cách nào dễ dàng có được độ dài của chuỗi 10để điền vào trung tâm hình vuông với số lượng không gian phù hợp. Tôi đã phải kết hợp các hàm ~tính toán hiệu quả floor(log10(N)) + 1để tìm độ dài của N theo số thập phân.

Điều này có lẽ có thể được golfed hơn một chút bằng cách sắp xếp lại ở đâu và như thế nào mà biến được sử dụng, nhưng không nhiều hơn nữa. Không có xung quanh những hạn chế vốn có của Shtriped. (Dù sao nó cũng không bao giờ là ngôn ngữ chơi gôn.)

Mã nhận xét (dấu gạch chéo ngược là nhận xét):

@ f x \ function that calls f() x times, returns 0
 d x
 f
 @ f x
+ x y \ returns x + y
 +
  i x
 @ + y
 h x
} x y \ returns 1 if x >= y, else 0
 e 1
 i 1
 d y
 d 1
 d x
 } x y

\ declare and set up variables for the numbers 0, 2, 6, 10
e 0 \ 0 is used to help copy values via +
e 2 \ 2 is used for printing newlines
i 2
i 2
e 6 \ 6 is used for printing spaces
+ 2 2 6
+ 2 6 6
e T \ 10 is used for finding the string length of N
+ 2 2 T
+ 6 T T

e N \ declare N
t N \ and set it to what the user inputs

\ all the code from here to the last ~ is for finding the length of N as a string

e P \ P is the current power of 10 (10, 100, 1000...), starting with 10
+ T 0 P
e L \ L will be the length of N in decimal digits
i L

* \ function that returns P times 10 by adding P to itself 10 times
 e x
 *
  + P x x
 @ * T
 h x

~ \ function that increments L and multiplies P by 10 until N < P, at which point L will be the string length of N
 } N P 0 \ the 0 variable can be used as a dummy now since we don't need it anymore
 d 0
 i L
 * P \ multiply P by 10 to 
 ~
~

\ helper functions for displaying the output
# \ simply prints N as a decimal integer
 p N
- \ prints a single space
 s 6
_ \ prints L spaces (L = digit length of N)
 @ - L
$ \ prints one of the central N-2 lines of the square
 #
 @ _ n
 #
 s 2

\ finally, call these functions to display the output
@ # N \ print N copies of N (top line of square)
e n \ declare n and set it to N - 2
+ N 0 n
d n
d n \ if N was 0 or 1 the program will end here, having printed nothing if 0 or just the top line if 1
s 2 \ print a newline
@ $ n \ print the central line of the square N-2 times
@ # N \ print N copies of N (bottom line of square)

\ the output always prints without a trailing newline

8

Nghiêm túc, 32 31 30 29 byte

╩╜ó$╝╜Dbu╜╛*n╜¬;╛l*' *╛+╛@+n(

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

Giải trình:

╩╜ó$╝╜Dbu╜╛*n╜¬;╛l*' *╛+╛@+n(
╩                              push each input to its own register
                                 (we'll call register 0 "n")
 ╜                             push n to the stack
  ó                            terminate if 0
   $╝                          push str(n) to register 1
                                 (we'll call register 1 "s")
     ╜Dbu╜╛*n                  make min(2,n) copies of s*n (the top and bottom)
                                 (this avoids an extra copy if n is 1)
             ╜¬;               push n-2 twice
                ╛l*' *         push (n-2)*len(s) spaces
                      ╛+╛@+    put s on the front and end of the string (a middle piece)
                           n   push (n-2) total copies of the middle piece
                            (  bring the top piece to the top

5

JavaScript (ES6), 73 82 78 byte

Đã lưu a4 byte nhờ @ user81655

n=>(a=n[r='repeat'](n),n<2?a:a+`
${n+' '[r](n.length*(n-2))+n}`[r](n-2)+`
`+a)

Lấy một chuỗi, không phải là một số cho đầu vào.

Dùng thử trực tuyến (tất cả các trình duyệt hoạt động)


Bạn có thể thay thế *(n-2)bằng *~-~-nđể lưu một byte.
Neil

@ user81655 cảm ơn, đã sửa nó
Downgoat

5
@Neil cảm ơn nhưng điều đó dường như không lưu bất kỳ byte nào một cách đáng tiếc
Downgoat

Xin lỗi, tôi đã bị nhầm lẫn.
Neil

5

MATL , 34 29 26 byte

:G\2<t!+gQ"@!2GVYX1GVnZ"YX

Điều này hoạt động với bản phát hành hiện tại (13.0.0) của ngôn ngữ / trình biên dịch

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

:            % array [1,2,...,N], where N is input, taken implicitly
G\           % modulo N. Gives [1,2,...,N-1,0]
2<           % smaller than 2? Gives [1,0,...,0,1]
t!           % duplicate, transpose
+            % addition with broadcast. Gives 2D array with nonzeros in the border 
             % and zeros in the interior
gQ           % convert to logical, add 1: twos in the border, ones in the interior
"            % for each column of that array (note the array is a symmetric matrix,
             % so columns and rows are the same)
  @!         %   push column. Transpose into a row        
  2GVYX      %   replace twos by the string representation of N, via regexp
  1GVnZ"YX   %   replace ones by as many spaces as length of that string, via regexp
             % end for each, implicitly
             % display stack contents, implicitly

5

T-SQL / SQL Server 2012+, 167 161 byte

DECLARE @ INT = 6;

SELECT IIF(u IN(1,s),REPLICATE(s,s),CONCAT(s,REPLICATE(' ',s-2*LEN(s)),s))
FROM(SELECT @ s)z CROSS APPLY(SELECT TOP(s)ROW_NUMBER()OVER(ORDER BY 1/0)u FROM sys.messages)v

Đầu ra:

666666 
6    6 
6    6  
6    6  
6    6 
666666 

LiveDemo

Nhập kích thước mong muốn và nhấp Run queryđể nhận đại diện văn bản.

Xin lưu ý rằng bản demo này không hiển thị phông chữ có chiều rộng cố định . Như vậy 7là dày hơn 1.


BIÊN TẬP:

Nếu chúng ta coi đầu vào là chuỗi:

DECLARE @ VARCHAR(10) = '7';

SELECT IIF(u IN(1,s),REPLICATE(s,s),s+REPLICATE(' ',s-2*LEN(s))+s)
FROM(SELECT @ s)z CROSS APPLY(SELECT TOP(s+0)ROW_NUMBER()OVER(ORDER BY 1/0)u FROM sys.messages)v

LiveDemo2


Điều này rất hay, tôi đã học được cách rút ngắn một số kịch bản khác của mình một chút. Không biết thứ tự trước 1/0 và sys.messages
t-clausen.dk

trên một ghi chú bên. Có nên đưa vào khai báo tham số đầu vào khi đếm byte không?
t-clausen.dk

@ t-clausen.dk Tôi không chắc chắn về việc đếm quy tắc, khi SQL được áp dụng nhưng tôi sẽ hỏi về meta và cho bạn biết.
lad2025

1
Bạn có thể lưu một vài byte bằng cách tạo varar (như thế này '6'), sau đó bạn có thể thay thế concat bằng +.
t-clausen.dk

1
Có vẻ bạn đang thiếu một số không gian. Tôi tin rằng bạn có thể sửa nó bằng cách viết (s-2)
t-clausen.dk

4

Julia, 78 byte

n->(s="$n";(p=println)(s^n);[p(s*" "^(n-2)endof(s)*s)for i=2:n-1];n>1&&p(s^n))

Đây là một hàm ẩn danh chấp nhận một số nguyên và in hình chữ nhật ASCII thành STDOUT. Để gọi nó, gán nó cho một biến.

Ung dung:

function f(n)
    # Save a string version of n
    s = "$n"

    # Print the top line
    println(s^n)

    # Print each middle line
    [println(s * " "^(n-2)endof(s) * s) for i = 2:n-1]

    # Print the last line if there is one
    n > 1 && println(s^n)
end

Dùng thử trực tuyến


4

Ruby, 100 byte

->n{s="";n.times{|i|s+=(i<1||i>n-2?"#{n}"*n :"#{n}#{' '*[(n-2)*n.to_s.size,0].max}#{n}")+$/};puts s}

Quá tệ, tôi thậm chí không thể đánh bại được JS. Bất kỳ trợ giúp thêm golf xuống nó sẽ được đánh giá cao.

Đây là một phiên bản ít nhiều vô căn cứ:

def f(n)
    n.times{|num|
        if num == 0 || num == n-1
            s += "#{n}" * n
        else
            s += "#{n}"+" "*[(n-2)*n.to_s.length,0].max+"#{n}"
        end
        s += "\n"
    }
    puts s
end

1
Bạn có thể muốn gán một biến cho n.to_svì bạn sử dụng nó rất nhiều, cung cấp cho bạn m*ncho phần đầu tiên và m+" "*[(n-2)*m.length,0].max+mcho phần thứ hai.
Mực giá trị

Tôi dựa trên một phiên bản 75 byte cho câu trả lời này. (Javascript hiện ở mức 78 byte) Hãy thử trực tuyến!
benj2240


4

C ++ 14, 156 ký tự

Tôi nghĩ rằng đó là một giải pháp khá tuyệt vời mặc dù rõ ràng không thể đánh bại hầu hết các mục khác ở đây.

#define f for(i=0;i++<n;c<<t);
[](string t){auto&c=cout;int n=stoi(t),i;f c<<'\n';for(i=0;++i<n-1;c<<t,c.width(~-n*size(t)+1),c.fill(0),c<<t+'\n');if(n-1)f}

Ung dung:

#define f for ( i = 0; i++ < n; c << t ); // print top/bot row
[](string t) {
  auto& c = cout;
  int n = stoi(t), i;
  f // print first row
  c << '\n'; // kind of annoying but no way to get rid of (yes I tried
             // c << '\n'+t instead of c << t+'\n')
  for ( i = 0; ++i < n - 1; ) {
    c << t; // output the number
    // then we we get the width of necessary spaces
    c.width(~-n*size(t)+1); // Equivalent to (n-1)*size(t) + 1, but we save
                            // two bytes since ~- takes precedence over
                            // multiplication
    c.fill(0); // fill with spaces, ' ' == 0
    c << t+'\n';
   }
   if ( n-1 ) f // This if statement is dissapointing 
}

Và như mọi khi, để gọi hàm sử dụng [](string t) { ... }("10");


4

TSQL, 112 104 byte

DECLARE @ varchar(10)='12'

PRINT REPLICATE(@,@)+ISNULL('
'+REPLICATE(@+ISNULL(SPACE((@-2)*len(@))+@,'')+'
',@-2)+REPLICATE(@,@),'')
1. generating first line
2. adding hollow lines + line breaks
3. adding last line(when needed)

Bạn có thể thêm một lời giải thích cho những người trong chúng ta không biết T-SQL không?
mèo

@cat đã viết một lời giải thích ngắn, và bao gồm một câu đố
t-clausen.dk

Thật thú vị, cảm ơn! Có vẻ như số byte của bạn có thể bị tắt: kiểm tra tại đây
mèo

@cat cảm ơn. Tôi đã tìm kiếm một liên kết cho điều đó. Tuy nhiên, dòng cuối cùng với TỪ chỉ là khai báo và gán giá trị cho X, tôi nghe nói rằng việc gán giá trị và khai báo biến không được tính. Xin hãy sửa tôi nếu tôi sai. Tôi đã cố gắng lưu một vài byte với sự gán biến này. Các biến thông thường có tiền tố là @ , tốn thêm 1 byte cho mỗi lần sử dụng nó
t-clausen.dk

1
@mazzy đúng vậy - 3. thêm dòng cuối cùng (khi cần)
t-clausen.dk

3

Chồn 0,15 , 57 byte

nd?.d1-2&N.$z01FlOz2-[lz6Z" "I2-z2-*Dz6Z$O]01F.
z[z6Z]$Of

Hãy thử nó ở đây!

Giải trình

n                Read number from input
 d?.             Stop if n=0, continue otherwise
    d1-2&N.      Print 1 and stop if n=1, continue otherwise
           $z    Store top of stack in register (z, which is n)

01F                                   Gosub to second line
   lO                                 Print newline
     z2-                              Push value from register and subtract 2
        [                             Pop k and run body of for loop k times
                                      (Does not run if k <= 0)
         l                            Push a newline
          z6Z                         Push z and convert to string
             " "                      Push a space
                I2-                   Push length of stack minus 2
                   z2-                Push z minus 2
                      *               Pop b,a and push a,b
                       D              Pop k and duplicate top of stack k times
                        z6Z           Push z and convert to string
                           $O         Output whole stack as characters
                             ]        Close for loop
                              01F.    Gosub to second line and stop after returning.


z[   ]       For loop that runs z times
  z6Z        Push z and convert to string
      $O     Output whole stack as characters
        f    Return to position called from

3

Perl, 79 76 74 byte

$_=$.=pop;s/./ /g;print$.x$.,$/,($.,$_ x($.-2),$.,$/)x($.-2),$.>1?$.x$.:''

Khá đơn giản. Đối số dòng lệnh đầu tiên được lấy làm số. Đặt tập lệnh vào một tập tin và chạy với perl file.pl 1.


shiftcó thể được thay thế bằng pop.
Oleg V. Volkov

3

Perl, 62 60 58 + 2 = 60 byte

for$.(1..$_){say$.>1&$.<$_?$_.$"x(y...c*($_-2)).$_:$_ x$_}

Yêu cầu -nlEcờ:

$ perl -nlE'for$.(1..$_){say$.>1&$.<$_?$_.$"x(y...c*($_-2)).$_:$_ x$_}' <<< 5
55555
5   5
5   5
5   5
55555

Với không gian được thêm vào:

for$.(1..$_) {
  say(
    $. > 1 & $. < $_
      ? $_ . $"x(length$_*($_-2)) . $_
      : $_ x $_
  )
}

3

R, 90 byte

x=scan();m=matrix(x,x,x);k=2:(x-1)*(x>2);m[k,k]=format("",w=nchar(x));write(m,"",n=x,s="")

Điều này tạo ra một ma trận x*xkích thước và sau đó lấp đầy không gian kích thước nchar(x). Nếu xnhỏ hơn 2, thì không có gì được điền.


Tôi biết rằng đây là một năm sau, nhưng ... x=scan();m=matrix(x,x,x);m[k<--c(1,x),k]=format("",w=nchar(x));write(m,"",x,,"")ít hơn 10 byte bằng cách sử dụng lập chỉ mục âm và thay thế n=x,s=''bằng x,,'' tio.run/nexus/r#DYpBCsAgDAT/
Giuseppe

@Giuseppe Và bây giờ đối với một cái gì đó hoàn toàn không thể đọc được ... hãy lưu thêm một byte.
JayCe

write("[<-"(matrix(x<-scan(),x,x),k<--c(1,x),k,gsub("."," ",x)),1,x,,"")cho 72 byte.
J.Doe


3

Pip -l , 21 byte

Sử dụng các tính năng ngôn ngữ mới hơn câu hỏi, được phép theo chính sách hiện tại; nếu từ ngữ của câu hỏi được diễn giải để ghi đè chính sách đã nói, hãy xem câu trả lời 25 byte bên dưới.

Yq{MN++g%y>1?sMyy}MCy

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

Cảm ơn câu trả lời MATL của Luis Mendo cho (a+1)%n<2mánh khóe.

Giải trình

Yqđọc một dòng từ stdin và kéo nó vào y. Sau đó:

{              }MCy  Map this function to each coordinate pair in a y-by-y grid
                     (Inside the function, the list of both coords is g)
   ++g                Increment both coordinates
      %y              Take them mod y
 MN     >1?           Test whether the min of the resulting list is 2 or greater
           sMy         If so, it's in the center; use len(y) spaces
              y        If not, it's an edge; use the number y
                     Print result with newlines between rows (implicit, -l flag)

Câu trả lời gốc năm 2016, 25 byte ( -lcờ cộng ):

Yq{MN++*a%y<2?ysX#y}MMCGy

Thay đổi:

  • MCđã được thêm vào gần đây; tại thời điểm đó, tôi đã sử dụng MMCG(map-map + tọa độ lưới).
  • Có một lỗi trong trình thông dịch hiện tại đã ngăn không sử dụng ++trong danh sách, vì vậy tôi phải thực hiện ++*(áp dụng ++cho từng thành phần).
  • Map đã được gia hạn: bây giờ <string1> M <string2>trả về một danh sách các len(<string2>)bản sao của <string1>; tại thời điểm đó, tôi đã sử dụng sX#y, không gian lặp lại chuỗi bằng len(y).

2

Bình thường, 37 30 byte

J*K`QQI>Q1JV-Q2++Q*d-lJ*2lKQ;J

Hãy thử nó ở đây.

J*K`QQ                          set K to repr(input); that is, stringified
                                  set J to K repeated (input) times
      I>Q1                  ;   if input is greater than 1...
          J                     output J (stringified input times input)
           V-Q2                 do this (input - 2) times...
               ++               output the following on one line:
                 Q              the input number
                  *d-lJ*2lK     n spaces, where n = len(J) - 2*len(K)
                           Q    the input number again
                            ;   break out of everything
                             J  output J (str(input)*input) one last time,
                                  regardless of whether input > 1

2

Võng mạc , 90

Một lần nữa, tôi khá chắc chắn rằng điều này sẽ rất đáng chơi bởi các chuyên gia:

.+
$&$&$*:$&$*;
+`(\d+:):
$1$1
+`([\d+:]+;);
$1$1
T`d` `(?<=;\d+:)[^;]+(?=:\d+:;\d)
:

;
¶

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


1
Tôi cũng đã đăng một câu trả lời Retina , nhưng nó không nhỏ hơn nhiều. (Bạn có thể sử dụng thay vì ;để thoát khỏi giai đoạn cuối không?)
Randomra

@randomra Vâng 80 <90 vì vậy không có tranh luận từ tôi :)
Chấn thương kỹ thuật số

Và nếu bạn sử dụng pilcrow [^¶]+là handily .+.
Randomra

2

Thạch, 28 byte

Grr, không thể biết Jelly có tệ về chuỗi hay không, nếu tôi kém về Jelly.

ŒṘ©L⁶xWẋWẋ$®W¤1¦€U'Z$$4¡j⁷ȯ⁷

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


Tôi đã cố gắng để thích ứng này cho một câu trả lời, nhưng không có nhiều may mắn: /
Sp3000

2

Pyke , 33 byte (không cạnh tranh)

QD`i*Djli2*lR-k*iRi]3J"bR+2Q-*jR+

Giải trình:

                                  - autoassign Q = eval_or_not(input())
QD`i*                             - Get the input multiplied by itself
Q                                 - [Q]
 D                                - [Q, Q]
  `                               - [repr(Q), Q]
   i                              - i = stack[0]
    *                             - [stack[0]*stack[1]]

     Djli2*lR-                    - Get number of spaces
     D                            - [^,^]
      j                           - j = stack[0]
       l                          - len(stack[0])
        i2*                       - i*2
           l                      - len(stack[0])
            R                     - rotate_2()
             -                    - stack[0]-stack[1]

              k*iRi               - Get middle line
              k*                  - " "*^
                iRi               - [i,^,i]

                   ]3J"bR+        - Join middle line together
                   ]3             - list(stack[:3])
                     J"           - "".join(stack[0])
                       bR+        - ^+"\n"

                          2Q-     - Get middle lines
                          2Q-*    - Q-2

                              jR+ - Add end line
                              jR+ - ^+j

2

CJam, 27 byte

ri:X,_ff{a+[0X(]&XXs,S*?}N*

Cảm ơn @ MartinBüttner đã gợi ý ff. Các a+[0X(]&là khá tanh, nhưng oh well.

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

ri:X              Read input integer and save as variable X
,_                Range, i.e. [0 1 ... X-1] and make a copy
ff{...}           Map with extra parameter, twice. This is like doing a Cartesian product
                  between two 1D arrays, but we get a nice X by X array at the end

                  For each coordinate pair,
a+                Put the two coordinates into an array
[0X(]&            Set intersection with the array [0 X-1]
X                 Push X
Xs,S*             Push a number of spaces equal to the length of X
?                 Ternary: choose one of the previous two depending on the set intersection

N*                Join X by X array with newlines

2

Python 2, 70 ký tự

def p(i):
 k=`i`;j=i-2;h=k*i;print h+'\n'+(k+' '*j*len(k)+k+'\n')*j+h

3
Không hoạt động cho i = 1.
BookOwl

2

Haskell, 78 byte

i x=unlines$take x$1#s:3#[s++(3#s>>" ")++s]++[1#s]where s=show x;z#s=[z..x]>>s

Ví dụ sử dụng:

*Main> putStr $ i 4
4444
4  4
4  4
4444

Các chức năng >>có ích: <list> >> <string>làm cho length <list>các bản sao của <string>, ví dụ như trên và dòng dưới cùng cho x=10[1..10] >> "10"-> "10101010101010101010".



1
@MaxYekhlakov: Cảm ơn, nhưng thật không may, phiên bản của bạn không hoạt động với 1tiếng hét phát ra một tiếng 1. Ngoài ra, bạn trả về một danh sách các chuỗi, trong khi thử thách yêu cầu một chuỗi. Chúng ta đã có nhiều quy tắc IO chặt chẽ hơn trong những ngày qua, quy tắc IO linh hoạt là một điều gần đây hơn.
nimi

2

Perl, 72 byte

$_=($.=pop)-2;say for($.x$.,($..($.x$_)=~s/./ /rg.$.)x$_,$.x$.)[0..$.-1]

Dựa trên các tính năng hiện đại của Perl:

nói 'cái gì đó'

được tự động khả dụng kể từ Perl 5.10 (chỉ cần sử dụng v5.10 trở lên).

str_expr = ~ s /.../.../ r

vui vẻ chấp nhận làm việc với một giá trị (một str_expr không nhất thiết phải giảm xuống một biến vô hướng) để mang lại một esult r ( tùy chọn ' r ' ở cuối regex) mà không thay đổi str_expr ban đầu.


2

PHP, 151 byte

function s($n){for($r=0;$r<$n;$r++){for($c=0;$c<$n;$c++){if($r*$c&&$r!=$n-1&&$c!=$n-1){for($d=0;$d<=log10($n);$d++){echo' ';}}else{echo$n;}}echo"\n";}}

Hoàn toàn lộn xộn, cần thêm thời gian để tối ưu hóa. s(Number)cung cấp cho bạn đầu ra.


2

Java 8, 280 byte

interface A{static<T>void p(T o){System.out.print(o);}static void main(String[]a){long n=new Long(a[0]),l=a[0].length();for(long i=0;i<n;i++,p(a[0]));p("\n"+(n>1?a[0]:""));for(long j=2;j<n;j++,p(a[0])){for(long i=l*2;i<n*l;i++,p(' '));p(a[0]+"\n");}for(long i=1;i<n;i++)p(a[0]);}}

Nó chỉ dài khoảng 10 lần so với các câu trả lời ngắn nhất, điều này thực sự tốt cho Java!

Chạy ví dụ:

$ java A 10
10101010101010101010
10                10
10                10
10                10
10                10
10                10
10                10
10                10
10                10
10101010101010101010

2

Con trăn 3 108 96 148 byte

a=input()
b=c=int(a)-2 if a!="1" else 0
print(a*int(a))
while b:print(a+" "*int(len(a))*c+a);b-=1
if a!="1":print(a*int(a))

Ungolfed / giải thích:

number = input() # Gets a number as input
iterator = var = int(number) - 2 if number != "1" else 0 # Assigns two variables, one of them an iterator, to the number minus 2 (the amount of middle rows in the square) if the number isn't 1. If it is, it sets the vars to 0 so the while doesn't trigger.
print(number * int(number)) # Prints the top row of the square.
while iterator != 0: # Loops for the middle rows
    print(number + " " * int(len(number)) * var + number) # Prints the number, then as many spaces as needed, and the number.
    iterator -= 1 # De-increments the iterator.
if number != 1: # Makes sure the number isn't 1, because 1 should return 1.
    print(a * int(a)) # Same as the first row, it prints the bottom row.

Vì đây là câu trả lời đầu tiên của tôi , một số lời chỉ trích và / hoặc đề xuất mang tính xây dựng sẽ hữu ích!


1
Sử dụng các khoảng trắng đơn để thụt lề để cạo một số byte. Trong thực tế, toàn bộ vòng lặp của bạn có thể được nội tuyến : while b!=0:print(a+" "*int(len(a))*c+1);b-=1. Hơn nữa, while b:tương đương với while b!=0, vì vậy đó là 3 byte nữa.
Mego

Sửa lỗi: đầu vào 1 bây giờ in 1, không phải infiniteloop (trình duyệt của tôi thực sự mang lại cho tôi một số đau buồn). Điều này bây giờ mất nhiều byte hơn tho.
OldBunny2800

2

Rust, 141 137 byte

Lạm dụng một số công cụ định dạng, nếu không điều này sẽ lâu hơn rất nhiều.

|i|{let f=||{for _ in 0..i{print!("{}",i)}println!("")};f();if i>1{for _ in 0..i-2{println!("{}{0:1$}",i,i.to_string().len()*(i-1))}f()}}

Giải nén:

|i| {
    let f = || {
        for _ in 0..i {
            print!("{}",i)
        }
        println!("")
    };

    f();

    if i>1 {
        for _ in 0..i-2 {
            println!("{}{0:1$}",i,i.to_string().len()*(i-1))
        }
        f()
    }
}

Liên kết sân chơi


Điều này không hoạt động khi tôi thử nó ở đây . Làm thế nào tôi có thể kiểm tra điều này?
Rɪᴋᴇʀ

Đây là một liên kết sân chơi để bạn có thể kiểm tra nó , tôi đã sử dụng một bao đóng để bạn gán nó cho một biến trước sau đó gọi nó.
Aceeri

Ồ tuyệt. Đừng thực sự biết rỉ sét, nhưng câu trả lời tuyệt vời!
Rɪᴋᴇʀ

2

Powershell, 98 96 95 83 82 75 byte

param($n)($l="$n"*$n)
if(($m=$n-2)-ge0){,"$n$(' '*"$n".Length*$m)$n"*$m
$l}

Kịch bản thử nghiệm và giải thích:

$f = {

    param($n)
    ($l="$n"*$n)                #   let $l is a string contains N only and return this value as a first line
    $m=$n-2
    if($m-ge0){                 # if(N>1)
        $s=' '*"$n".Length*$m   #   let $s is spaces inside repeated (length of string represented of n * m)
        ,"$n$s$n"*$m            #   return $m strings contains: N, spaces and N
        $l                      #   retrun the first line again
    }

}

&$f 1
&$f 2
&$f 3
&$f 4
&$f 10

Đầu ra:

1
22
22
333
3 3
333
4444
4  4
4  4
4444
10101010101010101010
10                10
10                10
10                10
10                10
10                10
10                10
10                10
10                10
10101010101010101010
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.