ลบเลขศูนย์โดยรอบของอาร์เรย์ 2d


40

นี้เป็นรุ่นที่ 2 มิติของคำถามนี้

รับอาร์เรย์ / เมทริกซ์ 2 มิติที่ไม่ว่างเปล่าที่มีจำนวนเต็มไม่ลบเท่านั้น:

[0000000010000010011100000]

เอาท์พุทอาร์เรย์ที่ลบศูนย์โดยรอบออกนั่นคือ subarray ที่ต่อเนื่องกันที่ใหญ่ที่สุดโดยไม่ต้องมีศูนย์โดยรอบ:

[010001111]

ตัวอย่าง:

[0000000010000010011100000][010001111]
Input:
[[0, 0, 0, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [0, 0, 1, 1, 1], [0, 0, 0, 0, 0]]

Output:
[[0, 1, 0], [0, 0, 1], [1, 1, 1]]

[00000003000005000000][003000500]
Input:
[[0, 0, 0, 0], [0, 0, 0, 3], [0, 0, 0, 0], [0, 5, 0, 0], [0, 0, 0, 0]]

Output:
[[0, 0, 3], [0, 0, 0], [5, 0, 0]]

[123456789][123456789]
Input:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Output:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

[000000000000][]
Input:
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Output:
[]

[000011110000][1111]
Input:
[[0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0]]

Output:
[[1, 1, 1, 1]]

[010001000100][111]
Input:
[[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]]

Output:
[[1], [1], [1]]

[111112311111][111112311111]
Input:
[[1, 1, 1, 1], [1, 2, 3, 1], [1, 1, 1, 1]]

Output:
[[1, 1, 1, 1], [1, 2, 3, 1], [1, 1, 1, 1]]

3
@MattH ไม่มีอะไรยากในภาษาที่ไม่ลึกลับ :)ยากที่จะทำให้สั้น
user202729

1
เราสามารถให้ผลลัพธ์ที่ผิดพลาดแทนเมทริกซ์ที่ว่างเปล่าสำหรับกรณีทดสอบครั้งสุดท้ายได้หรือไม่?
sundar

1
นอกจากนี้หากผลลัพธ์อาจเป็นเมทริกซ์ที่ไม่ได้เป็นตารางสี่เหลี่ยมโปรดเพิ่มกรณีทดสอบสำหรับสิ่งนั้น
sundar

1
กรณีทดสอบที่ส่งมาก่อนหน้านี้ของฉัน: [[0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0]](ผลลัพธ์มีความกว้าง / ความสูง1)
Conor O'Brien

1
เฮ้เป็นไปได้หรือไม่ที่จะเพิ่มกรณีทดสอบ
[111112311111]
เบต้าสลายลง

คำตอบ:


12

MATL , 3 ไบต์

JYa

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

คำอธิบาย

J      % Push 1j
Ya     % With complex 2nd input, this unpads the matrix in the
       % 1st input (implicit). The unpad value is 0 by default
       % Display (implicit)


5
ฉันชอบรหัสครึ่งหนึ่งแค่(implicit)นี้
JungHwan Min

39

ภาษา Wolfram (Mathematica) , 42 ไบต์

#&@@CellularAutomaton[{,{},0{,}},{#,0},0]&

ลองออนไลน์!

ออโตเซลลูลาร์มีแน่นอนคำตอบของชีวิต , จักรวาลและทุกอย่าง 1

อย่างไร?

CellularAutomatonยอมรับอาร์เรย์อินพุตและค่าพื้นหลังเพิ่มเติม ดังนั้น{#,0}ระบุว่าควรใช้กฎออโตมาตาเซลลูลาร์กับอินพุตโดยสมมติเป็นพื้นหลังของ0s

สิ่งที่เรียบร้อยที่นี่คือการCellularAutomatonปลูกพืชเอาท์พุทเพื่อให้ไม่มีเส้นขอบของเซลล์พื้นหลังที่มีอยู่

รหัสนี้ใช้กฎ{Null, {}, {0, 0}}- ใช้ส่วนหัวNullกับเพื่อนบ้าน 0-radius ของแต่ละเซลล์ (เช่นศูนย์กลางเท่านั้น: ตัวเซลล์เอง) - 0เวลาเท่ากันทุกประการ ผลลัพธ์ของสิ่งนี้คืออินพุตดั้งเดิม แต่เมื่อลบพื้นหลังออก (เช่นการครอบตัดโดยรอบ0s)


1. ดูจำนวนคำตอบของฉัน ;)


