Drukuj N w kwadracie


57

Napisz program lub funkcję, która pobiera nieujemną liczbę całkowitą N ze standardowego wejścia lub argumentu funkcji. Musi wydrukować lub zwrócić ciąg pustego kwadratu ASCII-art, którego boki są wykonane za pomocą N kopii liczby N.

Konkretnie:

Jeśli N jest 0, nie są używane żadne kopie N, więc nie powinno być żadnych danych wyjściowych (lub tylko pojedynczej nowej linii).

Jeśli N jest 1, wynikiem jest:

1

Jeśli N oznacza 2:

22
22

Jeśli N oznacza 3:

333
3 3
333

Jeśli N oznacza 4:

4444
4  4
4  4
4444

Jeśli N oznacza 5:

55555
5   5
5   5
5   5
55555

Wzór trwa do 6końca 9.

Jeśli N jest 10, wynikiem jest:

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

Zauważ, że tak naprawdę nie jest to kwadrat. Ma 10 rzędów wysokości, ale szerokość 20 kolumn, ponieważ 10ma dwa znaki. To jest zamierzone. Chodzi o to, że każda strona „kwadratu” zawiera N kopii N. Zatem wszystkie dane wejściowe poza nimi 9będą technicznie prostokątami ASCII.

Na przykład, jeśli N jest 23, wynikiem jest:

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

Oto pastebin wymaganych wyjść na 99, 100, 111, i 123(mogą źle wyglądać w przeglądarce, ale w edytorze tekstu będą wyglądać poprawne). Wyjście dla 1000jest za duże dla Pastebin, ale miałoby 1000 wierszy i 4000 kolumn. Liczby z 4 lub więcej cyframi muszą działać tak samo jak mniejsze liczby.

Detale:

  • N musi być zapisane w zwykłej reprezentacji liczb dziesiętnych, bez +znaku lub innych cyfr.
  • Pusta przestrzeń musi być wypełniona tylko spacjami.
  • Żadne linie nie powinny mieć spacji wiodących ani końcowych.
  • Opcjonalnie dozwolona jest pojedyncza nowa linia po ostatniej linii kwadratów.
  • Języki napisane po tym konkursie są mile widziane, po prostu nie są w stanie wygrać .
  • Najkrótszy kod w bajtach wygrywa!

18
Kwadrat dla n = 10 wygląda bardziej kwadratowo niż dla n = 5. Brawo, czcionki nie kwadratowe!
nneonneo

Czy możemy przyjąć liczbę całkowitą jako ciąg?
Adám

1
@ Nᴮᶻ Tak, możesz
Calvin's Hobbies

Odpowiedzi:


6

Jolf, 31 27 25 23 bajtów

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

Jest to zakodowane w kodowaniu ISO-8859-7 i zawiera niedrukowalne, więc oto zrzut heksowy:

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

Spróbuj tego skrzypka online lub zweryfikuj wszystkie przypadki testowe jednocześnie (użyj przycisku pełnego uruchomienia) .

To kończy się z błędem dla n = 0, który jest domyślnie dozwolony.

Ogromne podziękowania dla Conora za grę w golfa 4 6! bajty. przekreślone inb4 cztery nadal wyglądają jak cztery komentarze

Wyjaśnienie

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

Jak wygenerowałeś zrzut heksowy?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Użyłem xxd. Możesz to odwrócić za pomocą xxd -r.
spaghetto

16

Shtriped , 317 bajtów

Kiedy zadaję to pytanie, mogę pochwalić się moim nowym „purystycznym” językiem.

@ 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

(zdecydowanie działa w wersji 1.0.0 )

W Shtriped nie ma żadnych wbudowanych operacji matematycznych, z wyjątkiem zwiększania i zmniejszania. Nie ma również pętli ani warunków warunkowych, więc wszystkie te rzeczy muszą być tworzone od zera w każdym programie.

To, co robi mój program, na przykład @jest w zasadzie dla pętli, +to funkcja dodawania, }jest >=. Rzeczywiste wyjście jest wytwarzane tylko w ostatnich 8 wierszach programu.

