Vẽ một hình vuông rỗng # với chiều rộng cho trước


21

Tôi đã nhận được thử thách này từ Codingame và tò mò về các giải pháp tốt hơn của tôi:

Cho chiều rộng thông qua đầu vào tiêu chuẩn, vẽ một hình vuông rỗng '#' theo chiều rộng và chiều dài cho trước.

Thí dụ:

5 kết quả trong

#####
#   #
#   #
#   #
#####

Tôi đã sử dụng python để giải quyết điều này vì vậy tôi đặc biệt quan tâm đến mã python khác. Nhưng xin vui lòng gửi giải pháp của bạn bằng bất kỳ ngôn ngữ nào bạn muốn.


7
Nếu đầu vào là 0 hoặc 1 thì sao?
Karl Napf 7/11/2016

8
Liên quan , mặc dù điều này có thể đủ khác để không bị lừa.
admBorkBork

3
Chào mừng đến với PPCG! Đối với các câu hỏi trong tương lai, tôi khuyến khích bạn sử dụng Sandbox nơi bạn có thể nhận được phản hồi có ý nghĩa về một thách thức trước khi đăng nó lên trang chính.
admBorkBork

4
Đọc qua các câu trả lời, tôi không tin đó là một bản dupe. Hầu hết các câu trả lời ở đây (chơi golf và ngôn ngữ thông thường) có kích thước chỉ bằng một nửa câu trả lời trên "Print N Squared".
admBorkBork

1
Đây hoàn toàn là một bản sao. Các giải pháp từ thách thức khác có thể được sửa đổi một cách tầm thường để có giá trị và cạnh tranh ở đây.
Mego

Câu trả lời:



12

Than , 6 byte

Mã số:

NβBββ#

Giải trình:

Nβ        # Get input from the command line and store into β
   B      # Draw a hollow box with...
     β     #  Width β
      β    #  Height β
       #   #  Filled with the character '#'
           # Implicitly output the box

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


1
Tôi đã cố gắng tìm ra cách đọc đầu vào trong Than. Bây giờ tôi đã biết :)
Emigna

1
@Emigna Lưu ý rằng cũng có thể được sử dụng trong một biểu thức, như int(input())trong Python. Nếu thử thách này là "vẽ một hình chữ nhật rỗng với chiều rộng và chiều cao cho trước", thì giải pháp có thể là BNN#.
DLosc

Than có sử dụng bộ ký tự không UTF8 không?
OldBunny2800

Trông giống như 6 ký tự, không phải 6 byte. có rất nhiều bộ ký tự 8 bit xen kẽ, nhưng tôi nghi ngờ về (không phải là N)
Sparr

3
@Sparr Char than sử dụng codepage của riêng mình.
Conor O'Brien

8

MATL , 12 byte

:G\1>&*~35*c

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

Giải trình

:     % Input n implicitly. Push range [1 2 ... n]
      % STACK: [1 2 3 4 5]
G     % Push n again
      % STACK: [1 2 3 4 5], 5
\     % Modulo
      % STACK: [1 2 3 4 0]
1>    % Does each entry exceed 1?
      % STACK: [0 1 1 1 0]
&*    % Matrix with all pair-wise products
      % STACK: [0 0 0 0 0;
                0 1 1 1 0;
                0 1 1 1 0;
                0 1 1 1 0;
                0 0 0 0 0]
~     % Negate
      % STACK: [1 1 1 1 1;
                1 0 0 0 1;
                1 0 0 0 1;
                1 0 0 0 1;
                1 1 1 1 1]
35*   % Multiply by 35
      % STACK: [35 35 35 35 35;
                35  0  0  0 35;
                35  0  0  0 35;
                35  0  0  0 35;
                35 35 35 35 35]
c     % Convert to char. 0 is interpreted as space. Display implicitly
      % STACK: ['#####';
                '#   #';
                '#   #';
                '#   #';
                '#####']

6

Jolf, 8 byte

,ajj"###
,ajj      draw a box with height (input) and width (input)
    "###  with a hash border

Công cụ phù hợp cho công việc :)
Emigna