6
การทำทารุณกรรมที่ดีในตัว ... Mathematica นั้นมีในตัว แต่ไม่ได้สัมผัสโดยตรง
user202729

3
ไม่มีการอ้างอิงXKCD 505 ?
แยกผลไม้

+1 สำหรับ Cellular Automata และคำตอบสุดท้าย
HighlyRadioactive

14

JavaScript (ES6), 98 ไบต์

(a,z)=>(g=A=>A.slice(A.map(m=M=(r,i)=>M=(z?a:r).some(n=>z?n[i]:n)?1/m?i:m=i:M)|m,M+1))(a).map(z=g)

ลองออนไลน์!

อย่างไร?

เพื่อเอาชนะขาดที่ไปรษณีย์ในตัวเรากำหนดฟังก์ชั่นกรัม ()ที่สามารถทำงานบนทั้งแถวหรือคอลัมน์ของเมทริกซ์อินพุตa []ขึ้นอยู่กับค่าของธงชาติโลกZ

g ()ค้นหาดัชนีขั้นต่ำ mและดัชนีสูงสุด Mของแถวที่ไม่ว่าง (ถ้า zไม่ได้กำหนด) หรือคอลัมน์ที่ไม่ว่างเปล่า (ถ้ามีการกำหนด z ) และส่งคืนชิ้นที่สอดคล้องกันของเมทริกซ์เองหรือแถวที่กำหนด ของเมทริกซ์

เพื่อสรุป:

  • อันดับแรกเราลบแถวออกโดยเรียกใช้g ()บนเมทริกซ์โดยไม่ได้กำหนดz
  • จากนั้นเราลบคอลัมน์โดยเรียกใช้g ()ในแต่ละแถวที่มีการกำหนดzซึ่งนำไปสู่สิ่งนี้ค่อนข้างผิดปกติ.map(z=g)

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

(a, z) => (               // a[] = input matrix; z is initially undefined
  g = A =>                // g() = function taking A = matrix or row
    A.slice(              //   eventually return A.slice(m, M + 1)
      A.map(m = M =       //     initialize m and M to non-numeric values
        (r, i) =>         //     for each row or cell r at position i in A:
        M = (z ? a : r)   //       iterate on either the matrix or the row
        .some(n =>        //       and test whether there's at least one
          z ? n[i] : n    //       non-zero cell in the corresponding column or row
        ) ?               //       if so:
          1 / m ? i       //         update the maximum index M (last matching index)
                : m = i   //         and minimum index m (first matching index)
        :                 //       otherwise:
          M               //         let M (and m) unchanged
      ) | m,              //     end of map(); use m as the first parameter of slice()
      M + 1               //     use M+1 as the second parameter of slice()
    )                     //   end of slice()
  )(a)                    // invoke g() on the matrix with z undefined
  .map(z = g)             // invoke g() on each row of the matrix with z defined

2
นั่นเป็นสิ่งที่น่าประทับใจ
Jack Hales

3
@ Jek, Arnauld อาศัยอยู่ในมิติที่แตกต่างกันโดยสิ้นเชิง แต่ถ้าคุณโชคดีมากคุณสามารถหาเคล็ดลับที่เขาพลาดและโพสต์คำตอบสั้น ๆ ในกระบวนการนี้คุณจะได้พัฒนาความเข้าใจอย่างลึกซึ้งเกี่ยวกับ JavaScript
Rick Hitchcock