W Shtriped nie ma również żadnych łańcuchów. Możesz przyjmować i drukować ciągi, ale wszystkie są reprezentowane wewnętrznie jako liczby całkowite o dowolnej precyzji, które można tylko zwiększać i zmniejszać. Dlatego nie ma łatwego sposobu na uzyskanie długości sznurka 10do wypełnienia kwadratowego środka odpowiednią ilością spacji. Musiałem zebrać razem funkcję, ~która skutecznie oblicza, floor(log10(N)) + 1aby znaleźć długość N w systemie dziesiętnym.

Może to prawdopodobnie golfed nieco bardziej poprzez zmianę miejsca i sposobu, które zmienne są używane, ale nie , że znacznie więcej. Nie da się obejść nieodłącznych ograniczeń Shtripeda. (W każdym razie nigdy nie miał być językiem golfowym.)

Skomentowany kod (ukośnik odwrotny to komentarz):

@ 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

Poważnie, 32 31 30 29 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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

Zaoszczędzono 4 bajty dzięki @ user81655

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

Pobiera ciąg, a nie liczbę do wprowadzenia.

Wypróbuj online (wszystkie przeglądarki działają)


Można wymienić *(n-2)z *~-~-nzapisać bajt.
Neil,

@ user81655 dzięki, że to naprawiło
Downgoat

5
@Neil dzięki, ale to nie wydaje się niestety oszczędzać żadnych bajtów
Downgoat

Przepraszam, musiałem przeliczyć.
Neil,

5

MATL , 34 29 26 bajtów

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

Działa to z bieżącą wersją (13.0.0) języka / kompilatora

Wypróbuj 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 bajtów

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

Wynik:

666666 
6    6 
6    6  
6    6  
6    6 
666666 

LiveDemo

Wprowadź żądany rozmiar i kliknij, Run queryaby uzyskać reprezentację tekstu.

Uwaga: to demo nie wyświetla czcionek o stałej szerokości . Więc 7jest grubszy niż 1.


EDYTOWAĆ:

Jeśli traktujemy dane wejściowe jako ciąg znaków:

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


To bardzo miłe, nauczyłem się trochę skracać niektóre z moich innych skryptów. Nie znam kolejności od 1/0 i
sys.messages

na marginesie. Czy deklaracja parametru wejściowego powinna być naprawdę uwzględniona podczas liczenia bajtów?
t-clausen.dk

@ t-clausen.dk Nie jestem pewien co do liczenia reguł, kiedy SQL zostanie zastosowany, ale zapytam o meta i dam znać.
lad2025

1
Możesz zaoszczędzić kilka bajtów, robiąc s varchar (jak ten „6”), a następnie możesz zamienić concat na +.
t-clausen.dk

1
Wygląda na to, że brakuje ci niektórych spacji. Wierzę, że możesz to naprawić, pisząc (s-2)
t-clausen.dk

4

Julia, 78 bajtów

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

Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i drukuje prostokąt ASCII do STDOUT. Aby go wywołać, przypisz go do zmiennej.

Nie golfowany:

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

Wypróbuj online


4

Rubinowy, 100 bajtów

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

Szkoda, że ​​nie udało mi się nawet pokonać JS. Każda dalsza pomoc w grze w golfa byłaby mile widziana.

Oto mniej lub bardziej nie golfowa wersja:

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
Możesz chcieć przypisać zmienną, n.to_sponieważ używasz jej tak często, dając ci m*npierwszą część i m+" "*[(n-2)*m.length,0].max+mdrugą część.
Wartość tuszu

Na tej odpowiedzi oparłem wersję 75-bajtową. (JavaScript ma obecnie 78 bajtów) Wypróbuj online!
benj2240


4

C ++ 14, 156 znaków

Myślałem, że to całkiem fajne rozwiązanie, choć oczywiście nie może pobić większości innych wpisów tutaj.

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

