สร้างเมทริกซ์พีระมิด


23

พีระมิดเมทริกซ์เป็นเมทริกซ์สี่เหลี่ยมจัตุรัสซึ่งจำนวนทั้งหมดเพิ่มขึ้นหรือลดลงจากจุดกึ่งกลางเช่นเมทริกซ์สองตัวด้านล่าง:

1  1  1  1  1
1  2  2  2  1
1  2  3  2  1
1  2  2  2  1
1  1  1  1  1

หรือ:

3  3  3  3  3
3  2  2  2  3
3  2  1  2  3
3  2  2  2  3
3  3  3  3  3

ได้รับไม่ใช่ศูนย์จำนวนเต็มnสร้างเมทริกซ์เสี้ยมที่ตัวเลขไปจาก1การnอย่างใดอย่างหนึ่งในการสั่งซื้อที่เพิ่มขึ้น (ถ้า n <0) หรือสั่งซื้อลดลง (ถ้า n> 0) จากศูนย์ ถ้าnเป็นเลขคู่จะมีเลขศูนย์ 4 ตัว (ดูตัวอย่าง)

เหมือนเคย:

  • รูปแบบอินพุตและเอาต์พุตเสริม
    • จำนวนช่องว่างตัวคั่น ฯลฯ เป็นตัวเลือก

กรณีทดสอบ:

1
1

-1
1

5
1  1  1  1  1  1  1  1  1
1  2  2  2  2  2  2  2  1
1  2  3  3  3  3  3  2  1
1  2  3  4  4  4  3  2  1
1  2  3  4  5  4  3  2  1
1  2  3  4  4  4  3  2  1
1  2  3  3  3  3  3  2  1
1  2  2  2  2  2  2  2  1
1  1  1  1  1  1  1  1  1

-5
5  5  5  5  5  5  5  5  5
5  4  4  4  4  4  4  4  5
5  4  3  3  3  3  3  4  5
5  4  3  2  2  2  3  4  5
5  4  3  2  1  2  3  4  5
5  4  3  2  2  2  3  4  5
5  4  3  3  3  3  3  4  5
5  4  4  4  4  4  4  4  5
5  5  5  5  5  5  5  5  5

2
1  1  1  1
1  2  2  1
1  2  2  1
1  1  1  1

-2
2  2  2  2
2  1  1  2
2  1  1  2
2  2  2  2

-4
4  4  4  4  4  4  4  4
4  3  3  3  3  3  3  4
4  3  2  2  2  2  3  4
4  3  2  1  1  2  3  4
4  3  2  1  1  2  3  4
4  3  2  2  2  2  3  4
4  3  3  3  3  3  3  4
4  4  4  4  4  4  4  4

10
เหตุใดเคสคู่จึงแตกต่างจากเคสแปลก ๆ ไม่มีเหตุผลใดที่เมทริกซ์ไม่สามารถทำตามรูปแบบเดียวกันทั้งหมดได้
Greg Martin

2
เนื่องจากอินพุตควรเป็นความยาวของผนังด้านข้างซึ่งในกรณีนี้มีความแตกต่างระหว่างคี่กับคู่ ฉันตัดสินใจที่จะไปหาค่าสูงสุดแทน แต่ก็รักษาความแปลกและความแตกต่างไว้ที่นั่น อาจดูแปลกและอาจไม่ใช่คำอธิบายที่ดี แต่เป็นคำอธิบายว่าทำไมจึงมีความแตกต่าง :-)
Stewie Griffin

2
เราคิดได้-10 < n < 10ไหม?
ติตัส

2
มันก็โอเคถ้ามันดูไม่เหมือนสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบตราบใดที่มันเป็นตัวเลข หากแถวที่มีหลาย 10 กว้างกว่านั้นที่มีเพียงไม่กี่ 10 วินาทีก็ไม่เป็นไร ...
Stewie Griffin

คำตอบ:


5

เยลลี่ , 18 17 ไบต์

|1ŒḄfR«þ`
AÇạẋ¡CG

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

|1ŒḄfR«þ`  Helper link. Argument: k (positive integer)