4
@ RickHitchcock ฉันไม่เก่งในการจดจำรูปแบบโค้ดและฉันพลาดสิ่งต่าง ๆ เป็นประจำแม้ว่าฉันจะเคยเห็นมาก่อนก็ตาม ในตัวอย่างนี้ฉันมุ่งเน้นไปที่การใช้ซ้ำของg ()และพลาดการปรับให้เหมาะสมอย่างชัดเจนเกี่ยวกับวิธีอัปเดตmและM (-9 ไบต์) ฉันยอมรับอย่างเต็มที่ว่าการเล่นโค้ดเป็นวิธีที่ยอดเยี่ยม (และสนุก) ในการเรียนรู้เกี่ยวกับรายละเอียดปลีกย่อยของภาษา
Arnauld

7

Haskell , 62 61 ไบต์

f.f.f.f
f=reverse.foldr(zipWith(:))e.snd.span(all(<1))
e=[]:e

ลองออนไลน์!

foldr(zipWith(:))eด้วยe=[]:eจะสั้นกว่าเล็กน้อยtransposeและsnd.span(all(<1))ปล่อยรายการนำหน้าศูนย์จากรายการของรายการ ในฐานะที่เป็นtransposeตามด้วยreverseในรายการ 2D เท่ากับการหมุน 90 °รหัสf.f.f.fเป็นเพียงครั้งที่สี่วางรายการชั้นนำของศูนย์และหมุน




5

Brachylog , 24 22 20 19 ไบต์

{s.h+>0∧.t+>0∧}\↰₁\

ลองออนไลน์!

เอาต์พุตเมทริกซ์ผลลัพธ์เป็นอาร์เรย์ของอาร์เรย์หรือเท็จสำหรับเอาต์พุตว่าง

(ขอบคุณ @Faleize สำหรับการแนะนำคำอธิบายแบบอินไลน์และบันทึก 1 ไบต์)

คำอธิบาย

กริยา 0 (หลัก):

{...}     Define and call predicate 1 to remove all-zero rows
  \       Transpose the result
   ↰₁     Call pred 1 again, now to remove all-zero columns
     \    Transpose the result to have correct output orientation

คำกริยาที่ 1:

?s.h+>0∧.t+>0∧
  .           output is
 s              a subsequence of the rows of
?              the input (implicit)
   h          also, output's head element (first row)
    +>0        has a sum > 0 (i.e. has at least one non-zero value)
       ∧.t+>0  and similarly the output's tail element (last row)