Vì tò mò, tại sao ba #yêu cầu?
Kevin Cruijssen

3
@KevinCruijssen Mỗi chỉ định các thanh chống ngang, thanh chống dọc và các mảnh góc.
Conor O'Brien

6

Python 2, 62 54 byte

f=lambda n:'#'*n+'\n#%s#'%(' '*(n-2))*(n-2)+'\n'+'#'*n

Trả về #\n#khi đầu vào là1

Phiên bản 55 byte in

def f(n):a=n-2;print'#'*n,'\n#%s#'%(' '*a)*a,'\n'+'#'*n

Phiên bản 62 byte hoạt động cho mọi đầu vào:

f=lambda n:'#'*n+'\n#%s#'%(' '*(n-2))*(n-2)+('\n'+'#'*n)*(n>1)

2
Bạn không cần phải nói f=trừ khi bạn sử dụng nó.
Daniel

@Dopapp Tôi biết, nhưng tôi nghĩ nó công bằng hơn theo cách đó (so với các chức năng / chương trình đầy đủ)
Rod

@Rod Sự lựa chọn của bạn, nhưng chúng tôi có chính sách về các chức năng ẩn danh cho phép chúng.
Erik the Outgolfer 8/11/2016

5

COW , 426 405 348 330 byte

MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOMoOMoOMoOMoOMoOMoO
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOmoOoomMMM
moOMMMMOOmOomOoMoomoOmoOMOomoomOoMMMmoOMMMMOoMOoMOOmOomOomOomOoMoo
moOmoOMoomoOMMMmoOmoOMMMMOoMOoMOOmOomOomOomOoMoomoOmoOmoOmoOMOomoo
mOomOomOoMoomoOmoOMOomoomOomOomOomOoMoomoOmoOmoOMOOmOoMoomoOMOomoo

Hãy thử trực tuyến! Thay đổi số trong dòng thứ hai thành bất kỳ số nào để thay đổi đầu ra.

Trình thông dịch COW mà tôi đang sử dụng ở đây được viết bằng Perl (và mới hơn thử thách này), nhưng bạn vẫn có thể nhận được kết quả tương tự bằng cách nhập mã vào đây .

Giải trình

; Note: [n] means "value stored in the nth block of memory".
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoO                                                  ;Stores 10 in [0].  10 is the code point for carriage return
MMMmoOMMMMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoO     ;Stores 32 in [1].  32 is the code point for whitespace
MMMmoOMMMMoOMoOMoO                                                              ;Stores 35 in [2].  35 is the code point for #
moOoom                                                                          ;Reads STDIN for an integer, and stores it in [3]
MMMmoOMMM                                                                       ;Copies [3] into [4] 
MOO                                                                             ;Loop as long as [4] is non-zero
    mOomOoMoo                                                                   ;Navigate to [2] and print the character with that code point
    moOmoOMOo                                                                   ;Navigate to [4] and decrement
moo                                                                             ;End loop
mOoMMMmoOMMMMOoMOo                                                              ;Copy [3] into [4] and decrement [4] twice
MOO                                                                             ;Loop as long as [4] is non-zero
    mOomOomOomOoMoo                                                             ;Navigate to [0] and print the character with that code point
    moOmoOMoo                                                                   ;Navigate to [2] and print the character with that code point
    moOMMMmoOmoOMMMMOoMOo                                                       ;Navigate to [3] and copy it into [5], then decrement [5] twice
    MOO                                                                         ;Loop as long as [5] is non-zero
        mOomOomOomOoMoo                                                         ;Navigate to [1] and print the character with that code point
        moOmoOmoOmoOMOo                                                         ;Navigate to [5] and decrement
    moo                                                                         ;End loop
    mOomOomOoMoo                                                                ;Navigate to [2] and print the character with that code point
    moOmoOMOo                                                                   ;Navigate to [4] and decrement
moo                                                                             ;End loop
mOomOomOomOoMoo                                                                 ;Navigate to [0] and print the character with that code point
moOmoOmoO                                                                       ;Navigate to [3]
MOO                                                                             ;Loop as long as [3] is non-zero
    mOoMoo                                                                      ;Navigate to [2] and print the character with that code point
    moOMOo                                                                      ;Navigate to [3] and decrement
