Друк N квадрат


57

Напишіть програму або функцію, яка приймає невід'ємне ціле число N від stdin або як аргумент функції. Він повинен надрукувати або повернути рядок порожнистої площі мистецтва ASCII, сторони якої зроблені з N копій числа N.

Конкретно:

Якщо N є 0, копії N не використовуються, тому не повинно бути виводу (або лише одного зворотного нового рядка).

Якщо N дорівнює 1, вихід:

1

Якщо N дорівнює 2:

22
22

Якщо N дорівнює 3:

333
3 3
333

Якщо N дорівнює 4:

4444
4  4
4  4
4444

Якщо N дорівнює 5:

55555
5   5
5   5
5   5
55555

Шаблон продовжується 6наскрізь 9.

Якщо N дорівнює 10, вихід:

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

Зауважте, що це насправді не квадрат. Він високий 10 рядів, але шириною 20 стовпців, оскільки 10це два символи. Це призначено. Річ у тім, що кожна сторона "квадрата" містить N копій N. Таким чином, всі вхідні дані 9технічно будуть прямокутниками ASCII.

Наприклад, якщо N дорівнює 23, вихід:

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

Ось Pastebins шуканих виходів для 99, 100, 111і 123(вони можуть виглядати неправильно в браузері , але в текстовому редакторі , вони будуть виглядати правильно). Вихід для 1000має велике значення для Pastebin, але він матиме 1000 рядків та 4000 стовпців. Числа з 4 або більше цифрами повинні працювати так само, як менші числа.

Деталі:

  • N повинен бути записаний у звичайному поданні десяткового числа, без +знака та інших нецифрових знаків.
  • Порожня область повинна бути заповнена лише пробілами.
  • У жодних рядках не повинно бути провідних чи кінцевих пробілів.
  • Один новий рядок після останнього рядка квадратів додатково дозволений.
  • Мови, написані після цього виклику, вітаються, вони просто не мають права на перемогу .
  • Виграє найкоротший код у байтах!

18
Квадрат для n = 10 виглядає більше квадрата, ніж для n = 5. Ура, неквадратичні шрифти!
nneonneo

Чи можемо ми прийняти ціле число як рядок?
Адам

1
@ Nᴮᶻ Так ви можете
Хобі Кальвіна

Відповіді:


6

Джольф, 31 27 25 23 байт

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

Це закодовано в кодуванні ISO-8859-7 і містить недруковані типи, тож ось шістнадцятковий набір:

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

Спробуйте цю скрипку в Інтернеті або перевірте всі тестові випадки одразу (скористайтесь кнопкою повного виконання) .

Це завершується помилкою n = 0, що дозволено за замовчуванням.

Велике спасибі Conor за те, що вони грали в гольф 4 6! байти inb4 перекреслено чотири, все ще схоже на чотири коментарі

Пояснення

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

Як ви створили hexdump?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Я використовував xxd. Ви можете змінити його назад xxd -r.
спагето

16

Штрипед , 317 байт

Поки я задаю питання, я, можливо, можу показати свою нову "пуристську" мову.

@ 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

(безумовно, працює в v1.0.0 )

У Shtriped немає математичних операцій, крім приросту та зменшення. Також немає ніяких циклів чи умовних умов, тому всі ці речі потрібно створювати з нуля в кожній програмі.

Це те, що робить моя програма, наприклад, @це по суті для циклу, +є функцією додавання, }є >=. Фактичний вихід виробляється лише в останніх 8 рядках програми.

У Штрипеді немає струн. Ви можете приймати і друкувати рядки, але всі вони представлені внутрішньо як цілі числа довільної точності, які можна лише збільшувати і зменшувати. Тож немає простого способу отримати довжину рядка 10для заповнення квадратного центру потрібною кількістю пробілів. Мені довелося спільно виконувати функцію, ~яка ефективно обчислює floor(log10(N)) + 1знаходження довжини N у десятковій частині.

Це, ймовірно , може бути golfed трохи більше перестановки , де і як , які змінні використовуються, але не , що набагато більше. Шіропеда не обійти властивих обмежень. (Ніколи так і не задумували бути мовою для гри в гольф.)

Коментований код (зворотний кут - це коментар):

@ 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

Серйозно, 32 31 30 29 байт

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

Спробуйте в Інтернеті!

Пояснення:

╩╜ó$╝╜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 байт

Збережено а4 байти завдяки @ user81655

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

Бере рядок, а не число для введення.

Спробуйте в Інтернеті (всі браузери працюють)


Ви можете замінити *(n-2)з , *~-~-nщоб зберегти байти.
Ніл