∧              (don't implicitly unify that 0 with the output)

เขียนแบบอินไลน์กริยาแรกคือ 1 {s.h+>0∧.t+>0∧}\↰₁\ ไบต์สั้น: (นี่เป็นความจริงสำหรับคำตอบของ Brachylog ใด ๆ การใช้เพรดิเคตในบรรทัดใหม่นั้นจะถูกนำไปใช้เฉพาะในกรณีที่คุณต้องการเขียนสิ่งที่อ่านได้มากขึ้นเท่านั้น)
ทำให้เสียชีวิต

@ ขอบคุณขอบคุณอัปเดต (ในที่สุด!) ฉันไม่เคยคิดเลยว่าไวยากรณ์ของอินไลน์เพรดิเคตจะเป็นทั้งแอปพลิเคชั่นคำจำกัดความและคำอธิบายที่ค่อนข้างเท่ห์
sundar

5

R , 96 100 97 ไบต์

function(m)m[~m,~t(m),drop=F]
"~"=function(x,z=seq(r<-rowSums(x)))z>=min(y<-which(r>0))&z<=max(y)

ลองออนไลน์!

~ผู้ช่วยยิงเวกเตอร์ที่ไม่ใช่เชิงลบและผลตอบแทนเวกเตอร์ด้วยFALSEสำหรับ "ภายนอก" 0s ของเวกเตอร์และTRUEสำหรับการบวกและการใด ๆ "ภายใน" 0s ฟังก์ชั่นนี้ใช้กับผลรวมของแถวและคอลัมน์ของเมทริกซ์อินพุต

~และ! ใช้ตัวแยกวิเคราะห์ของตัวดำเนินการ R

แก้ไขตามความคิดเห็นของ @ DigEmAll แต่มีบางไบต์ที่กลับมาจาก @ J.Doe


1
ฉันคิดว่าคุณควรเพิ่มdrop=Fอย่างที่ฉันทำมิฉะนั้นการทดสอบ 2 อย่างนี้จะคืนค่าเวกเตอร์แทนแถวและคอลัมน์: ลองออนไลน์!
digEmAll

97 ไบต์drop=Fด้วย ยังอยู่ภายใต้การตัน!
J.Doe

5

R , 89 79 ไบต์

function(m,y=apply(which(m>0,T),2,range)){y[!1/y]=0;m[y:y[2],y[3]:y[4],drop=F]}

ลองออนไลน์!

ขอบคุณ @ngm สำหรับรหัสกรณีทดสอบและ @ J.Doe สำหรับการบันทึก 10 ไบต์!

  • ฉันต้องเพิ่มdrop=Fพารามิเตอร์เนื่องจากพฤติกรรม R เริ่มต้นเปลี่ยนเมทริกซ์แถวเดี่ยว / คอลเป็นเวกเตอร์ ...

ฉันไม่ได้สังเกตว่ารหัสก่อนหน้าของฉันล้มเหลวกรณีทั้งหมดเป็นศูนย์ ... ตอนนี้มันคงที่น่าเสียดายที่มีจำนวนไบต์ที่มากขึ้น :(
digEmAll

1
ฉันหวังว่าฉันจะได้ +2 นี้ ใช้ fivenum ดีจริงๆ
JayCe

79 bytesใช้rangeและ tweaking การจัดทำดัชนี
J.Doe

1
@ J.Doe: ช่วงแน่นอน! ขอบคุณมากความคิด!
digEmAll


3

Python 2 , 71 ไบต์

ส่งคืนโดยการแก้ไขอินพุต รายการควรถูกส่งเป็นอินพุต

def f(a):exec'while a and 1>sum(a[-1]):a.pop()\na[:]=zip(*a)[::-1]\n'*4

ลองออนไลน์!


Python 2 , 77 ไบต์

สิ่งนี้ยังแก้ไขอินพุต แต่ก็ใช้งานได้ ...

def f(a):exec'while a and 1>sum(a[-1]):a.pop()\na=zip(*a)[::-1]\n'*4;return a

ลองออนไลน์!





2

Husk , 11 ไบต์

!5¡(T0mo↔↓¬

ลองออนไลน์!

ฉันรู้สึกเหมือนบางไบต์สามารถถูกโกนออกได้โดยทำให้!5¡ส่วนสั้นลง

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

!5¡(

5th

mo↔↓¬

แม็พกับเวอร์ชันปัจจุบันของอินพุตและ: ย้อนกลับแต่ละอันหลังจากปล่อยส่วนนำหน้าที่ยาวที่สุดที่เป็นศูนย์ของการทิ้งเท่านั้น (การวางคำนำหน้านี้ทำได้โดยใช้ Husk's ซึ่งเป็นฟังก์ชันที่ครอบตัดการรันองค์ประกอบที่ต่อเนื่องยาวนานที่สุดจากจุดเริ่มต้น รายการที่ให้ผลลัพธ์ที่เป็นจริงเมื่อวิ่งผ่านฟังก์ชั่นคือ¬ไม่ได้ตรรกะ)

T0

ไขว้เปลี่ยนรายการหายไปกับ0


2

เรติน่า , 87 ไบต์

/.\[(?!0,)/^+`\[0, 
[
/(?<! 0)]./^+`, 0]
]
\[(\[0(, 0)*], )+
[
(, \[0(, 0)*])+]|\[0]]
]

ลองออนไลน์! คำอธิบาย:

/.\[(?!0,)/^+`

จนกว่าอย่างน้อยหนึ่งแถวจะไม่ขึ้นต้นด้วยศูนย์ ...

\[0, 
[

... ลบศูนย์นำหน้าออกจากแต่ละแถว

/(?<! 0)]./^+`

จนกว่าอย่างน้อยหนึ่งแถวจะไม่ลงท้ายด้วยศูนย์ ...

, 0]
]

... ลบศูนย์ต่อท้ายออกจากแต่ละแถว

\[(\[0(, 0)*], )+
[

ลบเลขศูนย์นำหน้า

(, \[0(, 0)*])+]|\[0]]
]

ลบแถวต่อท้ายของศูนย์หรือศูนย์สุดท้ายที่เหลืออยู่


1
@RickHitchcock มันมีความไวต่อรูปแบบเพิ่มในช่องว่าง: ลองออนไลน์!
Neil

2

ถ่าน 48 ไบต์

F⁴«W∧θ¬Σ§θ±¹Σ⊟θ¿θ≔⮌E§θ⁰E觧θνλθ»⪫[]⪫Eθ⪫[]⪫ι, ¦, 

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด รวมถึง 15 ไบต์สำหรับการจัดรูปแบบ คำอธิบาย:

F⁴«

ทำซ้ำ 4 ครั้ง

W∧θ¬Σ§θ±¹

ทำซ้ำในขณะที่อาร์เรย์ไม่ว่าง แต่แถวสุดท้ายจะเป็นศูนย์ ...

Σ⊟θ

ลบแถวสุดท้ายออกจากอาร์เรย์และพิมพ์บรรทัดที่มีความยาวของผลรวมนั่นคือไม่มีอะไร

¿θ≔⮌E§θ⁰E觧θνλθ»

หากอาร์เรย์ไม่ว่างให้ทำการแปลงใหม่

⪫[]⪫Eθ⪫[]⪫ι, ¦, 

จัดรูปแบบอาร์เรย์เพื่อแสดง (เอาต์พุตมาตรฐานจะIθแทน)


2

JavaScript, 144 140 129 127 ไบต์

w=>(t=w=>(q=(s=w=>w.some((r,j)=>r.find(e=>e,i=j))?w.slice(i).reverse():[[]])(s(w)))[0].map((e,j)=>q.map((e,i)=>q[i][j])))(t(w))

140 -> 129 ไบต์ขอบคุณ @Arnauld

ขั้นตอนวิธี

  • ทำสองครั้ง:
    • ค้นหาแถวที่ไม่ใช่ศูนย์แรก
    • ฝานปิดแถวก่อนหน้า
    • ย้อนกลับ
    • ค้นหาแถวที่ไม่ใช่ศูนย์แรก
    • ฝานปิดแถวก่อนหน้า
    • ย้อนกลับ
    • ไขว้

f = w=>(t=w=>(q=(s=w=>w.some((r,j)=>r.find(e=>e,i=j))?w.slice(i).reverse():[[]])(s(w)))[0].map((e,j)=>q.map((e,i)=>q[i][j])))(t(w));

w1 = [[0, 0, 0, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [0, 0, 1, 1, 1], [0, 0, 0, 0, 0]];
w2 = [[0, 0, 0, 0], [0, 0, 0, 3], [0, 0, 0, 0], [0, 5, 0, 0], [0, 0, 0, 0]];
w3 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
w4 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]];

