Drucken Sie N im Quadrat


57

Schreiben Sie ein Programm oder eine Funktion, die eine nicht negative Ganzzahl N von stdin oder als Funktionsargument aufnimmt. Es muss eine Zeichenfolge eines hohlen ASCII-artigen Quadrats drucken oder zurückgeben, dessen Seiten jeweils mit N Kopien der Nummer N versehen sind.

Speziell:

Wenn N ist 0, werden keine Kopien von N verwendet, sodass keine Ausgabe erfolgen sollte (oder nur eine einzelne nachgestellte Zeile).

Wenn N ist 1, ist die Ausgabe:

1

Wenn N ist 2:

22
22

Wenn N ist 3:

333
3 3
333

Wenn N ist 4:

4444
4  4
4  4
4444

Wenn N ist 5:

55555
5   5
5   5
5   5
55555

Das Muster setzt sich für 6durch 9.

Wenn N ist 10, ist die Ausgabe:

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

Beachten Sie, dass dies nicht wirklich quadratisch ist. Es ist 10 Zeilen hoch, aber 20 Spalten breit, da 10es zwei Zeichen lang ist. Das ist beabsichtigt. Der Punkt ist, dass jede Seite des "Quadrats" N Kopien von N enthält. Also werden alle Eingaben darüber hinaus 9technisch ASCII-Rechtecke sein.

Wenn beispielsweise N ist 23, ist die Ausgabe:

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

Hier sind Pastebins der erforderlichen Ausgaben für 99, 100, 111, und 123(sie in einem Browser falsch aussehen, aber in einem Texteditor werden sie richtig aussehen). Die Ausgabe für 1000ist für Pastebin zu groß, hätte aber 1000 Zeilen und 4000 Spalten. Zahlen mit 4 oder mehr Ziffern müssen genau wie kleinere Zahlen funktionieren.

Einzelheiten:

  • N muss in der üblichen Dezimalzahldarstellung ohne +Vorzeichen oder andere Nicht-Ziffern geschrieben werden.
  • Der Hohlraum darf nur mit Leerzeichen gefüllt werden.
  • Zeilen dürfen keine führenden oder nachfolgenden Leerzeichen enthalten.
  • Optional ist eine einzelne Zeile nach der letzten Zeile der Quadrate zulässig.
  • Sprachen, die nach dieser Herausforderung geschrieben wurden, sind willkommen. Sie sind einfach nicht gewinnberechtigt .
  • Der kürzeste Code in Bytes gewinnt!

18
Das Quadrat für n = 10 sieht quadratischer aus als für n = 5. Hurra, nicht quadratische Schriften!
Nneonneo

Dürfen wir die ganze Zahl als Zeichenfolge verwenden?
Adám

1
@ Nᴮᶻ Ja, Sie können
Calvin Hobbies

Antworten:


6

Jolf, 31 27 25 23 Bytes

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

Dies ist in der ISO-8859-7-Codierung codiert und enthält nicht druckbare Dateien.

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

Probieren Sie diese Geige online aus oder überprüfen Sie alle Testfälle auf einmal (verwenden Sie die Schaltfläche für den vollständigen Start) .

Dies wird mit einem Fehler für n = 0 beendet, der standardmäßig zulässig ist.

Ein großes Dankeschön an Conor für das Abschlagen von 4 6! Bytes. inb4 durchgestrichen vier sieht immer noch aus wie ein Kommentar vier

Erläuterung

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

Wie hast du den Hexdump erzeugt?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ich habe xxd benutzt. Sie können es mit umkehren xxd -r.
Ein Spaghetto

16

Versendet , 317 Bytes

Während ich die Frage stelle, kann ich meine neue "puristische" Sprache zur Schau stellen.

@ 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

(Funktioniert definitiv in v1.0.0 )

In Shtriped sind keine mathematischen Operationen integriert, außer Inkrementieren und Dekrementieren. Es gibt auch keine Schleifen oder Bedingungen, so dass all diese Dinge in jedem Programm von Grund auf neu aufgebaut werden müssen.

Das ist, was mein Programm macht, zB @ist im Wesentlichen eine for-Schleife, +ist eine Additionsfunktion, }ist >=. Die tatsächliche Ausgabe wird nur in den letzten 8 Zeilen des Programms erzeugt.

