พิมพ์ N Squared


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

รูปแบบต่อเนื่องผ่าน69

ถ้า N คือ10ผลลัพธ์คือ:

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

ขอให้สังเกตว่านี่ไม่ใช่สแควร์จริง มันสูง 10 แถว แต่กว้าง 20 คอลัมน์เพราะ10มีความยาวสองตัวอักษร สิ่งนี้มีวัตถุประสงค์ ประเด็นก็คือแต่ละด้านของ "สแควร์" มี 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 แต่จะมี 1,000 แถวและ 4,000 คอลัมน์ ตัวเลขที่มีตัวเลข 4 หลักขึ้นไปจะต้องทำงานเหมือนตัวเลขที่เล็กกว่า

รายละเอียด:

  • N จะต้องเขียนในการแสดงตัวเลขทศนิยมตามปกติโดยไม่มี+เครื่องหมายหรือไม่ใช่ตัวเลขอื่น ๆ
  • พื้นที่กลวงจะต้องเต็มไปด้วยช่องว่าง
  • ไม่ควรมีเส้นนำหรือช่องว่างต่อท้าย
  • ขึ้นบรรทัดใหม่เดียวหลังจากบรรทัดสุดท้ายของช่องสี่เหลี่ยมอนุญาตให้เลือกได้
  • ภาษาเขียนขึ้นหลังจากที่ท้าทายนี้ถูกสร้างขึ้นมาจะต้อนรับพวกเขาก็ไม่มีสิทธิ์ที่จะชนะ
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

18
สแควร์สำหรับ n = 10 ดูสแควร์มากกว่า n = 5 ไชโยแบบอักษรที่ไม่ใช่ตาราง!
nneonneo

เราจะเอาจำนวนเต็มเป็นสตริงได้ไหม?
2559

1
@ Nᴮᶻใช่คุณอาจจะ
งานอดิเรกของ Calvin

คำตอบ:


6

Jolf, 31 27 25 23 ไบต์

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

นี่คือการเข้ารหัสในการเข้ารหัส ISO-8859-7 และมี unprintables ดังนั้นนี่คือ hexdump:

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

Shtriped , 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 บรรทัดสุดท้ายของโปรแกรมเท่านั้น

ไม่มีสตริงใดใน Shtriped คุณสามารถรับและพิมพ์สตริงได้ แต่สตริงทั้งหมดจะแสดงภายในเป็นจำนวนเต็มความแม่นยำโดยพลการซึ่งสามารถเพิ่มและลดค่าได้เท่านั้น ดังนั้นจึงไม่มีวิธีที่ง่ายที่จะได้ความยาวของสายอักขระ10สำหรับเติมลงในจัตุรัสกลางด้วยช่องว่างในปริมาณที่เหมาะสม ฉันต้อง Cobble ฟังก์ชั่น~ที่คำนวณfloor(log10(N)) + 1หาความยาวของ N เป็นทศนิยมได้อย่างมีประสิทธิภาพ

นี้อาจอาจจะแข็งแรงเล่นกอล์ฟมากขึ้นอีกนิดด้วยการจัดเรียงที่และวิธีการที่จะใช้ตัวแปร แต่ไม่ว่ามากขึ้น ไม่มีข้อ จำกัด โดยธรรมชาติของ Shtriped (มันไม่เคยหมายถึงการเป็นภาษากอล์ฟเลย)

รหัสความคิดเห็น (แบ็กสแลชคือความคิดเห็น):

@ 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 ไบต์

a4 ที่บันทึกไว้ต้องขอบคุณ @ 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เพื่อบันทึกไบต์
Neil

@ user81655 ขอบคุณที่แก้ไขมัน
Downgoat

5
@Neil ขอบคุณ แต่นั่นไม่ปรากฏว่าจะบันทึกไบต์ใด ๆ น่าเสียดาย
Downgoat

ขออภัยฉันต้องผิดพลาด
Neil

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เพื่อรับการแสดงข้อความ

โปรดทราบว่าการสาธิตนี้ไม่ได้แสดงความกว้างคงที่ตัวอักษร ดังนั้นจะหนากว่า71


แก้ไข:

หากเราถือว่าอินพุตเป็นสตริง:

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 แต่ฉันจะถาม meta และแจ้งให้คุณทราบ
lad2025

1
คุณสามารถบันทึกไม่กี่ไบต์ด้วยการทำให้ s varchar (เช่นนี้ '6') จากนั้นคุณสามารถแทนที่ concat ด้วย +
t-clausen.dk

1
ดูเหมือนว่าคุณขาดช่องว่าง ฉันเชื่อว่าคุณสามารถแก้ไขได้ด้วยการเขียน (s-2)
t-clausen.dk

4

Julia, 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 rectangle ไปที่ STDOUT หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

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

ลองออนไลน์


4

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

เรติน่า 76 ไบต์

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

คำอธิบายอาจจะมาในวันพรุ่งนี้

ลองออนไลน์ได้ที่นี่


7
เป็นเวลานานแล้วตั้งแต่วันพรุ่งนี้
CalculatorFeline