console.log(f(w1).join("\n"));
console.log(f(w2).join("\n"));
console.log(f(w3).join("\n"));
console.log(f(w4));


คุณสามารถบันทึก 7 ไบต์โดยใช้some/someแทนfindIndex/findและจัดเรียงการประกาศฟังก์ชันตัวช่วยเพื่อกำจัดวงเล็บรอบอาร์กิวเมนต์ของฟังก์ชันหลัก (ตอนนี้เดี่ยว)
Arnauld

ฉันคิดว่าคุณสามารถบันทึก 4 ไบต์มากขึ้นโดยมีsกลับมา[[]]เพื่อให้เสื้อw[0]รับประกันได้ว่าจะสามารถที่จะดำเนินการเกี่ยวกับ
Arnauld

2

Python 2 , 118 116 ไบต์

f=lambda a,n=4,s=sum:n and f(zip(*a[max(i for i in range(len(a))if s(s(a[:i],()))<1):][::-1]),n-1)or(s(s(a,()))>0)*a

ลองออนไลน์!


ที่บันทึกไว้:

  • -2 ไบต์ขอบคุณ shooqie

1
คุณสามารถบันทึกสองไบต์ด้วยการกำหนดs=sumในข้อกำหนดแลมบ์ดา
shooqie

2

PHP (> = 5.4), 200 194 186 184 ไบต์