moo                                                                             ;End loop

4

Python 2, 59 58 byte

n=i=input()
while i:print'#%s#'%((' #'[i%n<2])*(n-2));i-=1

thay thế

Lưu ý: Một đầu vào 1tạo ra một đầu ra là ##, nhưng một hình vuông rỗng sẽ không bao giờ được tạo ra cho đầu vào nhỏ hơn 3, vì vậy tôi đoán điều này là tốt.


4

Java 7, 113 112 110 byte

String c(int n){String r="";for(int i=n,j;i-->0;r+="\n")for(j=0;j<n;r+=i*j<1|n-i<2|n-j++<2?"#":" ");return r;}

Lưu 1 byte nhờ @ OlivierGrégoire ;
Lưu 2 byte nhờ @cliffroot .

Giải pháp được tạo ra dựa trên câu trả lời của tôi Tạo một Crossed Square .

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


1
Bạn có thể cạo một byte bằng cách làm như sau for(int i=n,j;i-->0;r+="\n")? Vì chúng ta không quan tâm đâu là điểm mấu chốt hay điểm mấu chốt, nên sẽ không có ý nghĩa gì để giữ trật tự đó, phải không?
Olivier Grégoire

1
@ OlivierGrégoire Cảm ơn! Tôi cũng đã chỉnh sửa nó trong câu trả lời của tôi Tạo một Crossed Square , vì điều đó cũng có thể được thực hiện.
Kevin Cruijssen

4

PowerShell v2 +, 48 47 byte

param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z

-1 byte nhờ JohnLBevan

Lấy đầu vào $n, đặt $zlàm $ndấu băm, với $nphần giảm dần. Đóng gói rằng trong parens để đặt một bản sao trên đường ống. Sau đó, sử dụng toán tử dấu phẩy để tạo ra một loạt các $ndòng giảm dần của #, khoảng trắng , #. Những người còn lại trên đường ống. Sau đó đặt $zlại trên đường ống. Đầu ra thông qua ẩn Write-Outputở cuối giới thiệu một dòng mới giữa các yếu tố, vì vậy chúng tôi nhận được miễn phí.

mã của OP không hoạt động cho đầu vàon <= 1 , tôi cũng cho rằng điều đó có nghĩa là chúng tôi cũng không cần hỗ trợ đầu vào 1.

Ví dụ

PS C:\Tools\Scripts\golfing> 2..6|%{"$_";.\draw-a-hollow-square.ps1 $_;""}
2
##
##

3
###
# #
###

4
####
#  #
#  #
####

5
#####
#   #
#   #
#   #
#####

6
######
#    #
#    #
#    #
#    #
######

Bạn có thể loại bỏ một byte khác:param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z
JohnLBevan 8/11/2016

1
@JohnLBevan Ý tưởng hay với khối kịch bản. Cảm ơn!
admBorkBork

3

C, 98 byte

f(n,i){i=n*(n+1);while(i--){putchar(i%(n+1)==n?10:i<n||i>n*n-1||i%(n+1)==0||i%(n+1)==n-1?35:32);}}

Sử dụng:

f(5)


3

WinDbg, 206 200 182 170 byte

.if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}

-6 byte từ việc loại bỏ parens khỏi .ifvà sử dụng jthay vì thứ hai.if

-18 byte bằng cách sử dụng fthay vì a .forđể xây dựng chuỗi.

-12 byte bằng cách không kết thúc chuỗi NULL, thay vào đó chuyển chiều dài cho da

Đầu vào được truyền qua thanh ghi giả $t0(ví dụ r $t0 = 5; {above-code}).

Giải trình:

.if @$t0                                                *Verify width($t0) at least 1 
{                                                       *(registers have unsigned values) 
    r $t3 = 2000000;                                    *Set $t3 to address where the 
                                                        *string will be constructed
    f @$t3 L@$t0 23;                                    *Put width($t0) '#' at 2000000($t3)
    f 2 * @$t3 L@$t0 20;                                *Put width($t0) ' ' at 4000000(2*$t3)
    eb 2 * @$t3 23;                                     *Put '#' on left of ' ' string
    eb 2 * @$t3 + @$t0 - 1 23;                          *Put '#' on right of ' ' string
    da @$t3 L@$t0;                                      *Print the top of the box
    j 1 < @$t0                                          *If width($t1) at least 2
    '
        .for (r $t1 = @$t0 - 2; @$t1; r $t1 = @$t1 - 1) *Loop width($t0)-2 times to...
        {
            da 2 * @$t3 L@$t0                           *...print the sides of the box
        };
        da @$t3 L@$t0                                   *Print the bottom of the box
    '
}

Đầu ra mẫu:

0:000> r$t0=0
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}

0:000> r$t0=1
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
Filled 0x1 bytes
Filled 0x1 bytes
02000000  "#"

0:000> r$t0=2
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
Filled 0x2 bytes
Filled 0x2 bytes
02000000  "##"
02000000  "##"

0:000> r$t0=5
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
Filled 0x5 bytes
Filled 0x5 bytes
02000000  "#####"
04000000  "#   #"
04000000  "#   #"
04000000  "#   #"
02000000  "#####"

3

JavaScript, 61 58 byte

Đã lưu 3 byte nhờ @lmis !

n=>(b='#'[r='repeat'](n))+`
#${' '[r](n-=2)}#`[r](n)+`
`+b

(Không xử lý 0hoặc1 )

Đối với 13 byte bổ sung (ở mức 71 byte ), bạn có thể!

n=>n?n-1?(b='#'[r='repeat'](n))+`
#${' '[r](n-=2)}#`[r](n)+`
`+b:'#':''

Các giải pháp này khá đơn giản: chúng thực hiện rất nhiều lưu trữ để không lặp lại để tiết kiệm một vài byte. Chưa hoàn thành mà không có sự biến đổi, nó sẽ trông như sau:

n => // Anonymous function definition (Param `n` is the size)
    '#'.repeat(n) +      // # `n` times to form the top
    `
#${' '.repeat(n - 2)}#`  // Followed by a newline followed by a hash and `n` - 2 spaces and
                         // another hash to make one of the middle lines
    .repeat(n - 2) +     // The above middle lines repeated `n` - 2 times
    '#'.repeat(n)        // Followed by the top line again

Thử nó!

<script type="text/babel">var f=n=>n?n-1?(b='#'[r='repeat'](n))+`\n#${' '[r](n-=2)}#`[r](n)+`\n`+b:'#':'',b,r;function c(){document.getElementById('pre').textContent = f(+document.getElementById('input').value);}</script><input id="input" onkeydown="c();" onkeyup="c();" onchange="c();" onclick="c();" placeholder="Size"><pre id="pre"></pre>


Bằng cách thêm !n?'':n==1?'#':, thêm 15 byte ở đầu thân hàm, bạn có thể xử lý các đầu vào 01.
Kayla

1
n=>(b='#'[r='repeat'](n))và sau đó, #${" "[r](n-=2)}vv giúp bạn tiết kiệm 3 byte bằng cách tránh lặp lại repeat:)
Lmis

2

Python, 109 byte

n=int(input())
for x in range(n):
 r=list(' '*n);r[0]=r[-1]='#'
 if x%(n-1)==0:r='#'*n
 print("".join(r))

1
Bạn có thể thay thế list(' '*n)bằng [' ']*n. Bạn cũng có thể thay thế x%(n-1)bằngx%~-n
Wheat Wizard

đồng thời, nếu bạn biến forkhối thành một sự hiểu biết danh sách, bạn có thể tiết kiệm hơn 20 byte
Rod

Ngoài ra, chuyển sang Python 2, thả int()và dấu ngoặc xung quanh print.
Artyer

Sử dụng <1thay vì ==0.
mbomb007

2

Ruby, 39 byte

