Cetak N Kuadrat

57

Tulis program atau fungsi yang mengambil bilangan bulat non-negatif dari stdin atau sebagai argumen fungsi. Ini harus mencetak atau mengembalikan string persegi ASCII-art berongga yang masing-masing sisi dibuat dengan N salinan dari angka N.

Secara khusus:

Jika N adalah 0, tidak ada salinan N yang digunakan, jadi seharusnya tidak ada output (atau hanya satu baris baru).

Jika N adalah 1, outputnya adalah:

1

Jika N adalah 2:

22
22

Jika N adalah 3:

333
3 3
333

Jika N adalah 4:

4444
4  4
4  4
4444

Jika N adalah 5:

55555
5   5
5   5
5   5
55555

Pola berlanjut hingga 6selesai 9.

Jika N adalah 10, outputnya adalah:

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

Perhatikan bahwa ini sebenarnya bukan persegi. Tingginya 10 baris tetapi lebarnya 20 kolom karena 10panjangnya dua karakter. Ini dimaksudkan. Intinya adalah bahwa setiap sisi "kotak" berisi N salinan N. Jadi semua input di luar 9secara teknis akan menjadi persegi panjang ASCII.

Misalnya, jika N adalah 23, outputnya adalah:

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

Berikut adalah Pastebins output yang diperlukan untuk 99, 100, 111, dan 123(mereka mungkin terlihat salah dalam browser namun dalam editor teks mereka akan terlihat benar). Output untuk 1000adalah besar untuk Pastebin tetapi akan memiliki 1000 baris dan 4000 kolom. Angka dengan 4 digit atau lebih harus berfungsi seperti angka yang lebih kecil.

Detail:

  • N harus ditulis dalam representasi angka desimal biasa, tanpa +tanda atau non-digit lainnya.
  • Area berlubang hanya harus diisi dengan spasi.
  • Tidak boleh ada garis yang memiliki ruang depan atau belakang.
  • Sebuah baris baru setelah baris terakhir kotak diizinkan secara opsional.
  • Bahasa yang ditulis setelah tantangan ini dibuat dipersilahkan, mereka hanya tidak berhak untuk menang .
  • Kode terpendek dalam byte menang!
Hobi Calvin
sumber
18
Kuadrat untuk n = 10 terlihat lebih persegi daripada untuk n = 5. Hore, font non-persegi!
nneonneo
Bisakah kita mengambil integer sebagai string?
Adám
1
@ Nᴮᶻ Ya, Anda bisa
Hobi Calvin

Jawaban:

6

Jolf, 31 27 25 23 byte

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

Ini disandikan dalam penyandian ISO-8859-7 dan berisi yang tidak patut, jadi inilah hexdump:

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

Coba biola ini secara online atau verifikasi semua test case sekaligus (gunakan tombol full run) .

Ini keluar dengan kesalahan untuk n = 0, yang diizinkan secara default.

Terima kasih banyak kepada Conor karena bermain golf 4 6! byte. inb4 mencoret empat masih tampak seperti empat komentar

Penjelasan

?=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
sebuah spaghetto
sumber
Bagaimana Anda menghasilkan hexdump?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Saya menggunakan xxd. Anda dapat membalikkannya dengan xxd -r.
spaghetto
16

Shtriped , 317 byte

Sementara saya mengajukan pertanyaan, saya bisa memamerkan bahasa "puris" saya yang baru.

@ 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

(pasti berfungsi di v1.0.0 )

Tidak ada operasi matematika yang dibangun ke dalam Shtriped kecuali kenaikan dan penurunan. Juga tidak ada perulangan atau persyaratan, jadi semua hal ini perlu dibangun dari awal di setiap program.

Itulah yang program saya tidak, misalnya @pada dasarnya adalah untuk loop, +adalah fungsi Selain itu, }adalah >=. Output aktual hanya diproduksi di 8 baris terakhir program.

Tidak ada string di Shtriped. Anda dapat menerima dan mencetak string, tetapi semuanya direpresentasikan secara internal sebagai bilangan bulat presisi sewenang-wenang yang hanya dapat ditambah dan dikurangi. Jadi tidak ada cara mudah untuk mendapatkan panjang string 10untuk mengisi pusat persegi dengan jumlah ruang yang tepat. Saya harus menyatukan fungsi ~yang secara efektif menghitung floor(log10(N)) + 1untuk menemukan panjang N dalam desimal.