Nie golfowany:

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

I jak zawsze, aby wywołać funkcję use [](string t) { ... }("10");


4

TSQL, 112 104 bajtów

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)

Czy możesz dodać wyjaśnienie dla tych z nas, którzy nie znają T-SQL?
kot

@cat napisał krótkie wyjaśnienie i zawierał skrzypce
t-clausen.dk 18.04.16

Ciekawe dzięki! Wygląda na to, że liczba bajtów może być wyłączona: sprawdź tutaj
cat

@cat dzięki. Szukałem linku do tego. Jednak ostatni wiersz z FROM to tylko deklarowanie i przypisywanie wartości do X, słyszałem, że przypisywanie wartości i deklarowanie zmiennych się nie liczy. Proszę, popraw mnie jeśli się mylę. Próbowałem zapisać kilka bajtów przy takim przypisaniu zmiennych. Zmienne normalne są poprzedzone znakiem @ , kosztującym 1 dodatkowy bajt za każdym razem, gdy go używa
t-clausen.dk 18.04.2016

1
@mazzy tak to robi - 3. dodanie ostatniej linii (w razie potrzeby)
t-clausen.dk

3

Minkolang 0,15 , 57 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie

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 bajtów

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

Całkiem proste. Pierwszy argument wiersza poleceń jest traktowany jako liczba. Umieść skrypt w pliku i uruchom z perl file.pl 1.


shiftmożna zastąpić pop.
Oleg V. Volkov

3

Perl, 62 60 58 + 2 = 60 bajtów

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

Wymaga -nlEflag:

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

Z dodanymi spacjami:

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

3

R, 90 bajtów

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

Tworzy to macierz x*xwielkości, a następnie wypełnia się spacjami wielkości nchar(x). Jeśli xmniejsze niż 2, nic nie jest wypełniane.


Wiem, że to jest rok później, ale ... x=scan();m=matrix(x,x,x);m[k<--c(1,x),k]=format("",w=nchar(x));write(m,"",x,,"")jest o 10 bajtów mniej, używając indeksowania ujemnego i zastępując n=x,s=''go x,,'' tio.run/nexus/r#DYpBCsAgDAT/...
Giuseppe

@Giuseppe A teraz coś zupełnie nieczytelnego ... zapisz jeszcze jeden bajt.
JayCe

write("[<-"(matrix(x<-scan(),x,x),k<--c(1,x),k,gsub("."," ",x)),1,x,,"")dla 72 bajtów.
J.Doe


3

Pip -l , 21 bajtów

Używa funkcji językowych nowszych niż pytanie, co jest dozwolone na podstawie bieżących zasad; jeśli sformułowanie pytania zostanie zinterpretowane w celu zastąpienia wspomnianej polityki, patrz 25-bajtowa odpowiedź poniżej.

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

Wypróbuj online!

Dzięki odpowiedzi MATL Luisa Mendo na (a+1)%n<2lewę.

Wyjaśnienie

Yqczyta wiersz ze standardowego wejścia i ciągnie go do y. Następnie:

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

Oryginalna odpowiedź na 2016 r., 25 bajtów (plus -lflaga):

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

Dziennik zmian:

  • MCzostał dodany niedawno; wówczas użyłem MMCG(mapa-mapa + siatka współrzędnych).
  • W obecnym tłumaczu wystąpił błąd, który uniemożliwiał korzystanie ++z list, więc musiałem to zrobić ++*(zastosować ++do każdego elementu).
  • Map został rozszerzony: teraz <string1> M <string2>zwraca listę len(<string2>)kopii <string1>; w tym czasie użyłem sX#yspacji powtarzającej ciąg znaków przez len(y).

2

Pyth, 37 30 bajtów

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

Wypróbuj tutaj.

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

Retina , 90

Znów jestem pewien, że eksperci będą w stanie grać w golfa:

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

;
¶

Wypróbuj online.


1
Zamieściłem Retina odpowiedzieć też, ale to nie jest dużo mniejszy. (Czy możesz użyć zamiast ;pozbyć się ostatniego etapu?)
randomra

