[Question]
  [
**Closed**. This question needs [details or clarity](/help/closed-questions). It is not currently accepting answers.
 
 
---
**Want to improve this question?** Add details and clarify the problem by [editing this post](/posts/98866/edit).
Closed 2 years ago.
[Improve this question](/posts/98866/edit) 
I got this challenge from [Codingame](https://www.codingame.com) and am curious about better solutions than mine:
Given a width via standard input draw a hollow square of '#' in given width and length.
Example:
5 results in
```
#####
#   #
#   #
#   #
#####
```
I used python to solve this so i am particulary interested in other python code. But please feel free to post your solution in any language you want.
  
[Answer]
# [Charcoal](http://github.com/somebody1234/Charcoal), 6 bytes
Code:
```
ＮβＢββ#
```
Explanation:
```
Ｎβ        # Get input from the command line and store into β
   Ｂ      # Draw a hollow box with...
     β     #  Width β
      β    #  Height β
       #   #  Filled with the character '#'
           # Implicitly output the box
```
[Try it online!](http://charcoal.tryitonline.net/#code=77yuzrLvvKLOss6yIw&input=NQ)
[Answer]
# [MATL](http://github.com/lmendo/MATL), 12 bytes
```
:G\1>&*~35*c
```
[Try it online!](http://matl.tryitonline.net/#code=OkdcMT4mKn4zNSpj&input=NQ)
### Explanation
```
:     % 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: ['#####';
                '#   #';
                '#   #';
                '#   #';
                '#####']
```
[Answer]
# Jolf, 8 bytes
```
,ajj"###
,ajj      draw a box with height (input) and width (input)
    "###  with a hash border
```
[Answer]
## Python 2, ~~62~~ 54 bytes
```
f=lambda n:'#'*n+'\n#%s#'%(' '*(n-2))*(n-2)+'\n'+'#'*n
```
Returns `#\n#` when the input is `1`  
55 Bytes version that prints
```
def f(n):a=n-2;print'#'*n,'\n#%s#'%(' '*a)*a,'\n'+'#'*n
```
62 Bytes version that works for any input:
```
f=lambda n:'#'*n+'\n#%s#'%(' '*(n-2))*(n-2)+('\n'+'#'*n)*(n>1)
```
[Answer]
# Java 7, ~~113~~ ~~112~~ 110 bytes
```
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;}
```
1 byte saved thanks to *@OlivierGrégoire*;  
2 bytes saved thanks to *@cliffroot*.
Derived solution based on my [*Creating a Crossed Square* answer](https://codegolf.stackexchange.com/a/91072/52210).
[Try it here.](https://ideone.com/uKMm8B)
[Answer]
# [COW](https://esolangs.org/wiki/COW), ~~426~~ ~~405~~ ~~348~~ 330 bytes
```
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOMoOMoOMoOMoOMoOMoO
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOmoOoomMMM
moOMMMMOOmOomOoMoomoOmoOMOomoomOoMMMmoOMMMMOoMOoMOOmOomOomOomOoMoo
moOmoOMoomoOMMMmoOmoOMMMMOoMOoMOOmOomOomOomOoMoomoOmoOmoOmoOMOomoo
mOomOomOoMoomoOmoOMOomoomOomOomOomOoMoomoOmoOmoOMOOmOoMoomoOMOomoo
```
[Try it online!](https://tio.run/nexus/perl#jVHLboMwELzzFTTywZZjApF6gVDyAyt/QMQhobSJhOOU9CnCt9PFNs2jr0gWeGdnd3a83bxIJ3ShIF9omTfT9iClPAAA/uGgtWKTx8QjuzRMvP3LyldaN0QJkZAqjRJKioUQROXl0wgzo4xUnMcIWgik7CEh4oi9rTdVSarWdpHYZSeEi7TEiPMhJxs/CALfhtALrjDfZnRXb7bPfrGuLcBiai@pru/p7I4xVyKHkkEBegWDDCo4WrN5oDeuE3ri/OiJ8zMDp56czVNPSV/c2r74ek4pDZ0SQENJPXZKKakzGo5J/TU9e58OtdDslx8WtRAuYGiH1nuPrVe@LiszDue5mYASNZsXLOk69PnXAVDm@w/tmvOtFYY47BGXEpeMB/enTBa3gm/XI0eONscxL/nmYsnX8C9UflP/sdD2dIqG6UXTTsBtEEZhJ7af "Perl – TIO Nexus") Change the number in the second line to any number to change the output.
The COW interpreter that I'm using here was written in Perl (and is newer than this challenge), but you can still get the same result by inputting the code [here](http://web.archive.org/web/20130116215713/http://www.frank-buss.de/cow.html).
### Explanation
```
; 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
```
[Answer]
# Python 2, ~~59~~ 58 bytes
```
n=i=input()
while i:print'#%s#'%((' #'[i%n<2])*(n-2));i-=1
```
**[repl.it](https://repl.it/EQw5/1)**
Note: An input of `1` produces an output of `##`, but a *hollow* square would never be produced for an input less than `3`, so I guess this is fine.
[Answer]
## PowerShell v2+, ~~48~~ 47 bytes
```
param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z
```
*-1 byte thanks to JohnLBevan*
Takes input `$n`, sets `$z` as `$n` hashmarks, with `$n` post-decremented. Encapsulates that in parens to place a copy on the pipeline. Then uses the comma operator to create an array of pre-decremented `$n` lines of `#`,spaces,`#`. Those are left on the pipeline. Then places `$z` again on the pipeline. Output via implicit `Write-Output` at the end introduces a newline between elements, so we get that for free.
Since the [OP's code](https://codegolf.stackexchange.com/a/98868/42963) doesn't work for input `n <= 1`, I took that to mean we don't need to support input `1`, either.
### Examples
```
PS C:\Tools\Scripts\golfing> 2..6|%{"$_";.\draw-a-hollow-square.ps1 $_;""}
2
##
##
3
###
# #
###
4
####
#  #
#  #
####
5
#####
#   #
#   #
#   #
#####
6
######
#    #
#    #
#    #
#    #
######
```
[Answer]
# C, 98 bytes
```
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);}}
```
Usage:
```
f(5)
```
[Answer]
# [05AB1E](http://github.com/Adriandmen/05AB1E), 20 bytes
```
'#×D¹Íð×'#.ø¹Í×sJ¹ä»
```
[Try it online!](http://05ab1e.tryitonline.net/#code=JyPDl0TCucONw7DDlycjLsO4wrnDjcOXc0rCucOkwrs&input=NQ)
Or **18 bytes** if we can ignore `1 <= n`:
```
F„ #N¹<%_è¹Í×'#.ø,
```
[Try it online!](http://05ab1e.tryitonline.net/#code=RuKAniAjTsK5PCVfw6jCucONw5cnIy7DuCw&input=NQ)
[Answer]
# WinDbg, ~~206~~ ~~200~~ ~~182~~ 170 bytes
```
.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 bytes from removing parens from `.if` and using `j` instead of second `.if`*
*-18 bytes by using `f` instead of a `.for` to construct the strings.*
*-12 bytes by not NULL-terminating strings, instead passing length to `da`*
Input is passed in through the pseudo-register `$t0` (eg `r $t0 = 5; {above-code}`).
Explanation:
```
.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
    '
}
```
Sample output:
```
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  "#####"
```
[Answer]
# JavaScript, ~~61~~ 58 bytes
Saved 3 bytes thanks to [@lmis](https://codegolf.stackexchange.com/users/56071/lmis)!
```
n=>(b='#'[r='repeat'](n))+`
#${' '[r](n-=2)}#`[r](n)+`
`+b
```
(Doesn't handle `0` or `1`)
For 13 extra bytes (at **71 bytes**), you can!
```
n=>n?n-1?(b='#'[r='repeat'](n))+`
#${' '[r](n-=2)}#`[r](n)+`
`+b:'#':''
```
These solutions are fairly simple: they do a lot of storage to not *repeat* themselves to save a few bytes. Unminified without the variablsm it would look like:
```
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
```
### Try it!
```
<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>
```
[Answer]
# [Python 2](https://docs.python.org/2/), 47 bytes
Works for all `n` greater than 1.
```
lambda n:'#'*n+('#%*s'%(n,'#\n')*~-n)[n:]+'#'*n
```
[Try it online!](https://tio.run/##NcqxCoMwFAXQ3a@4EMJLol0cOgT8Eu0QsamCvUrM0qW/HkFwPZz9l@eNbYndUNbwHacAelHiWBtR2h2iDRtRA8W6/4O2p3/VVyhxSyAWIgV@3qZt8LS@wp4WZoievECDN0RDW04 "Python 2 – Try It Online")
[Answer]
# Python, 109 bytes
```
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))
```
[Answer]
# Ruby, 39 bytes
```
->n{puts a=?#*n,[?#+' '*(n-=2)+?#]*n,a}
```
Turns out to be shorter this way than all the fancy stuff I was trying. Be advised that this doesn't handle 0 or 1 at all.
[Answer]
## Python 2, 50 bytes
```
m=input()-2
for c in'#'+' '*m+'#':print'#'+m*c+'#'
```
Works for `n>=2`. Prints each line with a pound sign, `n-2` of the appropriate symbol, then another pound sign.
Aliasing the pound symbol gives same length:
```
m=input()-2;p='#'
for c in p+' '*m+p:print p+m*c+p
```
Other attempts:
```
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)
```
[Answer]
## Haskell, 49 bytes
```
n%b='#':(b<$[3..n])++"#\n"
f n=(n%)=<<init(n%' ')
```
Works for `n>=2`. Defines the operation of sandwiching a character between `#` for an `n`-character newline-terminated string, then applies it twice to make a 2D grid.
Call like:
```
*Main> putStrLn$ f 5
#####
#   #
#   #
#   #
#####
```
[Answer]
# C, ~~83~~ ~~82~~ ~~80~~ ~~78~~ 77 Bytes
```
i,j;f(n){for(i=n;i--;puts(""))for(j=n;j--;putchar(i*j&&i^n-1&&j^n-1?32:35));}
```
Sneak in a multiply and save a 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));}
```
Also count down j and save a few more...
```
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));}
```
Count down i from n to zero and save a few bytes...
```
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));}
```
A bit easier to understand and 1 byte more
```
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));}
```
[Answer]
# [K (ngn/k)](https://codeberg.org/ngn/k), 17 bytes
```
{"# "x*/:x#:!x-1}
```
[Try it online!](https://ngn.bitbucket.io/k#eJxLs6pWUlZQqtDSt6pQtlKs0DWs5UpTMAMARoEFvQ==)
Or tacit, 20 bytes:
```
" #"@|/(+|:)\^ :':=:
"# "@&/(+|:)\=':1|=:  / similar
```
[Try it online!](https://ngn.bitbucket.io/k#eJxLs1JSUFZyqNHX0K6x0oyJU7BSt7K14kpTMAUAUiwF9g==)
[Answer]
# Groovy, ~~51~~ 50 bytes
```
{n->a="*"*n+"\n";n-=2;print(a+"*${' '*n}*\n"*n+a)}
```
[Answer]
# PHP, ~~81~~ 69 bytes
```
for($n=-1+$i=$argv[1];$i--;)echo str_pad("#",$n," #"[$i%$n<1]),"#\n";
```
Run with `-r`; provide input as argument.
Throws a `DivisionByZeroError` for input=`1`.
[Answer]
## Pyke, 11 bytes
```
ttDd*n+*.X#
```
[Try it here!](http://pyke.catbus.co.uk/?code=ttDd%2an%2B%2a.X%23&input=5)
```
ttDd*n+*    - a square of spaces n-2*n-2 big
        .X# - surround in `#`
```
[Answer]
# R, 68 ~~70~~ bytes
Works for n > 1. Thanks to @Billywob for a couple of bytes swapping out the array for a matrix.
```
cat(rbind(b<-'#',cbind(b,matrix(' ',n<-scan()-2,n),b),b,'
'),sep='')
```
Uses rbind and cbind to put rows and columns of `#`'s around an n-2 square matrix of spaces. Newlines are bound to the rows as well. The newline in the source is significant. Input is from STDIN
[Answer]
# Common Lisp, ~~150~~ 130 bytes
*-20 thanks to @Cyoce and @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 #\# #\#))
```
Usage:
```
* (s 5)
#####
#   #
#   #
#   #
#####
```
Basically uses `format` twice for the top and bottom and a loop for the rows in between. The format call for the top and bottom outputs a line starting with `#` and padded to the appropriate width with `#`s. The format call for the rows in between works similarly, except the padding is spaces and a `#` gets printed at the end of the line.
Note: I'm rather new to Lisp and expect to have a lot of room for improvement on this.
[Answer]
# [Dyalog APL](https://www.dyalog.com/), 20 bytes
```
{' #'[1+∘.∨⍨1⍵∊⍨⍳⍵]}
```
[Try it online!](https://tio.run/##SyzI0U2pTMzJT9dNzkksLs5M/v8/7VHbhGp1BWX1aEPtRx0z9B51rHjUu8LwUe/WRx1dQNaj3s1AdmwtUOWhFYYKpgqGBgA)
This is an improved version on my first attempt suggested by [dzaima](https://codegolf.stackexchange.com/users/59183/dzaima) on [the APL Orchard](https://chat.stackexchange.com/transcript/message/59276795#59276795), so all credit goes to him.
Takes an integer n as input. Using 5 as an example:
```
                ⍳⍵   integers from 1 to n
                      1 2 3 4 5
            1⍵∊⍨     check whether each integer is 1 or n
                      1 0 0 0 1
        ∘.∨⍨         generate all possible pairs of the
                     0s and 1s in a matrix, or'ing each pair:
                      ∨ | 1 0 0 0 1
                      --+----------
                      1 | 1 1 1 1 1
                      0 | 1 0 0 0 1
                      0 | 1 0 0 0 1
                      0 | 1 0 0 0 1
                      1 | 1 1 1 1 1
      1+             add 1 to each number
                      2 2 2 2 2
                      2 1 1 1 2
                      2 1 1 1 2
                      2 1 1 1 2
                      2 2 2 2 2
 ' #'[            ]  turn 1 into space (the first character)
                     and 2 into # (the second character)
```
[Answer]
## Haskell, 67 bytes
```
l#n=l<$[1..n]
f n=unlines$'#'#n:('#':' '#(n-2)++"#")#(n-2)++['#'#n]
```
Usage example:
```
Prelude> putStrLn $ f 4
####
#  #
#  #
####
```
How it works:
```
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
```
[Answer]
# [Jelly](https://github.com/DennisMitchell/jelly), 13, [bytes](https://github.com/DennisMitchell/jelly/wiki/Code-page)
```
,þ%µỊṀ€€ị⁾# Y
```
**[TryItOnline!](http://jelly.tryitonline.net/#code=LMO-JcK14buK4bmA4oKs4oKs4buL4oG-IyBZ&input=&args=MTM)** or [try 0 to 15](http://jelly.tryitonline.net/#code=LMO-JcK14buK4bmA4oKs4oKs4buL4oG-IyBZCuKBtOG4tsK1xbzDh-KCrEtZ&input=)
### How?
```
,þ%µỊṀ€€ị⁾# 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
```
[Answer]
## [Pip](http://github.com/dloscutoff/pip), 16 bytes
15 bytes of code, +1 for `-n` flag.
```
(Y_Xa-2WR'#s)My
```
Works for input >= 2. [Try it online!](http://pip.tryitonline.net/#code=KFlfWGEtMldSJyNzKU15&input=&args=NQ+LW4)
### Explanation of somewhat ungolfed version
First, we define a function `y` that takes a string argument, repeats it `a-2` times (where `a` is the first command-line input), and wraps the result in `#`.
```
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
```
Next, we apply this function twice--once normally, then again with map--to obtain the square as a list of strings:
```
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
```
For input of `4`, `(y s)` results in `"# #"` and `y M (y s)` in `["####"; "# #"; "# #"; "####"]`. This latter value is then printed, with the `-n` flag causing it to be newline-separated.
### Golfing tricks
To get from the ungolfed to the golfed version:
* Remove spaces.
* `Y` is an operator, which means we can use it in an expression. Instead of `Y...` followed by `(ys)`, we can just do `(Y...s)`.
* The problem is, we have to yank the function before we reference it again as `y`; so `yM(Y_Xa-2WR'#s)` won't work. Solution: swap the operands of the `M`ap operator. As long as one of them is a function and the other is an iterable type, it doesn't matter what order they come in.
[Answer]
## Racket 113 bytes
```
(let*((d display)(g(λ()(for((i n))(d"#")))))(g)(d"\n")(for((i(- n 2)))(d"#")(for((i(- n 2)))(d" "))(d"#\n"))(g))
```
Ungolfed: 
```
(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)))
```
Testing: 
```
(f 5)
```
Output: 
```
#####
#   #
#   #
#   #
#####
```
[Answer]
# SpecBAS - 57 bytes
```
1 INPUT n: a$="#"*n,n-=2,b$="#"+" "*n+"#"#13: ?a$'b$*n;a$
```
`?` is shorthand for `PRINT`, `#13` is carriage return which can be tacked on to the end of a string without needing a `+` to join them.
The apostrophe moves print cursor down one line.
]