Ini mungkin bisa golfed sedikit lebih dengan menata ulang di mana dan bagaimana yang variabel yang digunakan, tapi tidak yang jauh lebih. Tidak ada jalan untuk membatasi batasan bawaan Shtriped. (Lagipula itu tidak pernah dimaksudkan sebagai bahasa golf.)

Kode yang dikomentari (garis miring terbalik adalah komentar):

@ 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
Hobi Calvin
sumber
8

Serius, 32 31 30 29 byte

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

Cobalah online!

Penjelasan:

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

JavaScript (ES6), 73 82 78 byte

Disimpan a4 bytes berkat @ user81655

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

Mengambil string, bukan angka untuk input.

Coba online (semua browser berfungsi)

Downgoat
sumber
Anda dapat mengganti *(n-2)dengan *~-~-nuntuk menyimpan byte.
Neil
@ user81655 terima kasih, yang memperbaikinya
Downgoat
5
@Neil terima kasih tapi itu tampaknya tidak menyimpan byte apa pun sayangnya
Downgoat
Maaf, saya pasti salah hitung.
Neil
5

MATL , 34 29 26 byte

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

Ini berfungsi dengan rilis saat ini (13.0.0) dari bahasa / kompiler

Cobalah 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
Luis Mendo
sumber
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

Keluaran:

666666 
6    6 
6    6  
6    6  
6    6 
666666 

LiveDemo

Masukkan ukuran yang diinginkan dan klik Run queryuntuk mendapatkan representasi teks.

Harap dicatat bahwa demo ini tidak menampilkan font dengan lebar tetap . Jadi 7lebih tebal dari 1.


SUNTING:

Jika kami memperlakukan input sebagai string:

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

Lad2025
sumber
Ini sangat bagus, saya belajar cara mempersingkat beberapa skrip saya yang lain. Tidak tahu pesanan sebelum 1/0 dan sys.messages
t-clausen.dk
di samping catatan. Haruskah deklarasi parameter input benar-benar dimasukkan saat menghitung byte?
t-clausen.dk
@ t-clausen.dk Saya tidak yakin tentang aturan penghitungan, ketika SQL diterapkan tetapi saya akan bertanya pada meta dan memberi tahu Anda.
lad2025
1
Anda dapat menyimpan beberapa byte dengan membuat s varchar (seperti ini '6'), kemudian Anda dapat mengganti concat dengan +.
t-clausen.dk
1
Sepertinya Anda kehilangan beberapa spasi. Saya yakin Anda dapat memperbaikinya dengan menulis (s-2)
t-clausen.dk
4

Julia, 78 byte

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

Ini adalah fungsi anonim yang menerima integer dan mencetak persegi panjang ASCII ke STDOUT. Untuk menyebutnya, tetapkan ke variabel.

Tidak Disatukan:

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

Cobalah online

Alex A.
sumber
4

Ruby, 100 byte

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

Sayang sekali saya bahkan tidak bisa mengalahkan JS. Setiap bantuan lebih lanjut untuk menurunkannya akan sangat dihargai.

Berikut ini adalah versi yang kurang lebih tidak mengandung ungolf:

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
Aearnus
sumber
1
Anda mungkin ingin menetapkan variabel n.to_skarena Anda menggunakannya begitu banyak, memberi Anda m*nuntuk bagian pertama dan m+" "*[(n-2)*m.length,0].max+muntuk bagian kedua.
Value Ink
Saya mendasarkan versi 75-byte pada jawaban ini. (Javascript saat ini di 78 byte) Cobalah secara online!
benj2240
4

Retina, 76 byte

