Zeichnen Sie ein hohles Quadrat mit der angegebenen Breite


21

Ich habe diese Herausforderung von Codingame erhalten und bin neugierig auf bessere Lösungen als meine:

Zeichnen Sie bei einer Breite über die Standardeingabe ein hohles Quadrat '#' in der angegebenen Breite und Länge.

Beispiel:

5 Ergebnisse in

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

Ich habe Python verwendet, um dieses Problem zu lösen, daher interessiere ich mich besonders für anderen Python-Code. Sie können Ihre Lösung jedoch in jeder gewünschten Sprache veröffentlichen.


7
Was ist, wenn die Eingabe 0 oder 1 ist?
Karl Napf

8
In Verbindung stehend, obwohl dieses genug unterschiedlich sein könnte, um nicht ein Betrogener zu sein.
AdmBorkBork

3
Willkommen bei PPCG! Für zukünftige Fragen empfehle ich Ihnen, die Sandbox zu verwenden, in der Sie ein aussagekräftiges Feedback zu einer Herausforderung erhalten, bevor Sie sie auf der Hauptseite veröffentlichen.
AdmBorkBork

4
Ich lese die Antworten durch und bin nicht überzeugt, dass es ein Betrug ist. Die meisten Antworten hier (Golf und reguläre Sprachen) sind ungefähr halb so groß wie die Antworten auf "Print N Squared".
AdmBorkBork

1
Dies ist absolut ein Duplikat. Lösungen aus der anderen Herausforderung können einfach modifiziert werden, um hier gültig und wettbewerbsfähig zu sein.
Mego

Antworten:



12

Holzkohle , 6 Bytes

Code:

NβBββ#

Erläuterung:

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

Probieren Sie es online!


1
Ich habe versucht herauszufinden, wie man Eingaben in Charcoal liest. Jetzt weiß ich :)
Emigna

1
@Emigna Beachten Sie, dass dies auch in einem Ausdruck wie int(input())in Python verwendet werden kann. Wenn diese Herausforderung darin bestünde, "ein hohles Rechteck mit vorgegebener Breite und Höhe zu zeichnen", könnte dies die Lösung sein BNN#.
DLosc

Verwendet Charcoal einen Nicht-UTF8-Zeichensatz?
OldBunny2800

Das sieht aus wie 6 Zeichen, nicht 6 Bytes. β ist in vielen alternativen 8-Bit-Zeichensätzen enthalten, aber ich bin zweifelhaft in Bezug auf N (was nicht N ist)
Sparr

3
@Sparr Charcoal verwendet eine eigene Codepage.
Conor O'Brien

8

MATL , 12 Bytes

:G\1>&*~35*c

Probieren Sie es online!

Erläuterung

:     % 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 Bytes

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

Das richtige Werkzeug für den Job :)
Emigna

Warum #braucht man aus Neugier drei ?
Kevin Cruijssen

3
@KevinCruijssen Geben Sie jeweils die horizontalen Streben, vertikalen Streben und Eckstücke an.
Conor O'Brien

6

Python 2, 62 54 Bytes

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

Gibt zurück, #\n#wenn die Eingabe ist1

55-Byte-Version, die gedruckt wird

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

62-Byte-Version, die für jede Eingabe funktioniert:

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

2
Sie müssen nicht sagen, es f=sei denn, Sie verwenden es - was Sie nicht tun.
Daniel

@ Dopapp Ich weiß, aber ich denke, es ist fairer so (im Vergleich zu vollständigen Funktionen / Programmen)
Rod

@Rod Sie haben die Wahl, aber wir haben eine Richtlinie zu anonymen Funktionen, die diese zulässt.
Erik der Outgolfer

5

COW , 426 405 348 330 Bytes

MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOMoOMoOMoOMoOMoOMoO
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOmoOoomMMM
moOMMMMOOmOomOoMoomoOmoOMOomoomOoMMMmoOMMMMOoMOoMOOmOomOomOomOoMoo
moOmoOMoomoOMMMmoOmoOMMMMOoMOoMOOmOomOomOomOoMoomoOmoOmoOmoOMOomoo
mOomOomOoMoomoOmoOMOomoomOomOomOomOoMoomoOmoOmoOMOOmOoMoomoOMOomoo

Probieren Sie es online! Ändern Sie die Nummer in der zweiten Zeile in eine beliebige Nummer, um die Ausgabe zu ändern.

Der COW-Interpreter, den ich hier verwende, wurde in Perl geschrieben (und ist neuer als diese Herausforderung), aber Sie können immer noch das gleiche Ergebnis erzielen, indem Sie den Code hier eingeben .

Erläuterung

; 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 Bytes

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

repl.it

Hinweis: Eine Eingabe von 1ergibt eine Ausgabe von ##, aber ein hohles Quadrat würde niemals für eine Eingabe von weniger als erzeugt werden 3, also denke ich, dass dies in Ordnung ist.


4

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 gespart dank @ OlivierGrégoire ;
2 Bytes gespart dank @cliffroot .