(-6 ไบต์โดยส่งคืนnullแทนที่จะเป็นอาร์เรย์ว่าง)

(-8 ไบต์ขอบคุณTitus )

(-2 ไบต์กับการอ้างอิงโดยขอบคุณTitus )

function R(&$a){$m=$n=1e9;foreach($a as$r=>$R)foreach($R as$c=>$C)if($C){$m>$r&&$m=$r;$M>$r||$M=$r;$n>$c&&$n=$c;$N>$c||$N=$c;}for(;$m<=$M;)$o[]=array_slice($a[$m++],$n,$N-$n+1);$a=$o;}

ลองออนไลน์!

อย่างไร?

ค้นหาดัชนีขั้นต่ำและสูงสุดสำหรับแถว ( $m& $M) และคอลัมน์ ( $n& $N) และแทนที่อินพุตด้วยอาร์เรย์ย่อยจาก$m,$nถึง$M,$N(นี่เป็นการโทรตามการอ้างอิง)


บันทึก 6 ไบต์ด้วยif($C){$m>$r&&$m=$r;$M>$r||$M=$r;$n>$c&&$n=$c;$N>$c||$N=$c;}
Titus

... และสองไบต์ด้วยwhile($m<=$M)$o[]=array_slice($a[$m++],$n,$N-$n+1);
Titus

@Titus: ขอบคุณสำหรับเคล็ดลับที่ดี ชอบเคล็ดลับในการใช้&&และ||ฉันแน่ใจว่าฉันจะสามารถใช้เคล็ดลับนั้นในที่อื่นได้เช่นกัน
Night2

1
คุณสามารถบันทึกอีกสองไบต์ด้วยการเรียกโดยอ้างอิง: แทน$a= return
ติตัส

2

อ็อกเทฟ48 48ไบต์

@(a)sparse(1-min([x y v]=find(a))+x,1-min(y)+y,v)

ลองออนไลน์!

ค้นหาคะแนนที่ไม่ใช่ศูนย์และจัดเรียงใหม่ในเมทริกซ์กระจัดกระจายใหม่


@alephalpha คำตอบอัพเดทแล้ว!
rahnema1


2

J , 24 ไบต์

(|.@|:@}.~0=+/@{.)^:4^:_

ลองออนไลน์!

คำอธิบาย

(|.@|:@}.~0=+/@{.)^:4^:_
            +/                sum
              @               of
               {.             the first row
          0=                  is zero? (1 = true, 0 = false)
       }.~                    chop off that many rows from the front
 |.@|:@                       rotate by 90 deg (transpose then reverse)
(                )^:4         repeat this process 4 times (rotating a total of 360 deg)
                     ^:_      fixpoint - repeat until no change

2

Ruby , 73 63 ไบต์

->a{4.times{_,*a=a while a[0]&.sum==0;a=a.reverse.transpose};a}

ลองออนไลน์!

แก้ไข: ง่ายนอกจากนี้ยังมีรุ่นก่อนหน้านี้ล้มเหลวสำหรับทุก0s

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

  • ทำ 4 ครั้ง:
    • ลบบรรทัดแรกขณะที่มีบรรทัดแรกและเต็มไปด้วย0s
    • หมุนอาร์เรย์ตามเข็มนาฬิกา 90 °
  • ส่งคืนอาร์เรย์

ลิงค์ที่ถูกต้อง แต่คำตอบของคุณในการป้องกันรหัสกล่าวแทน&.sum<0 &.sum<1
Conor O'Brien