|1         Take the bitwise OR with 1. This increments k if it is even.
  ŒḄ       Bounce; yield [1, 2, ..., k | 1, ..., 2, 1].
    fR     Filter range; remove elements not in [1, ..., k] from the array.
           This results in [1, 2, ..., k, ..., 2, 1] if k is odd and in
           [1, 2, ..., k, k, ..., 2, 1] if k is even.
        `  Pass the last return value as left and right argument to:
      «þ     Minimum table; take the minimum of each pair of elements in the
             generated array, returning a 2D array.


AÇạẋ¡CG      Main link. Argument: n

A            Take the absolute value of n.
 Ç           Call the helper link on the result.
     C       Complement; yield 1 - n.
    ¡        Conditional application:
   ẋ           If repeating the return value of Ç 1 - n times results in a non-
               empty array, i.e., if n < 1:
  ạ              Take the absolute differences of the generated integers and 1 - n.
      G      Grid; join columns by spaces, rows by linefeeds.

7

EXCEL: 126 ไบต์

=MAX(MIN(MIN(CELL("row",RC)-1,CELL("col",RC)-1),MIN(((ABS(R1C1)-1)*2+3)-CELL("row",RC),((ABS(R1C1)-1)*2+3)-CELL("col",RC))),0)

ลองออนไลน์ *

หมายเหตุ: คำตอบนี้ใช้สัญกรณ์ R1C1 หากคุณกำลังจะลองด้วยตัวเอง คุณต้องเปิดใช้งานในตัวเลือกของ Excel

สูตรที่กำหนดจะต้องอยู่ในทุกเซลล์ที่อยู่นอกเหนือ (2,2) ใส่ขนาดปิรามิดที่คุณต้องการลงไป (1,1)

ฝาหน้าจออย่างรวดเร็วของสูตรที่ใช้งานอยู่:
enter image description here

นี่คือรูปภาพเพิ่มเติมของความสนุกด้วยการจัดรูปแบบตามเงื่อนไข!

* ใช้เวลาในการอัปเดตนานมาก


สิ่งนี้ไม่สามารถจัดการกับคดีที่เป็นลบหรือกรณีที่ถูกต้องได้ นอกจากนี้คุณสามารถย่อรหัส=MAX(MIN(MIN(ROW()-1,COLUMN()-1),MIN(((ABS(A1)-1)*2+3)-ROW(),((ABS(A1)-1)*2+3)-COLUMN())),0)ที่มีขนาด 92 ไบต์ได้ มันยังไม่จัดการกรณีและไม่สามารถลากสูตรได้เนื่องจากการอ้างอิงเซลล์ไม่ถูกล็อค
gtwebb

1
กอล์ฟเพิ่มเติมปัญหาเดียวกันแม้ว่า =MEDIAN(MIN(ROW()-1,COLUMN()-1),ABS(A1)*2+1-MAX(ROW(),COLUMN()),0)
gtwebb

@ gtwebb ขอบคุณที่บอกฉัน ฉันจะต้องแก้ไข

-1 มันใช้งานไม่ได้ มันไม่ได้จัดการกับอินพุตเชิงลบ มันไม่ได้จัดการแม้กระทั่งการป้อนข้อมูล หากคุณใส่สูตรนี้ลงในเซลล์ที่ใช้งานได้ทุกเซลล์คุณต้องใช้ a Rangeหรือคุณต้องการ heck มากกว่า 126 ไบต์
AdmBorkBork

7

Python 2, 109 99 98

n=input()
r=range(1,abs(n)+1)
l=r+r[~n|-2::-1]
for j in l:print[abs((n<0)*~-n+min(i,j))for i in l]

สร้างรายการ

l = [1,2,3,4,5,4,3,2,1]

และเล่นกับมันเล็กน้อย


แก้ไข: วิธีใหม่ในการสร้างรายการ + thx Lynn สองไบต์


If n is even, then there will be 4 center numbers
ร็อด

@Rod ไม่มีจะไม่มี อะไรทำให้คุณคิดอย่างนั้น
pacholik

3
นี่เป็นหนึ่งในกฎ
Rod

@ Rod Oh เมื่อไม่กี่นาทีที่ผ่านมา แก้ไข
pacholik

2
ไม่ใช่เรื่องใหม่ไม่ใช่แค่ไฮไลต์: c
Rod

6

MATL , 26 24 ไบต์

oXyG|to-:"TTYaQ]G0<?G+q|

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด (แก้ไขรหัสเล็กน้อยเพื่อใช้เป็นชุดทดสอบ)

คำอธิบาย

nรหัสแรกสร้างอาร์เรย์ที่ส่งออกสมมติว่าการป้อนข้อมูลในเชิงบวก อาเรย์ถูกเริ่มต้นให้เป็น1อินพุตคี่หรือเป็นอาเรย์ที่ว่างสำหรับการป้อนข้อมูลแบบคู่ จากนั้นทำซ้ำnครั้งต่อไปนี้สำหรับการป้อนข้อมูลคู่และn-1เวลาสำหรับการป้อนข้อมูลคี่: ขยายอาร์เรย์ด้วยเฟรมที่มี0และเพิ่ม1องค์ประกอบทั้งหมด

ตัวอย่างเช่นขั้นตอนสำหรับการป้อนข้อมูลnคือ:

  • อาร์เรย์เริ่มต้น:

    1
    
  • ขยายด้วยกรอบ:

    0 0 0
    0 1 0
    0 0 0
    
  • เพิ่ม1:

    1 1 1
    1 2 1
    1 1 1
    
  • ขยายด้วยกรอบ:

    0 0 0 0 0
    0 1 1 1 0
    0 1 2 1 0
    0 1 1 1 0
    0 0 0 0 0
    
  • เพิ่ม1:

    1 1 1 1 1
    1 2 2 2 1
    1 2 3 2 1
    1 2 2 2 1
    1 1 1 1 1
    

สิ่งนี้ให้เอาต์พุตที่ถูกต้องสำหรับอินพุตที่เป็นบวก หากอินพุตเป็นลบอาร์เรย์จะต้องแก้ไขโดยการเพิ่มอินพุตลบ1และรับค่าสัมบูรณ์:

    3 3 3 3 3
    3 2 2 2 3
    3 2 1 2 3
    3 2 2 2 3
    3 3 3 3 3

คุณสามารถดูอาเรย์เติบโต (รหัสที่แก้ไขแล้วเพื่อแสดงขั้นตอนกลาง) ที่MATL Online ล่ามยังคงเป็นรุ่นเบต้า หากไม่ได้ผลให้กด "Run" อีกครั้งหรือโหลดหน้าซ้ำ

รหัสแสดงความคิดเห็น

o        % Take input implicitly and push 0 if even or 1 if odd
Xy       % Identity matrix of that size. Gives either 1 or empty array
G|       % Absolute value of input
to-      % Subtract 1 if odd
:"       % For loop: repeat that many times
  TTYa   %   Add a frame of zeros in the two dimensions
  Q      %   Add 1 to all elements
]        % End for
G        % Push input again
0>       % is it negative?
?        % If so
  G      %   Push input again
  +      %   Add
  q      %   Subtract 1
  |      %   Absolute value
         % End if implicitly
         % Display implicitly

ฉันเห็นคุณใช้รหัสจากคำถามภาพเคลื่อนไหวอีกครั้ง ! น่ากลัว ส่วนที่ตลกคือรหัสนี้จะยังคงชนะในคำถามนั้นแม้ว่าจะยาวกว่าเวอร์ชั่นอื่นของคุณก็ตาม)
Magic Octopus Urn

1
@carusocomputing ใช่มันคล้ายกัน: ซ้ำกัน, การแสดง, หยุด 1 วินาทีส่งออกที่ชัดเจน :-)
หลุยส์ Mendo

นอกจากนี้ไม่แน่ใจว่าทำไม แต่อินพุตใด ๆ ที่สูงกว่า 14 หยุดที่ 14 ยกเลิกว่าเป็นข้อ จำกัด ของคอนโซลออนไลน์ "การดำเนินการหมดเวลา"
Magic Octopus Urn

@carusocomputing ข้อผิดพลาดแจ้งว่า "การหมดเวลาใช้งาน" ฉันเดาว่าใช้เวลานานเกินไปสำหรับล่าม ลองลดการหยุดที่จะพูด.2วินาที
หลุยส์ Mendo

@carusocomputing ใช่นั่นเป็นเวลาที่ล่ามออนไลน์ ขณะนี้เรา จำกัด งานถึง 30 วินาที ดังที่ Luis แนะนำคุณสามารถลดเวลาหยุดชั่วคราวได้
Suever

3

Python 2.7: 123 122 120 ไบต์

probs ยังสามารถบันทึกไม่กี่ไบต์ ...

from numpy import*
n=input()
N=abs(n)
e=N*2-N%2
a=ones([e,e])
for i in range(N):a[i:e-i,i:e-i]=(i+1)*(n>0)or-n-i
print a

edit1: N=abs(n)เพื่อบันทึก 1 ไบต์

edit2: (i+1)*(n>0)or-n-iเพื่อบันทึก 2 ไบต์


3

Haskell, 119 113 110 104 102 101 ไบต์

f x|(h,t)<-splitAt(mod x 2)$[x,x-1..1]++[1.. -x]=foldl(\m n->(n#)<$>(n<$m)#m)[[y]|y<-h]t
x#y=x:y++[x]

ผลตอบแทนเมทริกซ์เป็นรายการของรายการของจำนวนเต็มตัวอย่างเช่น: ->f 2[[1,1,1,1],[1,2,2,1],[1,2,2,1],[1,1,1,1]]

มันทำงานอย่างไร:

            [x,x-1..1]++[1.. -x]      -- make list from x down to 1 followed by
                                      -- 1 to (-x). One of the sublists will be
                                      -- empty. The resulting list contains the
                                      -- numbers of the pyramid from inside to out.
   (h,t)<-splitAt(mod x 2)            -- bind h to the first element if x is odd
                                      -- or to the empty list if x is even
                                      -- bind t to the rest (tail or full list)

foldl (     ) [[y]|y<-h] t            -- fold the following function into t with a
                                      -- starting value of [] if x is even or
                                      -- [[h]] if x is odd

   \m n ->                            -- the current matrix m with the next number
                                      -- n is transformed into a new matrix:

               (n#)<$>(n<$m)#m        -- prepend and append a n to 
                                      -- m prepended and append by a line of n's

x#y=x:y++[x]                          -- helper function to prepend and append an
                                      -- element x to a list y

2

Perl, 175 ไบต์

รวม 1 -pไบต์

($t,$v,$w)=($_,(abs)x2);$k=$_.$k for 1..$v;map{$r.=$_ for(@v=1..$_-1),$_ x(2*$v---$w%2),reverse@v;$r.=$/}1..$v;$_=$r.~~reverse$r;eval"y/1-$w/$k/"if$t<0;$w%2&&s/

.*//||s;

;

(มีบรรทัดใหม่ที่ต่อท้ายที่ฉันไม่รู้ว่าจะแสดงอย่างไรกับ markdown แต่คุณต้องการ)

ความต้องการ-pเช่นเดียวกับ-M5.010หรือ-Eเพื่อเรียกใช้:

perl -pE '($t,$v,$w)=($_,(abs)x2);$k=$_.$k for 1..$v;map{$r.=$_ for(@v=1..$_-1),$_ x(2*$v---$w%2),reverse@v;$r.=$/}1..$v;$_=$r.~~reverse$r;eval"y/1-$w/$k/"if$t<0;$w%2&&s/

.*//||s;

;
' <<< 5

นี่มันนานเกินไป ... ข้าจะลองวิธีอื่นเมื่อข้ามีเวลา


ทำไมคุณถึงใช้ eval ?
ติตัส

@Titus เพราะy///ไม่ตีความเพื่อให้เป็นใช้คำพูดสองสอดแทรก$wและ$kแล้วในการดำเนินการeval y///
Dada


2

J, 29 26 ไบต์

1+**[:<./~**i.,2&|1&}.i.@-

การใช้

   f =: 1+**[:<./~**i.,2&|1&}.i.@-
   f 1
1
   f _1
1
   f 2
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
   f _2
2 2 2 2
2 1 1 2
2 1 1 2
2 2 2 2
   f 3
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
   f _3
3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3

คำอธิบาย

i.กริยาช่วงเอาต์พุต[0, 1, ..., n-1]สำหรับค่าบวกnและ[n-1, n-2, ..., 0]ค่าลบnซึ่งมีประโยชน์ที่นี่

1+**[:<./~**i.,2&|1&}.i.@-  Input: integer n
                         -  Negate n
                      i.@   Creates range for -n
               2&|          Take n modulo 2, returns 0 or 1
                  1&}.      If n is odd, drop the first value from the range for -n
                            Else do nothing and pass it unmodified
              ,             Append it to
            i.              The range for n
          *                 Get the sign of n
           *                Multiply elementwise with the joined ranges
    [:<./~                  Form a table of the minimum values of the range
  *                         Get the sign of n
   *                        Multiply elementwise with the joined ranges
1+                          Add 1 to each and return

2

Mathematica, 78 ไบต์

Abs[Fold[ArrayPad[#,1,#2]&,Table[0,#,#]&@Mod[#,2,1],Range[Abs@#-1]]+1~Min~-#]&

คำอธิบาย

Table[0,#,#]&@Mod[#,2,1]

ทำเมทริกซ์เริ่มต้น: 1x1 ถ้าแปลก, 2x2 ถ้าเท่ากัน

Range[Abs@#-1]

สร้างรายการจาก 1 ถึง abs (อินพุต) - 1

Fold[ArrayPad[#,1,#2]&, ..., ...]

รองอาร์เรย์เริ่มต้นโดยใช้รายการข้างต้น

... +1~Min~-#

เพิ่ม 1 หรือ - อินพุตแล้วแต่จำนวนใดจะน้อยกว่า

Abs

ใช้ค่าสัมบูรณ์กับเมทริกซ์ทั้งหมด


1

PHP, 177 157 ไบต์

for($y=-$n=abs($z=$argv[1])+1;++$y<$n;)if($y&&($n&1||$y-1)){for($x=-$n;++$x<$n;)if($x&&($n&1||$x-1)){$v=max(abs($x),abs($y));echo$z<0?$v:$n-$v," ";}echo"
";}

ทำงานด้วย php -r '<code>

วนรอบแถวและคอลัมน์พิมพ์ค่าขึ้นอยู่กับระยะทางไปยังศูนย์กลาง

  • $n=abs($z)+1: การ+1บันทึกสองสาม+1และ-1ในการแสดงออกในภายหลัง
  • ลูปไปจาก-$n+1(เพิ่มขึ้นตามเงื่อนไข!) เป็น$n-1( -abs($z)ถึงabs($z))
  • บรรทัด / คอลัมน์ 0 (และสำหรับเลขคี่$n: 1) ถูกข้ามไป
    ($n&1ที่เป็นจริงสำหรับคอลัมน์แม้ที่นี่จำ! +1?)
  • พิมพ์บวก $ Z +1ยังได้รับประโยชน์จาก

1

Haskell, 191 183 173 169 168 ไบต์

r=reverse;m=map
x!y=(((++)<*>(x.r)).).zipWith(++).m y
g n|n<0=m(m$abs.((n-1)+)).g$abs n|1<2=[id!id,tail!init]!!mod n 2=<<m r$r$m(\x->(x<$[1..x])++[x+1..n])[1..n]
g.(0-)

การใช้งาน:

mapM_ print $ (g.(0-)) 3

[1,1,1,1,1]
[1,2,2,2,1]
[1,2,3,2,1]
[1,2,2,2,1]
[1,1,1,1,1]

ขอบคุณ nimi สำหรับ2 10 20 24 ไบต์!


1
negateเป็น (0-)
Nimi

1
คุณสามารถเปลี่ยนfเป็น[id!id,tail!init]!!mod n 2และจากนั้นอินไลน์เข้าไปgและใช้1<2ยามเพื่อผูกผลกลางของสาขา: g n| ... |q<-r<$>a n=([id!id,tail!init]!!mod n 2)q$a n. คุณไม่ต้องการชื่อฟังก์ชั่นหลัก
nimi

1
โอ้คุณสามารถ inline aเกินไป (และเปลี่ยนกลับไปเป็นยาม):1<2 g n| ... |1<2=[id!id,tail!init]!!mod n 2=<<map r$r$(\x->(x<$[1..x])++[x+1..n])<$>[1..n]
nimi

1
สุดท้ายสำหรับวันนี้: m=mapใน!: ...(++).m yและ:g g n|n<0=m(m(abs.((n-1)+)))$g$abs n|1<2=[id!id,tail!init]!!mod n 2=<<m r$r$m(\x->(x<$[1..x])++[x+1..n])[1..n]
nimi

1

JavaScript (ES6), 107 ไบต์

(n,l=Math.abs(n+n-n%2))=>[...Array(l--)].map((_,i,a)=>a.map((_,j)=>(j=Math.min(i,l-i,j,l-j),n<0?-n-j:j+1)))

lคือขนาดของอาเรย์ n<0?-n-j:j+1น่าอึดอัดใจ แต่ฉันไม่สามารถหาอะไรที่ดีกว่า


1

เป็นกลุ่ม, 152 143 ไบต์

ฉันแน่ใจว่านี่สามารถตีกอล์ฟได้มากกว่าโดยเฉพาะสองบรรทัดสุดท้าย แต่สมองของฉันทอด

D:let@z=@-/abs(@-)
a"nywYp:s/\d/x/g<C-v>
YggP:%s/.*/x \0 x<C-v>
:%s/x\+/\=@n-@z/g<C-v>
<Esc>v0"qda<C-r>=@z<0?1:@-*@z
<Esc>@=@-%2?"":"YPJYp"
@=@-*@z-1.(@-*@z>1?"@q":"")

ลองออนไลน์!

นี่คือรูปแบบ xxd ที่มีอักขระที่ไม่สามารถพิมพ์ได้:

0000000: 443a 6c65 7440 7a3d 402d 2f61 6273 2840  D:let@z=@-/abs(@
0000010: 2d29 0a61 226e 7977 5970 3a73 2f5c 642f  -).a"nywYp:s/\d/
0000020: 782f 6716 0a59 6767 503a 2573 2f2e 2a2f  x/g..YggP:%s/.*/
0000030: 7820 5c30 2078 160a 3a25 732f 785c 2b2f  x \0 x..:%s/x\+/
0000040: 5c3d 406e 2d40 7a2f 6716 0a1b 7630 2271  \=@n-@z/g...v0"q
0000050: 6461 123d 407a 3c30 3f31 3a40 2d2a 407a  da.=@z<0?1:@-*@z
0000060: 0a1b 403d 402d 2532 3f22 223a 2259 504a  ..@=@-%2?"":"YPJ
0000070: 5970 220a 403d 402d 2a40 7a2d 312e 2840  Yp".@=@-*@z-1.(@
0000080: 2d2a 407a 3e31 3f22 4071 223a 2222 29    -*@z>1?"@q":"")

คำอธิบาย

มันสร้างปิรามิดจากจุดศูนย์กลางโดยรอบเลขศูนย์ด้วยxes:

x x x
x 5 x
x x x

จากนั้นจะแทนที่xes ด้วยหมายเลขถัดไปและล้อมรอบด้วยxes อีกครั้ง:

x x x x x
x 4 4 4 x
x 4 5 4 x
x 4 4 4 x
x x x x x

... และต่อไป สำหรับเลขคู่มันทำสิ่งเดียวกัน แต่เริ่มต้นด้วยฐาน 2x2

นี่คือรหัส "ungolfed" มันค่อนข้างแปลกที่ฉัน "บันทึก" แมโครด้วยการพิมพ์ลงในบัฟเฟอร์ (ด้วยเหตุนี้ทั้งหมด<C-v>) จากนั้นลบมันลงในทะเบียนซึ่งเป็นวิธีที่ดีที่สุดที่ฉันพบว่าเขียนแมโครโดยไม่มีการกดแป้นจริง

D:let@z=@-/abs(@-)<CR>       " Delete the input (into @-) and set @z to -1 if @- is negative; otherwise 1
a                            " Enter insert mode to compose the macro
  "nyw                         " Copy the number under the cursor to @n
  Yp                           " Copy this line and paste it below
  :s/\d/x/g<C-v><CR>           " Replace digits in the copy with 'x'
  YggP                         " Copy this line and paste it at the top of the buffer
  :%s/.*/x \0 x<C-v><CR>       " Add an 'x' before and after each line
  :%s/x\+/\=@n-@z/g<C-v><CR>   " Replace all 'x'es (and 'xx'es etc.) with the next number
<Esc>v0"qd                   " Done composing macro; delete it into @q (buffer is now empty)
a<C-r>=@z<0?1:@-*@z          " Append the center number (1 or abs(@-)) to the buffer
<Esc>@=@-%2?"":"YPJYp"       " If the input is even, make a 2x2 square
@=@-*@z-1.(@-*@z>1?"@q":"")  " Execute the macro abs(@-)-1 times if it's > 1

0

PHP, 215 ไบต์

for($i=0;$i<$m=($r=($s=abs($n=$argv[1]))*2-$s%2)**2;){$i%$r?:print"\n";$l=min(($x=$i%$r+1)<$s?$x:$x=$r-$x+1,($z=1+floor($i++/$r))<$s?$z:$z=$r-$z+1);$o=($n>0)?$l:$s+1-$l;echo str_pad(" ",1+strlen($s)-strlen($o)).$o;}

0

R, 112 ไบต์

k=abs(n);l=2*k;m=diag(l);for(i in 1:k){m[i:(l+1-i),i:(l+1-i)]=i};if(n%%2==1){m=m[-k,-k]};if(n<0){m=abs(m-1+n)};m

ต้องการจำนวนเต็มnในเวิร์กสเปซมิฉะนั้นรันn=scan()เป็น 8 ไบต์พิเศษ

k=abs(n)
l=2*k
m=diag(l)                    # Initialize quadratic 2*|n| matrix
for(i in 1:k){
    m[i:(l+1-i),i:(l+1-i)]=i # Assign values to matrix elements according
                             # to their index
}
if(n%%2==1){
   m=m[-k,-k]                # If n is odd, delete middle row and column
}
if(n<0){
    m=abs(m-1+n)             # If n < 0, flip values
}
m                            # Print matrix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.