Abgeleitete Lösung basierend auf meiner Antwort " Erstellen eines gekreuzten Quadrats" .

Probieren Sie es hier aus.


1
Könnten Sie ein Byte folgendermaßen rasieren for(int i=n,j;i-->0;r+="\n")? Da es uns egal ist, welches die untere oder die obere Zeile ist, macht es keinen Sinn, diese Reihenfolge beizubehalten, oder?
Olivier Grégoire

1
@ OlivierGrégoire Danke! Ich habe es auch in meiner Antwort " Kreuzen eines Quadrats" bearbeitet , da dies auch möglich ist.
Kevin Cruijssen

4

PowerShell v2 +, 48 47 Bytes

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

-1 Byte dank JohnLBevan

Übernimmt Eingaben $n, setzt sie $zals $nHashmarkierungen und $ndekrementiert sie nach. Verkapselt dies in Parens, um eine Kopie in der Pipeline zu platzieren. Verwendet dann den Komma-Operator, um ein Array von vordekrementierten $nZeilen mit #Leerzeichen zu erstellen #. Diese verbleiben in der Pipeline. Dann $zwieder in die Pipeline stellen. Write-OutputBei der impliziten Ausgabe am Ende wird eine neue Zeile zwischen den Elementen eingefügt, sodass wir diese kostenlos erhalten.

Da der OP-Code für die Eingabe nicht funktioniert n <= 1, habe ich das so verstanden, dass wir auch keine Eingabe unterstützen 1müssen.

Beispiele

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

3
###
# #
###

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

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

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

Sie können ein weiteres Byte ausschalten:param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z
JohnLBevan

1
@ JohnLBevan Gute Idee mit dem Skriptblock. Vielen Dank!
AdmBorkBork

3

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);}}

Verwendung:

f(5)


3

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 durch Entfernen von Parens aus .ifund Verwenden von janstelle von Sekunden.if

-18 Bytes durch Verwenden von fanstelle von a .forzum Erstellen der Zeichenfolgen.

-12 Bytes durch nicht NULL-terminierende Zeichenfolgen, stattdessen wird Länge an übergeben da

Die Eingabe erfolgt über das Pseudoregister $t0(zB r $t0 = 5; {above-code}).

Erläuterung:

.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
    '
}

Beispielausgabe:

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 Bytes

3 Bytes gespart dank @lmis !

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

(Behandelt nicht 0oder 1)

Für 13 zusätzliche Bytes (bei 71 Bytes ) können Sie!

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

Diese Lösungen sind recht einfach: Sie benötigen viel Speicher, um sich nicht zu wiederholen und ein paar Bytes zu sparen. Ohne die Variablen würde es so aussehen:

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

Versuch es!

<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>


Durch Hinzufügen von !n?'':n==1?'#':zusätzlichen 15 Bytes am Anfang des Funktionskörpers können Sie die Eingaben 0und verarbeiten 1.
Kayla

1
n=>(b='#'[r='repeat'](n))und dann #${" "[r](n-=2)}usw. spart Ihnen 3 Bytes durch Vermeidung von Wiederholungen repeat:)
Lmis

2

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))

1
Sie können ersetzen list(' '*n)mit [' ']*n. Sie können auch x%(n-1)mitx%~-n
Wheat Wizard

Wenn Sie den forBlock in ein Listenverständnis verwandeln , können Sie mehr als 20 Bytes speichern
Rod

Wechseln Sie auch zu Python 2, int()und lassen Sie die Klammern los print.
Artyer

Verwenden Sie <1anstelle von ==0.
mbomb007

2

Ruby, 39 Bytes

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

Es stellt sich heraus, dass es auf diese Weise kürzer ist als all die ausgefallenen Sachen, die ich versucht habe. Beachten Sie, dass dies nicht mit 0 oder 1 umgehen kann.


2

Python 2, 50 Bytes

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

Arbeitet für n>=2. Druckt jede Zeile mit einem Nummernzeichen n-2des entsprechenden Symbols und anschließend mit einem weiteren Nummernzeichen.

Aliasing des Pound-Symbols ergibt die gleiche Länge:

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

Andere Versuche:

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 Bytes

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

Funktioniert für n>=2 . Definiert den Vorgang des Einfügens eines Zeichens zwischen Zeichen #für eine nZeichenfolge mit Zeilenumbruch und zweimaliger Anwendung, um ein 2D-Raster zu erstellen.

Rufen Sie an wie:

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

2

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));}

Multiplizieren Sie und speichern Sie ein 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));}

Zähle auch j runter und spare noch ein paar ...

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));}

Zähle i von n auf null herunter und spare ein paar 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));}

Ein bisschen einfacher zu verstehen und 1 Byte mehr

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));}

Benötigen Sie &&statt &?
corvus_192

Ja, es muss logisch sein &. Ich kann multiplizieren, aber es erfordert zu viele Klammern ...
Cleblanc


1

PHP, 81-69 Bytes

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