@ ConorO'Brien เวอร์ชันใหม่ของฉันไม่ดีสำหรับอาเรย์ที่ว่างเปล่า (ไม่มี <1) ขอขอบคุณที่สังเกตเห็น
Asone Tuhid

1

อ็อกเท78 78ไบต์

function x=f(x)
for k=1:nnz(~x)*4,x=rot90(x);x=x(:,~~cumsum(any(x,1)));end

ลองออนไลน์!

คำอธิบาย

สิ่งนี้จะหมุนเมทริกซ์ด้วย90องศา ( x=rot90(x)) จำนวนครั้งที่เพียงพอ ( for k=1:... end) จำนวนรอบการหมุนเป็นผลคูณของ4ดังนั้นเมทริกซ์สุดท้ายจึงมีการวางแนวดั้งเดิม โดยเฉพาะอย่างยิ่งจำนวนการหมุนคือ4จำนวนครั้งของเลขศูนย์ในเมทริกซ์ ( nnz(~x)*4)

สำหรับการหมุนแต่ละครั้งหากมีหนึ่งคอลัมน์ขึ้นไปทางซ้ายที่ประกอบด้วยศูนย์เท่านั้นพวกเขาจะถูกลบออก ( x=x(:,~~cumsum(any(x,1))))

สิ่งที่เหลืออยู่ของเมทริกซ์หลังจากกระบวนการนี้ถูกส่งออกโดยฟังก์ชั่น ( function x=f(x))



1

PHP, 188 ไบต์

function f(&$a){for($s=array_shift;!max($a[0]);)$s($a);for($p=array_pop;!max(end($a));)$p($a);for($w=array_walk;!max(($m=array_map)(reset,$a));)$w($a,$s);while(!max($m(end,$a)))$w($a,$p);}

โทรโดยการอ้างอิง

ชำรุด

// call by reference
function f(&$a)
{
    // while first row is all zeroes, remove it
    while(!max($a[0]))array_shift($a);
    // while last row is all zeroes, remove it
    while(!max(end($a)))array_pop($a);
    // while first column is all zeroes, remove it
    while(!max(array_map(reset,$a)))array_walk($a,array_shift);
    // while last column is all zeroes, remove it
    while(!max(array_map(end,$a)))array_walk($a,array_pop);
}


1

Python 2 , 86 ไบต์

lambda a,l=1:a if l>4else([a.pop()for b in a if sum(a[-1])<1],f(zip(*a[::-1]),l+1))[1]

ลองออนไลน์!

รับรายการลิสต์ส่งคืนลิสต์ของ tuples

คำอธิบาย

ใช้ผิดวิธีห่าออกไปจากรายการเข้าใจ นี่คือโค้ดที่ถูกขยายที่เทียบเท่า:

def f(a,l=1):
    # after 4 rotations, the list is back in its original orientation, return
    if l > 4:
        return a
    else:
        # helper variable to store return values
        ret = []
        # "trim" all rows from "bottom" of list that only contain 0s
        # since we are always checking le that item in the list, don't need range(len(a))
        # since we are only removing at most one item per iteration, will never try to remove more than len(a) items
        # brackets surrounding generator force it to be consumed make a list, and therefore actually pop() list items
        ret.append([a.pop() for b in a if sum(a[-1]) < 1])
        # rotate the array, increase the number of rotations, and recursively call this function on the new array/counter
        ret.append(f(zip(*a[::-1]), l + 1)))
        # we only put both items in a list in order to stay in the one-line lambda format
        # discard the popped items and return the value from the recursive call
        return ret[1]

1

Japt -h , 23 11 ไบต์

4Æ=sUb_dà z

ลองมัน


คำอธิบาย

                :Implicit input of 2D-array U
4Æ              :Map the range [0,4)
   s            :  Slice U from
    Ub          :   The first index in U where
      _dà      :    Any element is truthy (not zero)
          z     :  Rotate 90 degrees
  =             :  Reassign to U for the next iteration
                :Implicitly output the last element
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.