@ user81655 спасибі, що виправили це
Downgoat

5
@Neil дякую, але це, на жаль, не врятує жодних байтів
Downgoat

Вибачте, я, мабуть, зробив облік.
Ніл

5

MATL , 34 29 26 байт

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

Це працює з поточним випуском (13.0.0) мови / компілятора

Спробуйте в Інтернеті!

:            % 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 байт

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

Вихід:

666666 
6    6 
6    6  
6    6  
6    6 
666666 

LiveDemo

Введіть потрібний розмір і натисніть, Run queryщоб представити текст.

Зауважте, що цей демонстраційний шрифт не відображає шрифт фіксованої ширини . Так 7товщі, ніж 1.


Редагувати:

Якщо ми трактуємо введення як рядок:

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


Це дуже приємно, я навчився трохи скорочувати деякі інші сценарії. Не знав наказ до 1/0 та sys.messages
t-clausen.dk

Чи слід включити декларацію вхідного параметра при підрахунку байтів?
t-clausen.dk

@ t-clausen.dk Я не впевнений у правилах підрахунку, коли застосовується SQL, але я запитаю про мета та повідомляю вас.
lad2025

1
Ви можете зберегти кілька байтів, зробивши s varchar (наприклад, цей "6"), а потім можете замінити concat на +.
t-clausen.dk

1
Здається, вам не вистачає пробілів. Я вважаю, що ви можете це виправити, написавши (s-2)
t-clausen.dk

4

Джулія, 78 байт

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

Це анонімна функція, яка приймає ціле число і друкує прямокутник ASCII в STDOUT. Щоб викликати його, призначте його змінній.

Безголівки:

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

Спробуйте в Інтернеті


4

Рубін, 100 байт

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

Шкода, що мені навіть не вдалося перемогти JS. Буде вдячна будь-яка подальша допомога в гольфі.

Ось більш-менш незворушена версія:

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
Ви можете призначити змінну, n.to_sоскільки ви її так багато використовуєте, даючи вам m*nпершу частину та m+" "*[(n-2)*m.length,0].max+mдругу частину.
Значення чорнила

Я базував 75-байтну версію на цій відповіді. (JavaScript у даний момент становить 78 байт) Спробуйте в Інтернеті!
benj2240


4

C ++ 14, 156 символів

Я подумав, що це досить круте рішення, хоча, очевидно, не можна обіграти більшість інших записів тут.

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

Безголівки:

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

І як завжди, щоб викликати функцію використання [](string t) { ... }("10");


4

TSQL, 112 104 байт

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-SQL?
кіт

@cat написав коротке пояснення і включив скрипку
t-clausen.dk

Цікаво, дякую! Схоже, кількість байтів може бути вимкнена: перевірити тут
кіт

@cat спасибі Я шукав для цього посилання. Однак останній рядок із FROM - це лише декларування та присвоєння значення X, я чув, що призначення значень та оголошення змінних не враховуються. Будь ласка, виправте мене, якщо я помиляюся. Я спробував зберегти кілька байт за допомогою цього призначення змінних. Звичайні змінні мають префікс @ , що коштує 1 додатковий байт кожен раз, коли його використовують
t-clausen.dk

1
@mazzy так це - 3. додавання останнього рядка (за потреби)
t-clausen.dk

3

Мінколанг 0,15 , 57 байт

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

Спробуйте тут!

Пояснення

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 байт

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

Досить прямо. Перший аргумент командного рядка приймається за число. Помістіть сценарій у файл і запустіть perl file.pl 1.


shiftможна замінити на pop.
Олег Володимирович Волков

3

Perl, 62 60 58 + 2 = 60 байт

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

Потрібні -nlEпрапори:

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

З пробілами додано:

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

3

R, 90 байт

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

Це створює матрицю x*xрозміру, а потім заповнює пробіли розміру nchar(x). Якщо xменше 2, то нічого не заповнюється.


Я знаю, що це через рік, але ... x=scan();m=matrix(x,x,x);m[k<--c(1,x),k]=format("",w=nchar(x));write(m,"",x,,"")на 10 байт менше, використовуючи негативну індексацію та заміну n=x,s=''на x,,'' tio.run/nexus/r#DYpBCsAgDAT/…
Джузеппе

@Giuseppe А тепер для чогось зовсім нечитабельного ... збережіть ще один байт.
JayCe

write("[<-"(matrix(x<-scan(),x,x),k<--c(1,x),k,gsub("."," ",x)),1,x,,"")на 72 байти.
J.Doe


3