In Shtriped gibt es auch keine Zeichenketten. Sie können Zeichenfolgen eingeben und ausdrucken, aber alle werden intern als Ganzzahlen mit willkürlicher Genauigkeit dargestellt, die nur inkrementiert und dekrementiert werden können. Es gibt also keine einfache Möglichkeit, die Länge der Zeichenfolge 10zum Ausfüllen der quadratischen Mitte mit der richtigen Anzahl von Leerzeichen zu ermitteln. Ich musste die Funktion zusammensetzen ~, die effektiv berechnet floor(log10(N)) + 1, um die Länge von N in Dezimal zu finden.

Dies könnte wahrscheinlich ein bisschen besser sein, indem man wo und wie welche Variablen verwendet werden, aber nicht so viel mehr. An den inhärenten Einschränkungen von Shtriped führt kein Weg vorbei. (Es war sowieso nie als Golfsprache gedacht.)

Kommentierter Code (ein Backslash ist ein Kommentar):

@ 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

Im Ernst, 32 31 30 29 Bytes

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

Probieren Sie es online!

Erläuterung:

╩╜ó$╝╜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

A4 Bytes dank @ user81655 gespeichert

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

Nimmt eine Zeichenfolge und keine Zahl für die Eingabe.

Probieren Sie es online aus (alle Browser funktionieren)


Sie können ersetzen *(n-2)mit *~-~-neinem Byte zu speichern.
Neil

@ user81655 danke, das hat es behoben
Downgoat

5
@Neil danke, aber das scheint leider keine Bytes zu retten
Downgoat

Entschuldigung, ich muss falsch gezählt haben.
Neil

5

MATL , 34 29 26 Bytes

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

Dies funktioniert mit der aktuellen Version (13.0.0) der Sprache / des Compilers

Probieren Sie es online!

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

Ausgabe:

666666 
6    6 
6    6  
6    6  
6    6 
666666 

LiveDemo

Geben Sie die gewünschte Größe ein und klicken Sie Run query, um die Textdarstellung zu erhalten.

Bitte beachten Sie, dass in dieser Demo keine Schrift mit fester Breite angezeigt wird . Ist 7also dicker als 1.


BEARBEITEN:

Wenn wir Eingaben als Zeichenfolge behandeln:

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


Das ist sehr schön, ich habe gelernt, einige meiner anderen Skripte ein wenig zu verkürzen. Ich kannte die Bestellung nicht von 1/0 und sys.messages
t-clausen.dk

Sollte die Deklaration des Eingabeparameters wirklich beim Zählen der Bytes berücksichtigt werden?
t-clausen.dk

@ t-clausen.dk Ich bin nicht sicher, ob ich Regeln zählen soll, wenn SQL angewendet wird, aber ich werde nach Meta fragen und es Sie wissen lassen.
lad2025

1
Sie können ein paar Bytes einsparen, indem Sie s varchar (wie diese '6') eingeben. Dann können Sie concat durch + ersetzen.
t-clausen.dk

1
Anscheinend fehlen Ihnen einige Leerzeichen. Ich glaube, Sie können das
Problem

4

Julia, 78 Bytes

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

Dies ist eine anonyme Funktion, die eine Ganzzahl akzeptiert und das ASCII-Rechteck an STDOUT ausgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.

Ungolfed:

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

Probieren Sie es online aus


4

Ruby, 100 Bytes

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

Schade, dass ich es nicht geschafft habe, JS zu schlagen. Jede weitere Hilfe beim Golfspielen wäre willkommen.

Hier ist eine mehr oder weniger ungolfed Version:

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
Möglicherweise möchten Sie eine Variable zuweisen, n.to_sda Sie sie so häufig verwenden, dass Sie m*nfür den ersten Teil und m+" "*[(n-2)*m.length,0].max+mfür den zweiten Teil erhalten.
Wert Tinte

Ich habe eine 75-Byte-Version auf dieser Antwort aufgebaut. (Javascript ist derzeit bei 78 Bytes) Versuchen Sie es online!
benj2240


4

C ++ 14, 156 Zeichen