Laufen Sie mit -r ; Geben Sie eine Eingabe als Argument ein.

Löst ein DivisionByZeroErrorfor input = aus 1.


1

R 68, 70 Bytes

Funktioniert für n> 1. Danke an @Billywob für ein paar Bytes, die das Array gegen eine Matrix ausgetauscht haben.

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

Verwendet rbind und cbind, um Zeilen und Spalten von #'s um eine n-2-Quadratmatrix von Räumen zu platzieren. Zeilenumbrüche sind ebenfalls an die Zeilen gebunden. Der Zeilenumbruch in der Quelle ist signifikant. Die Eingabe erfolgt von STDIN


Nett! Ich hatte keine Ahnung, dass eine neue Zeile in einem String implizit hinzugefügt wird \n. Sie könnten zwei Bytes sparen, indem Sie matrixstattdessen verwenden array.
Billywob

1

Common Lisp, 150 - 130 Bytes

-20 dank @Cyoce und @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 #\# #\#))

Verwendung:

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

Grundsätzlich wird formatzweimal für oben und unten und eine Schleife für die dazwischen liegenden Zeilen verwendet. Der Formataufruf für oben und unten gibt eine Zeile aus #, die mit #s beginnt und auf die entsprechende Breite aufgefüllt ist . Der Formataufruf für die Zeilen dazwischen funktioniert ähnlich, mit der Ausnahme, dass der Abstand Leerzeichen enthält und ein #am Ende der Zeile gedruckt wird.

Hinweis: Ich bin ein Neuling in Lisp und erwarte viel Raum für Verbesserungen.


Warum nicht benennen s? Oder funktioniert eine anonyme Funktion?
Cyoce

Ich kenne Lisp nicht, aber sind alle Leerzeichen zwischen einem Wort und einer offenen Klammer rechts davon notwendig? Wie muss es sein dotimes (h (- v 2))oder könnte es sein dotimes(h(- v 2))?
HyperNeutrino

@AlexL. Ja, hier gibt es viele Verbesserungsmöglichkeiten. Eine Tonne Leerzeichen kann zwischen Klammern und anderen Symbolen entfernt werden. Ich mache das ganz schnell
künstlich

0

Haskell, 67 Bytes

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

Anwendungsbeispiel:

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

Wie es funktioniert:

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

Jelly , 13, Bytes

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

TryItOnline! oder versuchen Sie es mit 0 bis 15

Wie?

,þ%µỊṀ€€ị⁾# 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 Bytes

15 Byte Code, +1 für -nFlag.

(Y_Xa-2WR'#s)My

Funktioniert für Eingaben> = 2. Probieren Sie es online!

Erklärung der etwas ungolften Version

Zunächst definieren wir eine Funktion y, die ein Zeichenfolgenargument annimmt, es wiederholt a-2(wobei aes sich um die erste Befehlszeileneingabe handelt) und das Ergebnis in Zeilenumbrüche einfügt #.

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

Als nächstes wenden wir diese Funktion zweimal an - einmal normal, dann wieder mit map -, um das Quadrat als Liste von Zeichenfolgen zu erhalten:

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

Zur Eingabe von 4, (y s)ergibt sich in "# #"und y M (y s)in ["####"; "# #"; "# #"; "####"]. Dieser letztere Wert wird dann mit dem Symbol gedruckt-n Flag dazu führt, dass die Zeilenumbrüche getrennt werden.

Golftricks

So wechseln Sie von der ungolften zur golfierten Version:

  • Leerzeichen entfernen.
  • Yist ein Operator, was bedeutet, dass wir ihn in einem Ausdruck verwenden können. Anstatt Y...gefolgt von (ys), können wir einfach tun (Y...s).
  • Das Problem ist, wir müssen die Funktion abreißen, bevor wir sie erneut als referenzieren y. so yM(Y_Xa-2WR'#s)wird nicht funktionieren. Lösung: Tauschen Sie die Operanden des MOperators ap aus. Solange eine von ihnen eine Funktion ist und die andere ein iterierbarer Typ, spielt es keine Rolle, in welcher Reihenfolge sie eingehen.

0

Schläger 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)))

Testen:

(f 5)

Ausgabe:

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

0

SpecBAS - 57 Bytes

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

?ist Abkürzung für PRINT, #13ist Wagenrücklauf, der an das Ende einer Zeichenkette geheftet werden kann, ohne dass ein+ , sie zu verbinden.

Der Apostroph bewegt den Druckcursor eine Zeile nach unten.


0

Feststecken, 29 27 Bytes

Ziemlich verdammt lang für eine "Golf" -Sprache, aber ich habe vergessen, wie viel davon funktioniert: P

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

Erläuterung:

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 Bytes

Golf gespielt:

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));}

Ungolfed:

    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: Loop Range Optimierung.


0

Lithp , 117 Bytes

Zeile zweigeteilt zur besseren Lesbarkeit:

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

Beispielnutzung:

% 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
##########
#        #
#        #
#        #
#        #
#        #
#        #
#        #
#        #
##########
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.