Піп -l , 21 байт

Використовує мову новіші, ніж питання, дозволене відповідно до поточної політики; якщо формулювання запитання тлумачиться як перекриття зазначеної політики, див. відповідь 25-байт нижче.

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

Спробуйте в Інтернеті!

Завдяки відповіді MATL Луїса Мендо за (a+1)%n<2хитрість.

Пояснення

Yqчитає рядок зі стдіна і перебирає його на y. Тоді:

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

Оригінальна відповідь 2016 року, 25 байт (плюс -lпрапор):

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

Журнал змін:

  • MCдодано нещодавно; в той час я використовував MMCG(map-map + координатна сітка).
  • У поточному інтерпретаторі виникла помилка, яка перешкоджала використанню ++списків, тому мені довелося робити це ++*(застосувати ++до кожного елемента).
  • Map було розширено: тепер <string1> M <string2>повертає список len(<string2>)копій <string1>; У той час я використовував sX#yпробіл, що повторюється рядом len(y).

2

Pyth, 37 30 байт

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

Спробуйте тут.

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

Сітківка , 90

Знову ж таки, я впевнений, що експерти будуть дуже пограбовані:

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

;
¶

Спробуйте в Інтернеті.


1
Я також розмістив відповідь Retina , але вона не набагато менша. (Чи можете ви скористатися замість того, ;щоб позбутися останнього етапу?)
randomra

@randomra Ну 80 <90, тому ніяких аргументів від мене :)
Digital Trauma

А якщо ви користуєтеся подушкою, [^¶]+це зручно .+.
випадкова


2

Пайк , 33 байти (неконкурентоспроможний)

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

Пояснення:

                                  - 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 байт

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

Дякуємо @ MartinBüttner за пропозицію ff. a+[0X(]&Досить тьмяний, але да ладно.

Спробуйте в Інтернеті!

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

Haskell, 78 байт

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

Приклад використання:

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

Ця функція >>стане в нагоді: <list> >> <string>робить length <list>копії <string>, наприклад, верхній і нижній рядки для x=10are [1..10] >> "10"-> "10101010101010101010".



1
@MaxYekhlakov: Дякую, але, на жаль, не працює твоя версія, для 1якої крик видає єдиний 1. Крім того, ви повертаєте список рядків, тоді як виклик вимагає отримання одного рядка. Ще в наші дні у нас були набагато суворіші правила вводу-виводу, гнучкі правила вводу-виводу - це нещодавніша річ.
німі

2

Perl, 72 байти

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

Покладається на сучасні функції Perl:

сказати "щось"

автоматично доступний з Perl 5.10 (просто використовуйте v5.10 або новішу версію).

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

щасливо приймає працювати над rvalue (str_expr не обов'язково зводиться до скалярної змінної), щоб отримати r esult (параметр ' r ' в кінці регулярного виразу), не змінюючи початковий str_expr.


2

PHP, 151 байт

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

Абсолютний безлад, потрібно більше часу для оптимізації. s(Number)дає вихід.


2

Java 8, 280 байт

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

Це лише приблизно в 10 разів довше, ніж найкоротші відповіді, що справді добре для Java!

Приклад виконання:

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

2

Пітон 3, 108 96 148 байт

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

Безголів / пояснив:

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.

Оскільки це моя перша відповідь з , корисна критика та / або пропозиції будуть корисними!


1
Використовуйте одинарні пробіли для відступу, щоб відтіняти деякі байти. Насправді, вся ваша петля може бути вбудованими: while b!=0:print(a+" "*int(len(a))*c+1);b-=1. Крім того, while b:це еквівалентно while b!=0, так що це ще 3 байти.
Mego

Виправлення помилок: вхід 1 тепер друкує 1, а не нескінченний цикл (мій веб-переглядач справді пережив мені горе). Тепер це займає тонни більше байт, тому.
OldBunny2800

2

Іржа, 141 137 байт

Зловживали деякими матеріалами форматування, інакше це було б набагато довше.

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

Розпаковано:

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

Посилання на дитячий майданчик


Це не працює, коли я спробую його тут . Як я можу це перевірити?
Rɪᴋᴇʀ

Ось посилання на ігровий майданчик, щоб ви могли його протестувати , я використав закриття, щоб ви спочатку призначили цю змінну, а потім зателефонували їй.
Aceeri

О, круто. Не дуже знаєш іржу, але чудова відповідь!
Rɪᴋᴇʀ

2

Powershell, 98 96 95 83 82 75 байт

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

Невиконаний та пояснив тестовий сценарій:

$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

Вихід:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.