Ich fand es eine ziemlich coole Lösung, obwohl die meisten anderen Einträge hier offensichtlich nicht zu toppen sind.

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

Ungolfed:

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

Und wie immer, um die Funktion aufzurufen, verwenden Sie [](string t) { ... }("10");


4

TSQL, 112 104 Bytes

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)

Könnten Sie eine Erklärung für diejenigen von uns hinzufügen, die T-SQL nicht kennen?
Katze

@cat schrieb eine kurze Erklärung und fügte eine Geige ein
t-clausen.dk

Interessant, danke! Es sieht so aus, als ob Ihre Byteanzahl deaktiviert ist: Überprüfen Sie hier
Katze

@cat danke. Ich habe nach einem Link dafür gesucht. Die letzte Zeile mit dem FROM deklariert nur und weist X einen Wert zu. Ich habe gehört, dass das Zuweisen von Werten und das Deklarieren von Variablen nicht zählt. Bitte korrigieren Sie mich, wenn ich falsch liege. Ich habe versucht, mit dieser Zuweisung von Variablen ein paar Bytes zu sparen. Normalen Variablen wird ein @ vorangestellt , was jedes Mal 1 zusätzliches Byte kostet
t-clausen.dk

1
@mazzy yes it does - 3. letzte Zeile hinzufügen (wenn nötig)
t-clausen.dk

3

Minkolang 0,15 , 57 Bytes

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

Probieren Sie es hier aus!

Erläuterung

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 Bytes

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

Ziemlich einfach. Das erste Befehlszeilenargument wird als Zahl verwendet. Platziere das Skript in einer Datei und starte mit perl file.pl 1.


shiftkann durch ersetzt werden pop.
Oleg V. Volkov

3

Perl, 62 60 58 + 2 = 60 Bytes

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

Benötigt -nlEFlaggen:

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

Mit Leerzeichen hinzugefügt:

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

3

R, 90 Bytes

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

Dies erzeugt eine x*xGrößenmatrix und füllt sich dann mit Größenräumen nchar(x). Wenn xkleiner als 2, wird nichts gefüllt.


Ich weiß, dass dies ein Jahr später ist, aber ... x=scan();m=matrix(x,x,x);m[k<--c(1,x),k]=format("",w=nchar(x));write(m,"",x,,"")ist 10 Byte weniger, wenn negative Indizierung und Ersetzung n=x,s=''durch x,,'' tio.run/nexus/r#DYpBCsAgDAT/…
Giuseppe

@ Giuseppe Und jetzt für etwas völlig Unlesbares ... ein weiteres Byte speichern.
JayCe

write("[<-"(matrix(x<-scan(),x,x),k<--c(1,x),k,gsub("."," ",x)),1,x,,"")für 72 Bytes.
J.Doe


3

Pip -l , 21 Bytes

Verwendet Sprachfunktionen, die neuer sind als die Frage, die gemäß der aktuellen Richtlinie zulässig ist. Wenn der Wortlaut der Frage so interpretiert wird, dass er diese Richtlinie außer Kraft setzt, lesen Sie die 25-Byte-Antwort weiter unten.

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

Probieren Sie es online!

Danke an Luis Mendos MATL-Antwort für den (a+1)%n<2Trick.

Erläuterung

Yqliest eine Zeile aus stdin und reißt sie hinein y. Dann:

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

Ursprüngliche Antwort 2016, 25 Bytes (plus -lFlag):

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

Änderungsprotokoll:

  • MCwurde vor kurzem hinzugefügt; Zu der Zeit verwendete ich MMCG(Karte-Karte + Koordinaten-Gitter).
  • Da es im aktuellen Interpreter einen Fehler gab, der die Verwendung ++von Listen verhinderte , musste ich stattdessen ++*Folgendes tun ( ++auf jedes Element anwenden ).
  • Map wurde erweitert: gibt jetzt <string1> M <string2>eine Liste von len(<string2>)Kopien von <string1>; Zu der Zeit habe ich das sX#yZeichenfolgen-wiederholende Leerzeichen von verwendet len(y).

2

Pyth, 37 30 Bytes

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

Probieren Sie es hier aus.

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

Netzhaut , 90

Auch hier bin ich mir ziemlich sicher, dass dies von den Experten sehr gut gespielt werden kann:

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