มันเป็นมากกว่าปีมาแล้วตั้งแต่วันพรุ่งนี้
Leun Nun

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}

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 
}

และเช่นเคยเพื่อเรียกใช้ฟังก์ชั่น [](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

@cat ขอบคุณ ฉันกำลังมองหาลิงค์สำหรับสิ่งนั้น อย่างไรก็ตามบรรทัดสุดท้ายที่มีจาก FROM นั้นเพิ่งประกาศและกำหนดค่าให้กับ X ฉันได้ยินมาว่าการกำหนดค่าและการประกาศตัวแปรไม่นับ โปรดแก้ไขฉันหากฉันผิด ฉันพยายามบันทึกสองสามไบต์ด้วยการกำหนดตัวแปรนี้ ตัวแปรปกติจะมีคำนำหน้า@ต้นทุน 1 ไบต์พิเศษสำหรับทุกครั้งที่ใช้มัน
t-clausen.dk

1
@mazzy ใช่แล้ว - 3. เพิ่มบรรทัดสุดท้าย (เมื่อจำเป็น)
t-clausen.dk

3

Minkolang 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$.:''

ตรงไปตรงมาสวย อาร์กิวเมนต์ commandline แรกถูกใช้เป็นตัวเลข perl file.pl 1วางสคริปต์ในแฟ้มและทำงานด้วย


shiftpopสามารถถูกแทนที่ด้วย
Oleg V. Volkov

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

@Giuseppe และตอนนี้สำหรับสิ่งที่อ่านไม่ได้อย่างสมบูรณ์ ... บันทึกอีกหนึ่งไบต์
JayCe

write("[<-"(matrix(x<-scan(),x,x),k<--c(1,x),k,gsub("."," ",x)),1,x,,"")72 ไบต์
J.Doe

3

Pyth - 26 ไบต์


K*QQjbm++Q**lQ;ttQQttQK

ลองมันออนไลน์ได้ที่นี่


@FryAmTheEggman ปุ่ม Permalink ดูเหมือนว่าจะหัก
Maltysen

3

Pip -l , 21 ไบต์

ใช้คุณสมบัติภาษาใหม่กว่าคำถามซึ่งได้รับอนุญาตตามนโยบายปัจจุบัน หากข้อความของคำถามถูกตีความเพื่อลบล้างนโยบายดังกล่าวให้ดูที่คำตอบ 25 ไบต์ด้านล่าง

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

ลองออนไลน์!

ขอบคุณคำตอบ MATLของ Luis Mendo สำหรับ(a+1)%n<2เคล็ดลับ

คำอธิบาย

Yqอ่านบรรทัดจาก stdin และ yanks 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#ylen(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
ฉันโพสต์คำตอบของจอประสาทตาด้วย แต่ก็ไม่ได้เล็กไปกว่านี้ (คุณสามารถใช้แทนที่จะ;กำจัดขั้นตอนสุดท้ายได้หรือไม่)
Randomra

@ randomra Well 80 <90 ไม่มีข้อโต้แย้งจากฉัน :)
Digital Trauma

และถ้าคุณใช้ Pilcrow เป็นอย่างคล่องแคล่ว[^¶]+ .+
randomra

2

เยลลี่ขนาด 28 ไบต์

Grr ไม่สามารถบอกได้ว่าเยลลี่แย่ที่สายหรือถ้าฉันไม่ดีที่เยลลี่

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

ลองออนไลน์


ฉันพยายามที่จะปรับมันเพื่อหาคำตอบ แต่โชคไม่ดีเลย: /
Sp3000

2

Pyke , 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*

ขอขอบคุณที่ @ ffMartinBüttnerสำหรับการแนะนำ 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=10เป็น->[1..10] >> "10""10101010101010101010"



1
@MaxYekhlakov: ขอบคุณ แต่โชคร้ายรุ่นของคุณไม่ทำงานสำหรับที่ตะโกนเอาท์พุทเดียว1 1นอกจากนี้คุณกลับรายการของสตริงในขณะที่ความท้าทายขอสตริงเดียว เรามีกฎ IO ที่เข้มงวดขึ้นในสมัยก่อนกฎ IO ที่ยืดหยุ่นนั้นเป็นสิ่งที่ใหม่กว่า
nimi

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 'ตัวเลือกในตอนท้ายของ regex ที่) โดยไม่เปลี่ยน 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

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

Ungolfed / อธิบาย:

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-=1inlined: นอกจากนี้while b:เทียบเท่ากับwhile b!=0นั่นคืออีก 3 ไบต์
Mego

แก้ไขข้อผิดพลาด: การป้อนข้อมูล 1 ตอนนี้พิมพ์ 1 ไม่ infiniteloop (เบราว์เซอร์ของฉันทำให้ฉันเศร้าโศกจริงๆ) ตอนนี้ใช้เวลามากขึ้นเป็นไบต์ไบต์
OldBunny2800

2

สนิม141 141ไบต์

ละเมิดสิ่งที่จัดรูปแบบบางอย่างมิฉะนั้นจะนานกว่านี้มาก

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

Ungolfed และอธิบายสคริปต์ทดสอบ:

$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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.