->n{puts a=?#*n,[?#+' '*(n-=2)+?#]*n,a}

Hóa ra là ngắn hơn theo cách này hơn tất cả những thứ ưa thích mà tôi đang cố gắng. Xin lưu ý rằng điều này hoàn toàn không xử lý 0 hoặc 1.


2

Python 2, 50 byte

m=input()-2
for c in'#'+' '*m+'#':print'#'+m*c+'#'

Hoạt động cho n>=2. In mỗi dòng bằng dấu thăng,n-2 thích hợp, sau đó ký hiệu bảng khác.

Bí danh biểu tượng pound cho cùng chiều dài:

m=input()-2;p='#'
for c in p+' '*m+p:print p+m*c+p

Những nỗ lực khác:

lambda n:'#'*n+('\n#'+' '*(n-2)+'#')*(n-2)+'\n'+'#'*n

lambda n:'#'*n+'\n#%s#'%((n-2)*' ')*(n-2)+'\n'+'#'*n

lambda n:'\n'.join(['#'*n]+['#'+' '*(n-2)+'#']*(n-2)+['#'*n])

n=input();s='#'+' '*(n-2)+'#'
for c in s:print[s,'#'*n][c>' ']

s='##'+' #'*(input()-2)+'##'
for c in s[::2]:print s[c>' '::2]

s='#'+' '*(input()-2)+'#'
for c in s:print s.replace(' ',c)

2

Haskell, 49 byte

n%b='#':(b<$[3..n])++"#\n"
f n=(n%)=<<init(n%' ')

Hoạt động cho n>=2. Xác định hoạt động của việc kẹp một ký tự giữa #cho một nchuỗi kết thúc dòng mới -character, sau đó áp dụng nó hai lần để tạo lưới 2D.

Gọi như:

*Main> putStrLn$ f 5
#####
#   #
#   #
#   #
#####

2

C, 83 82 80 78 77 byte

i,j;f(n){for(i=n;i--;puts(""))for(j=n;j--;putchar(i*j&&i^n-1&&j^n-1?32:35));}

Lén trong một bội số và lưu một byte ...

i,j;f(n){for(i=n;i--;puts(""))for(j=n;j--;putchar(i&&j&&i^n-1&&j^n-1?32:35));}

Đồng thời đếm ngược j và lưu thêm một vài ...

i,j;f(n){for(i=n;i--;puts(""))for(j=0;j++<n;putchar(i&&j^1&&i^n-1&&j^n?32:35));}

Đếm ngược i từ n xuống 0 và lưu một vài byte ...

i,j;f(n){for(i=0;i++<n;puts(""))for(j=0;j++<n;putchar(i^1&&j^1&&i^n&&j^n?32:35));}

Dễ hiểu hơn một chút và thêm 1 byte

i,j;f(n){for(i=0;i++<n;puts(""))for(j=0;j++<n;putchar(i==1|i==n|j==1|j==n?35:32));}

Bạn có cần &&thay vì &?
corvus_192

Vâng, nó cần phải hợp lý &. Tôi có thể sử dụng nhân nhưng nó đòi hỏi quá nhiều ngoặc ...
cleblanc


1

PHP, 81 69 byte

for($n=-1+$i=$argv[1];$i--;)echo str_pad("#",$n," #"[$i%$n<1]),"#\n";

Chạy với -r ; cung cấp đầu vào như là đối số.

Ném a DivisionByZeroErrorcho đầu vào = 1.


1

R, 68 70 byte

Hoạt động cho n> 1. Cảm ơn @Billywob cho một vài byte hoán đổi mảng cho ma trận.

cat(rbind(b<-'#',cbind(b,matrix(' ',n<-scan()-2,n),b),b,'
'),sep='')

Sử dụng rbind và cbind để đặt các hàng và cột #xung quanh một ma trận vuông không gian n-2. Dòng mới được ràng buộc với các hàng là tốt. Các dòng mới trong nguồn là đáng kể. Đầu vào là từ STDIN


Tốt đẹp! Tôi không có ý tưởng rằng một dòng mới trong một chuỗi ngầm thêm vào \n. Bạn có thể lưu hai byte bằng cách sử dụng matrixthay vì arraymặc dù.
Billywob

1

Lisp thông thường, 150 130 byte

-20 cảm ơn @Cyoce và @AlexL.

(defun s(v)(format t"~v,,,vA~%"v #\# #\#)(dotimes(h(- v 2))(format t"~v,,,vA~A~%"(- v 1)#\  #\# #\#))(format t"~v,,,vA"v #\# #\#))

Sử dụng:

* (s 5)
#####
#   #
#   #
#   #
#####

Về cơ bản sử dụng formathai lần cho đỉnh và đáy và một vòng lặp cho các hàng ở giữa. Cuộc gọi định dạng cho đầu trên và dưới tạo ra một dòng bắt đầu bằng #và được đệm theo chiều rộng thích hợp với #s. Cuộc gọi định dạng cho các hàng ở giữa hoạt động tương tự nhau, ngoại trừ phần đệm là khoảng trắng và# được in ở cuối dòng.

Lưu ý: Tôi còn khá mới mẻ với Lisp và hy vọng sẽ có nhiều cơ hội để cải thiện vấn đề này.


Tại sao không đặt tên cho nó s? Hay là chức năng ẩn danh?
Cyoce

Tôi không biết Lisp, nhưng tất cả các khoảng trống giữa một từ và dấu ngoặc mở có đúng không? Giống như, nó phải dotimes (h (- v 2))hoặc có thể được dotimes(h(- v 2))?
HyperNeutrino

@AlexL. Vâng, có rất nhiều cơ hội để cải thiện ở đây. Một tấn khoảng trắng có thể được loại bỏ giữa dấu ngoặc đơn và các ký hiệu khác. Tôi sẽ làm điều đó thật nhanh chóng
nhân tạo

0

Haskell, 67 byte

l#n=l<$[1..n]
f n=unlines$'#'#n:('#':' '#(n-2)++"#")#(n-2)++['#'#n]

Ví dụ sử dụng:

Prelude> putStrLn $ f 4
####
#  #
#  #
####

Làm thế nào nó hoạt động:

l#n=l<$[1..n]                      -- helper function that makes n copies of l

   '#'#n                           -- make a string of n copies of #, followed by
                        #(n-2)     -- n-2 copies of
     '#':' '#(n-2)++"#"            -- # followed by n-2 times spaces, followed by #
                           ['#'#n] -- and a final string with n copies of #
unlines                            -- join with newlines in-between

0

Thạch , 13, byte

,þ%µỊṀ€€ị⁾# Y

Dùng thử trực tuyến! hoặc thử 0 đến 15

Làm sao?

,þ%µỊṀ€€ị⁾# Y - Main link: n
 þ            - outer product with
,             -    pair:   [[[1,1],[2,1],...,[n,1]],[[1,2],[2,2],...,[n,2]], ... ,[[1,n],[2,n],...,[n,n]]]
  %           - mod n:     [[[1,1],[2,1],...,[0,1]],[[1,2],[2,2],...,[0,2]], ... ,[[1,0],[2,0],...,[0,0]]]
   µ          - monadic chain separation
    Ị         - abs(z)<=1: [[[1,1],[0,1],...,[1,1]],[[1,0],[0,0],...,[1,0]], ... ,[[1,1],[0,1],...,[1,1]]]
      €€      - for each for each
     Ṁ        - maximum:   [[1,    1,    ...,1],    [1,    0,    ..., 1],    ... ,[1,    1,    ..., 1]   ]
        ị     - index into (1 based)
         ⁾#   - "# ":      ["##...#","# ...#", ...,"##...#"]
           Y  - join with line feeds

0

Pip , 16 byte

15 byte mã, +1 cho -ncờ.

(Y_Xa-2WR'#s)My

Hoạt động cho đầu vào> = 2. Hãy thử trực tuyến!

Giải thích về phiên bản hơi vô căn cứ

Đầu tiên, chúng tôi xác định một hàm ylấy một đối số chuỗi, lặp lại a-2lần đó (trong đó alà đầu vào dòng lệnh đầu tiên) và bao bọc kết quả #.

Y _ X a-2 WR '#
  _              Identity function
    X a-2        String-repeated by a-2
          WR '#  Wrapped in #
Y                Yank the resulting function into y

Tiếp theo, chúng tôi áp dụng chức năng này hai lần - một lần bình thường, sau đó một lần nữa với bản đồ - để lấy ô vuông dưới dạng danh sách các chuỗi:

y M (y s)
    (y s)  Call function y with s (preinitialized to " ") as argument
y M        Map y to each character of the resulting string

Đối với đầu vào 4, (y s)kết quả trong "# #"y M (y s)trong ["####"; "# #"; "# #"; "####"]. Giá trị sau này sau đó được in, với -ncờ làm cho nó được phân tách dòng mới.

Thủ thuật đánh gôn

Để chuyển từ phiên bản chưa chơi sang phiên bản chơi gôn:

  • Xóa khoảng trống.
  • Ylà một toán tử, có nghĩa là chúng ta có thể sử dụng nó trong một biểu thức. Thay vì Y...theo sau (ys), chúng ta chỉ có thể làm(Y...s) .
  • Vấn đề là, chúng ta phải kéo hàm trước khi chúng ta tham chiếu lại nó như y; vì vậy yM(Y_Xa-2WR'#s)sẽ không làm việc. Giải pháp: hoán đổi toán hạng của toán Mtử ap. Miễn là một trong số chúng là một chức năng và loại kia là một loại có thể lặp lại, thì việc chúng đến theo thứ tự nào không quan trọng.

0

Vợt 113 byte

(let*((d display)(g(λ()(for((i n))(d"#")))))(g)(d"\n")(for((i(- n 2)))(d"#")(for((i(- n 2)))(d" "))(d"#\n"))(g))

Ung dung:

(define (f n)
  (let* ((d display)
         (g (λ () 
              (for ((i n))
                (d "#"))
              (d "\n"))))
    (g)
    (for ((i (- n 2)))
      (d "#")
      (for ((i (- n 2)))
        (d " ") )
      (d "#\n"))
    (g)))

Kiểm tra:

(f 5)

Đầu ra:

#####
#   #
#   #
#   #
#####

0

SpecBAS - 57 byte

1 INPUT n: a$="#"*n,n-=2,b$="#"+" "*n+"#"#13: ?a$'b$*n;a$

?là viết tắt của PRINT, #13là sự trở lại vận chuyển có thể được giải quyết đến cuối chuỗi mà không cần phải +tham gia với họ.

Dấu nháy đơn di chuyển con trỏ in xuống một dòng.


0

Bị kẹt, 29 27 byte

Khá dài cho một ngôn ngữ "chơi gôn", nhưng tôi đã quên mất nó hoạt động như thế nào: P

i_2-_u'#*N+_'#' u*'#N+++u*u

Giải trình:

i_2-_u                           # take input and triplicate, subtracting 2 (5 -> [3,3,5])
      '#*N+_                     # create the top and bottom rows
            '#' u*'#N+++u*       # create input - 2 copies of middle rows
                          u      # rotate left 1 to get correct order, implicit output

0

C #, 154 152 byte

Chơi gôn

void F(int n){Console.Write($"{new string('#',n)}\n");for(int i=2;i<n;i++)Console.Write($"#{new string(' ',n-2)}#\n");Console.Write(new string('#',n));}

Ung dung:

    void F(int n)
    {
        Console.Write($"{new string('#', n)}\n");

        for (int i = 2; i < n; i++)
            Console.Write($"#{new string(' ', n - 2)}#\n");

        Console.Write(new string('#', n));
    }

EDIT1: Tối ưu hóa phạm vi vòng lặp.


0

Tiếng Litva , 117 byte

Dòng chia làm hai để dễ đọc:

#N::((var X (repeat "#" N))(print X)(each (seq 3 N) (scope #X::((print (+ "#" 
     (repeat " " (- N 2)) "#")))))(print X))

Sử dụng mẫu:

% square.lithp
(
    (import "lists")
    (def s #N::((var X (repeat "#" N))(print X)(each (seq 3 N) (scope #X::((print (+ "#" (repeat " " (- N 2)) "#")))))(print X)))
    (s 10)
)

Output:
$ ./run square.lithp
##########
#        #
#        #
#        #
#        #
#        #
#        #
#        #
#        #
##########
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.