@randomra Well 80 <90, więc nie mam ze sobą żadnych argumentów :)
Cyfrowa trauma

A jeśli skorzystasz z pilcrow [^¶]+jest pod ręką .+.
randomra

2

Galaretka, 28 bajtów

Grr, nie mogę powiedzieć, czy Jelly jest zła w smyczkach, czy też jestem zła w Jelly.

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

Wypróbuj online.


Próbowałem dostosować to do odpowiedzi, ale bez większego szczęścia: /
Sp3000

2

Pyke , 33 bajty (niekonkurencyjne)

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

Wyjaśnienie:

                                  - 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 bajtów

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

Dzięki @ MartinBüttner za sugestie ff. a+[0X(]&Jest dość podejrzany, ale cóż.

Wypróbuj 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 znaków

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

3
Nie działa dla i = 1.
BookOwl

2

Haskell, 78 bajtów

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

Przykład użycia:

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

Funkcja >>jest przydatna: <list> >> <string>sprawia, że length <list>kopie <string>, np górnej i dolnej linii dla x=10[1..10] >> "10"-> "10101010101010101010".



1
@MaxYekhlakov: Dzięki, ale niestety twoja wersja nie działa, dla 1której krzyk wyprowadza pojedynczy 1. Zwracamy również listę ciągów, podczas gdy wyzwanie wymaga pojedynczego ciągu. W tamtych czasach mieliśmy znacznie bardziej surowe reguły we / wy, elastyczne reguły we / wy są nowością.
nimi

2

Perl, 72 bajty

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

Opiera się na nowoczesnych funkcjach Perla:

powiedz „coś”

jest automatycznie dostępny od wersji Perla 5.10 (wystarczy użyć wersji 5.10 lub nowszej).

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

szczęśliwie przyjmuje pracować na rvalue (e str_expr niekoniecznie zredukowane do skalarnej) uzyskując r esult (tzw R funkcji "na końcu wyrażenia regularnego) bez zmiany początkowego str_expr.


2

PHP, 151 bajtów

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

Absolutny bałagan, potrzebujesz więcej czasu na optymalizację. s(Number)daje wynik.


2

Java 8, 280 bajtów

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

To tylko około 10 razy dłużej niż najkrótsze odpowiedzi, co jest naprawdę dobre dla Javy!

Przykładowy przebieg:

$ 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 bajtów

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

Niegolfowane / wyjaśnione:

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.

Ponieważ jest to moja pierwsza odpowiedź na , pomocna byłaby konstruktywna krytyka i / lub sugestie!


1
Użyj pojedynczych spacji do wcięcia, aby zgolić niektóre bajty. W rzeczywistości, cała pętla może być inlined: while b!=0:print(a+" "*int(len(a))*c+1);b-=1. Co więcej, while b:jest równoważne while b!=0, więc brakuje 3 kolejnych bajtów.
Mego

Bugfix: wejście 1 drukuje teraz 1, a nie infiniteloop (moja przeglądarka naprawdę trochę mnie zasmuciła). To zajmuje teraz o wiele więcej bajtów.
OldBunny2800

2

Rdza, 141 137 bajtów

Wykorzystywał niektóre elementy formatowania, w przeciwnym razie byłoby to o wiele dłużej.

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

Rozpakowane:

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

Link do placu zabaw


To nie działa, kiedy próbuję tutaj . Jak mogę to przetestować?
Rɪᴋᴇʀ

Oto link do placu zabaw, abyś mógł go przetestować. Użyłem zamknięcia, więc najpierw przypisz go do zmiennej, a potem ją wywołaj.
Aceeri 04.04.16

Fajnie. Naprawdę nie znam rdzy, ale świetna odpowiedź!
Rɪᴋᴇʀ

2

PowerShell, 98 96 95 83 82 75 bajtów

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

Skrypt testowy niepoznany i wyjaśniony:

$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

Wynik:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.