.+
$0$*n$0
n(?=n*(\d+))|.
$1_
\d+_
$_¶
T`d` `(?<=¶.*_.*).(?=.*_\d.*¶\d)
\`_
[empty line]

Penjelasan mungkin datang besok.

Cobalah online di sini.

randomra
sumber
7
Sudah lama sejak besok.
CalculatorFeline
Sudah lebih dari satu tahun penuh sejak besok.
Leaky Nun
4

C ++ 14, 156 karakter

Saya pikir itu solusi yang cukup keren walaupun jelas tidak bisa mengalahkan sebagian besar entri lainnya di sini.

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

Tidak Disatukan:

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

Dan seperti biasa, untuk memanggil fungsi gunakan [](string t) { ... }("10");

STDQ
sumber
4

TSQL, 112 104 byte

DECLARE @ varchar(10)='12'

PRINT REPLICATE(@,@)+ISNULL('
'+REPLICATE(@+ISNULL(SPACE((@-2)*len(@))+@,'')+'
',@-2)+REPLICATE(@,@),'')
1. generating first line
2. adding hollow lines + line breaks
3. adding last line(when needed)
t-clausen.dk
sumber
Bisakah Anda menambahkan penjelasan bagi kita yang tidak tahu T-SQL?
kucing
@cat menulis penjelasan singkat, dan memasukkan biola
t-clausen.dk
Menarik, terima kasih! Sepertinya jumlah byte Anda mungkin tidak aktif: periksa di sini
cat
@cat terima kasih. Saya mencari tautan untuk itu. Namun baris terakhir dengan FROM hanya menyatakan dan menetapkan nilai ke X, saya mendengar bahwa menetapkan nilai dan mendeklarasikan variabel tidak masuk hitungan. Tolong koreksi saya jika saya salah. Saya mencoba untuk menyimpan beberapa byte dengan penugasan variabel ini. Variabel normal diawali dengan @ , dengan biaya 1 byte tambahan untuk setiap kali menggunakannya
t-clausen.dk
1
@mazzy ya itu - 3. menambahkan baris terakhir (bila perlu)
t-clausen.dk
3

Minkolang 0,15 , 57 byte

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

Coba di sini!

Penjelasan

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
El'endia Starman
sumber
3

Perl, 79 76 74 byte

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

Cukup mudah. Argumen baris perintah pertama diambil sebagai nomor. Tempatkan skrip dalam file dan jalankan dengan perl file.pl 1.

Kenney
sumber
shiftdapat diganti dengan pop.
Oleg V. Volkov
3

Perl, 62 60 58 + 2 = 60 byte

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

Membutuhkan -nlEbendera:

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

Dengan spasi ditambahkan:

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

R, 90 byte

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

Ini menciptakan matriks x*xukuran dan kemudian mengisi dengan ruang ukuran nchar(x). Jika xlebih kecil dari 2, maka tidak ada yang diisi.

David Arenburg
sumber
Saya tahu ini setahun kemudian, tapi ... x=scan();m=matrix(x,x,x);m[k<--c(1,x),k]=format("",w=nchar(x));write(m,"",x,,"")10 byte lebih sedikit dengan menggunakan pengindeksan negatif dan ganti n=x,s=''dengan x,,'' tio.run/nexus/r#DYpBCsAgDAT/…
Giuseppe
@ Giuseppe Dan sekarang untuk sesuatu yang benar-benar tidak dapat dibaca ... simpan satu byte lagi.
JayCe
write("[<-"(matrix(x<-scan(),x,x),k<--c(1,x),k,gsub("."," ",x)),1,x,,"")untuk 72 byte.
J.
3

Pyth - 26 byte


K*QQjbm++Q**lQ;ttQQttQK

Cobalah online di sini .

Maltysen
sumber
@FryAmTheEggman tombol permalink tampaknya rusak
Maltysen
3

Pip -l , 21 byte

Menggunakan fitur bahasa yang lebih baru dari pertanyaan, yang diizinkan per kebijakan saat ini; jika kata-kata dari pertanyaan ditafsirkan untuk mengesampingkan kebijakan tersebut, lihat jawaban 25-byte di bawah ini.

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

Cobalah online!

Terima kasih untuk jawaban MATL Luis Mendo untuk (a+1)%n<2triknya.

Penjelasan

Yqmembaca baris dari stdin dan menariknya ke dalam y. Kemudian:

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

Jawaban asli 2016, 25 byte (plus -lbendera):

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

Changelog:

  • MCditambahkan baru-baru ini; pada saat itu, saya menggunakan MMCG(peta-peta + koordinat-grid).
  • Ada bug di interpreter saat ini yang mencegah penggunaan ++pada daftar, jadi saya harus melakukan ++*(berlaku ++untuk setiap elemen) sebagai gantinya.
  • Map telah diperpanjang: sekarang <string1> M <string2>mengembalikan daftar len(<string2>)salinan <string1>; pada saat itu, saya menggunakan sX#y, string-repeat space by len(y).
DLosc
sumber
2

Pyth, 37 30 byte

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

Coba di sini.

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
Gagang pintu
sumber
2

Retina , 90

Sekali lagi, saya cukup yakin ini akan sangat golf oleh para ahli:

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

;
¶

Cobalah online.

Trauma Digital
sumber
1
Saya mengirim jawaban Retina juga, tetapi tidak jauh lebih kecil. (Bisakah Anda menggunakan alih-alih ;untuk menyingkirkan tahap terakhir?)
randomra
@randomra Yah 80 <90 jadi tidak ada argumen dari saya :)
Digital Trauma
Dan jika Anda menggunakan pilcrow [^¶]+dengan mudah .+.
randomra
2

Jelly, 28 byte

Grr, tidak tahu apakah Jelly buruk dalam string, atau jika saya buruk pada Jelly.

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

Cobalah online.

Lynn
sumber
Saya sudah mencoba mengadaptasi ini untuk jawaban, tetapi tanpa banyak keberuntungan: /
Sp3000
2

Pyke , 33 byte (tidak kompetitif)

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

Penjelasan:

                                  - 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
Biru
sumber
2

CJam, 27 byte

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

Terima kasih kepada @ MartinBüttner untuk sarannya ff. Sangat a+[0X(]&mencurigakan, tapi oh well.

Cobalah 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
Sp3000
sumber
2

Python 2, 70 karakter

def p(i):
 k=`i`;j=i-2;h=k*i;print h+'\n'+(k+' '*j*len(k)+k+'\n')*j+h
SumnerHayes
sumber
3
Tidak bekerja untuk i = 1.
BookOwl
2

Haskell, 78 byte

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

Contoh penggunaan:

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

Fungsi >>berguna: <list> >> <string>membuat length <list>salinan <string>, misalnya atas dan garis bawah untuk x=10yang [1..10] >> "10"-> "10101010101010101010".

nimi
sumber
71 bytes
Max Yekhlakov
1
@ Maxyekhlakov: Terima kasih, tapi sayangnya versi Anda tidak berfungsi untuk 1yang berteriak mengeluarkan satu 1. Juga, Anda mengembalikan daftar string, sedangkan tantangannya meminta satu string. Kami memiliki aturan IO yang jauh lebih ketat pada masa itu, aturan IO yang fleksibel adalah hal yang lebih baru.
nimi
2

Perl, 72 byte

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

Bergantung pada fitur Perl modern:

katakan 'sesuatu'

secara otomatis tersedia sejak Perl 5.10 (cukup gunakan v5.10 atau yang lebih baru).

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

dengan senang hati menerima untuk bekerja pada nilai (str_expr tidak harus direduksi menjadi variabel skalar) untuk menghasilkan r esult (opsi ' r ' di akhir regex) tanpa mengubah str_expr awal.

Franck Porcher
sumber
2

PHP, 151 byte

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

Kekacauan mutlak, perlu lebih banyak waktu untuk mengoptimalkan. s(Number)memberi Anda output.

ricdesi
sumber
2

Java 8, 280 byte

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

Hanya sekitar 10 kali lipat dari jawaban tersingkat, yang sangat bagus untuk Java!

Contoh dijalankan:

$ java A 10
10101010101010101010
10                10
10                10
10                10
10                10
10                10
10                10
10                10
10                10
10101010101010101010
Mego
sumber
2

Python 3, 108 96 148 byte

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

Tidak digabungkan / dijelaskan:

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.

Karena ini adalah jawaban pertama saya , beberapa kritik dan / atau saran yang membangun akan sangat membantu!

OldBunny2800
sumber
1
Gunakan spasi tunggal untuk lekukan untuk memotong beberapa byte. Bahkan, seluruh loop Anda dapat inline: while b!=0:print(a+" "*int(len(a))*c+1);b-=1. Selain itu, while b:sama dengan while b!=0, jadi itu 3 byte lebih hilang.
Mego
Perbaikan bug: input 1 sekarang mencetak 1, bukan infiniteloop (browser saya benar-benar memberi saya kesedihan). Ini sekarang membutuhkan banyak byte lagi.
OldBunny2800
2

Rust, 141 137 byte

Menyalahgunakan beberapa hal pemformatan, jika tidak, ini akan menjadi jauh lebih lama.

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

Dibongkar:

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

Tautan Playground

Aceeri
sumber
Ini tidak berfungsi ketika saya mencobanya di sini . Bagaimana saya bisa menguji ini?
Rɪᴋᴇʀ
Berikut ini tautan bermain sehingga Anda dapat mengujinya , saya menggunakan penutupan sehingga Anda telah menetapkan itu ke variabel terlebih dahulu kemudian menyebutnya.
Aceeri
Oh keren. Tidak benar-benar tahu karat, tapi jawaban yang bagus!
Rɪᴋᴇʀ
2

Powershell, 98 96 95 83 82 75 byte

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

Script pengujian yang tidak digabungkan dan dijelaskan:

$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

Keluaran:

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