;
¶

Probieren Sie es online aus.


1
Ich habe auch eine Retina-Antwort gepostet , aber sie ist nicht viel kleiner. (Können Sie verwenden, anstatt ;die letzte Stufe loszuwerden?)
Randomra

@ Randomra Well 80 <90, also kein Argument von mir :)
Digital Trauma

Und wenn Sie die Pilcrow verwenden, [^¶]+ist handlich .+.
Randomra

2

Gelee, 28 Bytes

Grr, kann nicht sagen, ob Jelly schlecht in Streichern ist oder ob ich schlecht in Jelly bin.

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

Probieren Sie es online aus.


Ich habe versucht, dies für eine Antwort anzupassen , aber ohne viel Glück: /
Sp3000

2

Pyke , 33 Bytes (nicht konkurrenzfähig)

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

Erläuterung:

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

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

Vielen Dank an @ MartinBüttner für den Vorschlag ff. Das a+[0X(]&ist ziemlich faul, aber na ja.

Probieren Sie es online!

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 Zeichen

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

3
Funktioniert nicht für i = 1.
BookOwl

2

Haskell, 78 Bytes

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

Anwendungsbeispiel:

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

Die Funktion >>ist praktisch: <list> >> <string>macht length <list>Kopien <string>, zB Kopf- und Fußzeilen für x=10sind [1..10] >> "10"-> "10101010101010101010".



1
@MaxYekhlakov: Danke, aber leider funktioniert deine Version nicht für 1welche Shout-Ausgabe eine Single 1. Außerdem geben Sie eine Liste von Zeichenfolgen zurück, während die Abfrage nach einer einzelnen Zeichenfolge fragt. Wir hatten damals viel strengere E / A-Regeln, flexible E / A-Regeln sind eine neuere Sache.
Nimi

2

Perl, 72 Bytes

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

Verlässt sich auf moderne Perl-Funktionen:

sag 'etwas'

ist seit Perl 5.10 automatisch verfügbar (verwenden Sie einfach v5.10 oder höher).

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

glücklich übernimmt auf einem R - Wert (ein str_expr nicht notwendigerweise reduziert auf einen skalare Variable) gereinigt , wobei eine arbeiten r RGEBNIS (die ‚ r ‘ Option am Ende des regulären Ausdrucks) , ohne die anfängliche str_expr zu verändern.


2

PHP, 151 Bytes

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

Absolutes Chaos, brauche mehr Zeit, um zu optimieren. s(Number)gibt Ihnen die Ausgabe.


2

Java 8, 280 Bytes

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

Es ist nur etwa zehnmal so lang wie die kürzesten Antworten, was für Java wirklich gut ist!

Beispiellauf:

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

2

Python 3, 108 96 148 Bytes

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 / erklärt:

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.

Da dies meine erste Antwort ist, wären konstruktive Kritik und / oder Vorschläge hilfreich!


1
Verwenden Sie einzelne Leerzeichen zum Einrücken, um einige Bytes zu entfernen. In der Tat können Sie Ihre gesamte Schleife inlined werden: while b!=0:print(a+" "*int(len(a))*c+1);b-=1. Darüber hinaus while b:ist äquivalent zu while b!=0, so dass 3 weitere Bytes weg sind.
Mego

Bugfix: Eingabe 1 gibt jetzt 1 aus, nicht infiniteloop (mein Browser hat mich wirklich betrübt). Das braucht jetzt tonnenweise mehr Bytes.
OldBunny2800

2

Rust, 141 137 Bytes

Einige Formatierungen missbraucht, sonst wäre dies viel länger gewesen.

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

Unverpackt:

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

Spielplatz-Link


Das funktioniert nicht, wenn ich es hier versuche . Wie kann ich das testen?
4.

Hier ist ein Spielplatz-Link, damit Sie ihn testen können . Ich habe einen Abschluss verwendet, damit Sie diesen zuerst einer Variablen zuweisen und ihn dann aufrufen.
Aceeri

Oh cool. Weiß nicht wirklich Rost, aber tolle Antwort!
4.

2

Powershell, 98 96 95 83 82 75 Bytes

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

Ungolfed und erklärtes Testskript:

$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

Ausgabe:

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