จัตุรัสที่ใหญ่ที่สุด


9

คำถามนี้เป็นคำถามที่คล้ายกับสแควร์ที่ใหญ่ที่สุดในตาราง

ท้าทาย

ได้รับของเมทริกซ์1และ0ในรูปแบบสตริง"xxxx,xxxxx,xxxx,xx.."หรือรูปแบบอาร์เรย์["xxxx","xxxx","xxxx",...]คุณจะสร้างฟังก์ชั่นที่กำหนดพื้นที่ของตาราง submatrix 1ที่ใหญ่ที่สุดที่มีทั้งหมด

ตาราง submatrix เป็นหนึ่งของความกว้างและความสูงเท่ากันและฟังก์ชั่นของคุณควรจะกลับพื้นที่ของ submatrix 1ที่ใหญ่ที่สุดที่มีเพียง

ตัวอย่างเช่น:

รับ"10100,10111,11111,10010"นี้ดูเหมือนว่าเมทริกซ์ต่อไปนี้:

1 0 1 0 0

1 0 1 1 1

1 1 1 1 1 1

1 0 0 1 0

คุณสามารถเห็นตัวหนา1สร้างจตุรัสย่อยที่ใหญ่ที่สุดของขนาด 2x2 ดังนั้นโปรแกรมของคุณควรคืนพื้นที่ซึ่งเป็น 4

กฎระเบียบ

  • Submatrix ต้องมีความกว้างและความสูงเท่ากัน
  • Submatrix ต้องมีเฉพาะค่า 1
  • ฟังก์ชันของคุณจะต้องส่งคืนพื้นที่ของ submatrix ที่ใหญ่ที่สุด
  • ในกรณีที่ไม่พบ submatrix ให้ส่งคืน 1
  • คุณสามารถคำนวณพื้นที่ของ submatrix ได้โดยการนับจำนวน1ใน submatrix

กรณีทดสอบ

อินพุต: "10100,10111,11111,10010" เอาต์พุต: 4

อินพุต: "0111,1111,1111,1111" เอาต์พุต: 9

อินพุต "0111,1101,0111" เอาต์พุต: 1


นี่คือ ดังนั้นคำตอบที่สั้นที่สุดเป็นไบต์ชนะ


3
ทำไมรูปแบบสตริง?
Stewie Griffin

3
เราสามารถรับอินพุตเป็นเมทริกซ์ไบนารี (ตัวเลข) ได้หรือไม่?
Stewie Griffin

5
สำหรับ [0] ยังคงต้องการเอาต์พุต 1 หรือไม่
l4m2

6
ค้างทำไมเกี่ยวกับผลตอบแทนที่ 1 เมื่อไม่พบเมทริกซ์ย่อยทั้งหมด -1 จะไม่เป็น 0 มากกว่า? (มิฉะนั้นเป็นกรณีพิเศษที่จะจัดการ)
Jonathan Allan

2
เพราะฉันคิดว่าผู้ตอบทั้งสองจะไม่รังเกียจถ้าคุณเปลี่ยนรายละเอียดและฉันขอแนะนำให้ทำเพราะไม่มีจุดที่จะกลับมา 1 และมันไม่ได้ทำให้การส่งที่น่าสนใจมากขึ้น
ბიმო

คำตอบ:


2

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

+2 เพื่อจัดการรายการย่อย no-all-1 นำเสนอเอาต์พุต

ẆZṡ¥"L€$ẎȦÐfL€Ṁ²»1

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

ẆZṡ¥"L€$ẎȦÐfL€Ṁ²»1 - Link: list of lists of 1s and 0s
Ẇ                  - all slices (lists of "rows") call these S = [s1,s2,...]
       $           - last two links as a monad:
     L€            -   length of each (number of rows in each slice) call these X = [x1, x2, ...]
    "              -   zip with (i.e. [f(s1,x1),f(s2,x2),...]):
   ¥               -     last two links as a dyad:
 Z                 -       transpose (get the columns of the current slice)
  ṡ                -       all slices of length xi (i.e. squares of he slice)
        Ẏ          - tighten (to get a list of the square sub-matrices)
          Ðf       - filter keep if:
         Ȧ         -   any & all (all non-zero when flattened?)
            L€     - length of €ach (the side length)
              Ṁ    - maximum
               ²   - square (the maximal area)
                »1 - maximum of that and 1 (to coerce a 0 found area to 1)

น่ากลัว คุณสามารถเพิ่มคำอธิบายได้ไหม?
Luis felipe De jesus Munoz

ฉันจะพยายามคิดถึงสิ่งที่สั้นกว่าก่อน ...
Jonathan Allan

@ Mr.Xcoder ฉันได้รับการปรับปรุงเพื่อจัดการกับความต้องการในตอนนี้
Jonathan Allan

5

Haskell , 113 121 118 117 ไบต์

x!s=[0..length x-s]
t#d=take t.drop d
f x=last$1:[s*s|s<-min(x!0)$x!!0!0,i<-x!!0!s,j<-x!s,all(>'0')$s#i=<<(s#j)x,s>0]

ลองออนไลน์!

-3 ไบต์ขอบคุณLaikoni !

-1 ไบต์ด้วยLynn !

+8 ไบต์สำหรับความต้องการไร้สาระของการส่งคืน 1 สำหรับไม่มีเมทริกซ์ย่อยแบบ all-1s ..

คำอธิบาย / Ungolfed

ฟังก์ชั่นตัวช่วยต่อไปนี้เป็นเพียงการสร้างออฟเซ็ตสำหรับการxอนุญาตให้ลดค่าลงโดยs:

x!s=[0..length x-s]

x#yจะวางyองค์ประกอบจากรายการแล้วนำx:

t#d=take t.drop d

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

--          v prepend a 1 for no all-1s submatrices
f x= last $ 1 : [ s*s
                -- all possible sizes are given by the minimum side-length
                | s <- min(x!0)$x!!0!0
                -- the horizontal offsets are [0..length(x!!0) - s]
                , i <- x!!0!s
                -- the vertical offsets are [0..length x - s]
                , j <- x!s
                -- test whether all are '1's
                , all(>'0') $
                -- from each row: drop first i elements and take s (concatenates them to a single string)
                              s#i =<<
                -- drop the first j rows and take s from the remaining
                                      (s#j) x
                -- exclude size 0...........................................
                , s>0
                ]

4

Haskell , 99 97 ไบต์

b s@((_:_):_)=maximum$sum[length s^2|s==('1'<$s<$s)]:map b[init s,tail s,init<$>s,tail<$>s]
b _=1

ตรวจสอบว่าการป้อนข้อมูลเป็นเมทริกซ์จตุรัสของเพียงคนเดียวกับs==('1'<$s<$s)ถ้าเป็นคำตอบคือความยาว ^ 2 อื่น 0 จากนั้นสับซ้ำคอลัมน์แรก / แถวสุดท้าย / แถวและใช้ค่าสูงสุดที่พบได้ทุกที่

ลองออนไลน์!



3

J , 33 27 ไบต์

-6 ไบต์ขอบคุณ FrownyFrog!

[:>./@,,~@#\(#**/)@,;._3"$]

ลองออนไลน์!

คำอธิบาย:

ฉันจะใช้กรณีทดสอบแรกในคำอธิบายของฉัน:

    ] a =. 3 5$1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1

ฉันสร้างเมทริกซ์จตุรัสย่อยที่เป็นไปได้ทั้งหมดที่มีขนาดตั้งแต่ 1 ถึงจำนวนแถวของอินพุต

,~@#\สร้างรายการคู่สำหรับขนาดของ,.เมทริกซ์ย่อยโดยการเย็บต่อยาวความยาวของคำนำหน้าต่อเนื่อง#\ของอินพุต:

   ,~@#\ a
1 1
2 2
3 3

จากนั้นฉันก็ใช้มันเพื่อตัดx u ;. _3 yอินพุตเป็นเมทริกซ์ย่อย ฉันมีอยู่แล้วx(รายการขนาด); yเป็นอาร์กิวเมนต์ที่ถูกต้อง](อินพุต)

 ((,~@#\)<;._3"$]) a
┌─────┬─────┬─────┬───┬─┐
│1    │0    │1    │0  │0│
│     │     │     │   │ │
│     │     │     │   │ │
├─────┼─────┼─────┼───┼─┤
│1    │0    │1    │1  │1│
│     │     │     │   │ │
├─────┼─────┼─────┼───┼─┤
│1    │1    │1    │1  │1│
└─────┴─────┴─────┴───┴─┘

┌─────┬─────┬─────┬───┬─┐
│1 0  │0 1  │1 0  │0 0│ │
│1 0  │0 1  │1 1  │1 1│ │
│     │     │     │   │ │
├─────┼─────┼─────┼───┼─┤
│1 0  │0 1  │1 1  │1 1│ │
│1 1  │1 1  │1 1  │1 1│ │
├─────┼─────┼─────┼───┼─┤
│     │     │     │   │ │
└─────┴─────┴─────┴───┴─┘

┌─────┬─────┬─────┬───┬─┐
│1 0 1│0 1 0│1 0 0│   │ │
│1 0 1│0 1 1│1 1 1│   │ │
│1 1 1│1 1 1│1 1 1│   │ │
├─────┼─────┼─────┼───┼─┤
│     │     │     │   │ │
│     │     │     │   │ │
├─────┼─────┼─────┼───┼─┤
│     │     │     │   │ │
└─────┴─────┴─────┴───┴─┘

สำหรับแต่ละ submatrix ฉันจะตรวจสอบว่ามันประกอบด้วย 1s ทั้งหมด: (#**/)@,- ทำให้เมทริกซ์แบนขึ้นและทำให้จำนวนไอเท็มโดยผลิตภัณฑ์ของพวกเขาลดลง หากรายการทั้งหมดเป็น 1 วินาทีผลลัพธ์จะเป็นผลรวมของพวกเขามิฉะนั้น - 0:

   (#**/)@, 3 3$1 0 0 1 1 1 1 1 1
0
   (#**/)@, 2 2$1 1 1 1
4 

   ((,~@#\)(+/**/)@,;._3"$]) a
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1

0 0 0 0 0
0 0 4 4 0
0 0 0 0 0

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

ในที่สุดฉันก็เรียบรายการผลลัพธ์สำหรับแต่ละ submatrix และหาค่าสูงสุด:

>./@,

   ([:>./@,,~@#\(+/**/)@,;._3"$]) a
4

1
,~@#\และ"1 2->"$
FrownyFrog

@FrownyFrog ขอขอบคุณ! ฉันไม่รู้"$
Galen Ivanov

1
#สั้นกว่าการบวก 1s
FrownyFrog

@ FrownyFrog อืมมันเป็นเรื่องจริง เจ๋งขอบคุณ!
Galen Ivanov


2

Retina , 143 ไบต์

%`$
,;#
+%(`(\d\d.+;#)#*
$1¶$&¶$&#
\G\d(\d+,)|\G((;#+¶|,)\d)\d+
$1$2
)r`((11)|\d\d)(\d*,;?#*)\G
$#2$3
1,
#
Lv$`(#+).*;\1
$.($.1*$1
N`
-1G`
^$
1

ลองออนไลน์! ลิงก์มีกรณีทดสอบ รับอินพุตเป็นสตริงที่คั่นด้วยเครื่องหมายคอมมา คำอธิบาย:

%`$
,;#

เพิ่ม a ,เพื่อยุติสตริงสุดท้าย a ;เพื่อแยกสตริงออกจาก#s และ a #เป็นตัวนับ

+%(`
)

ทำซ้ำบล็อกจนกว่าจะไม่มีการแบ่งย่อยเกิดขึ้นอีก (เนื่องจากแต่ละสตริงมีความยาวเพียงหนึ่งหลักเท่านั้น)

(\d\d.+;#)#*
$1¶$&¶$&#

เพิ่มบรรทัดสามบรรทัดโดยตั้งค่าตัวนับเป็น 1 ในบรรทัดแรกและเพิ่มขึ้นในบรรทัดสุดท้าย

\G\d(\d+,)|\G((;#+¶|,)\d)\d+
$1$2

ในบรรทัดแรกลบตัวเลขตัวแรกของแต่ละสายในขณะที่ในบรรทัดที่สองลบตัวเลขทั้งหมดยกเว้นตัวเลขตัวแรก

r`((11)|\d\d)(\d*,;?#*)\G
$#2$3

ในบรรทัดที่สามบิตและตัวเลขสองหลักแรกพร้อมกัน

1,
#

ณ จุดนี้แต่ละบรรทัดประกอบด้วยสองค่า a) ตัวนับความกว้างแนวนอนและ b) ค่าบิตและจำนวนบิตที่นำมาจากแต่ละสตริง แปลง1s ที่เหลือเป็น#s เพื่อให้สามารถเปรียบเทียบกับตัวนับได้

Lv$`(#+).*;\1
$.($.1*$1

ค้นหาการทำงานของบิตใด ๆ (แนวตั้ง) ที่ตรงกับตัวนับ (แนวนอน) ซึ่งสอดคล้องกับกำลังสองของ1s ในอินพุตดั้งเดิมและเพิ่มความยาวเป็นรูปสี่เหลี่ยมจัตุรัส

N`

เรียงลำดับตัวเลข

-1G`

ใช้เวลาที่ใหญ่ที่สุด

^$
1

กรณีพิเศษศูนย์เมทริกซ์


2

JavaScript, 92 ไบต์

a=>(g=w=>a.match(Array(w).fill(`1{${w}}`).join(`..{${W-w}}`))?w*w:g(w-1))(W=a.indexOf`,`)||1


2

APL (Dyalog คลาสสิก) , 21 20 ไบต์

×⍨{1∊⍵:1+∇2×/2×⌿⍵⋄0}

ลองออนไลน์!


เรียกซ้ำ! ดี!
Zacharý

@ Zacharýขอบคุณ ที่จริงแล้วแทนที่จะเรียกซ้ำผมอยากได้สิ่งที่ชอบ k's f \ x สำหรับ monadic f ซึ่งก็คือ (x; fx; ffx; ... ) จนกระทั่งมาบรรจบกัน แต่ยังไม่มีอะไรเทียบเท่าใน APL (ยัง) การใช้⍣≡ใช้เวลามากเกินไป
ngn

2

Python 2 , 117 109 ไบต์

ขอมอบเครดิตให้แก่ @etene เพื่อชี้ให้เห็นถึงความไร้ประสิทธิภาพซึ่งทำให้ฉันต้องเสียค่าไบต์เพิ่ม

lambda s:max(i*i for i in range(len(s))if re.search(("."*(s.find(',')-i+1)).join(["1"*i]*i),s))or 1
import re

ลองออนไลน์!

รับอินพุตเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาค นี่เป็นวิธีการ regex ที่พยายามจับคู่สตริงอินพุตกับรูปแบบของแบบฟอร์ม111.....111.....111สำหรับขนาดที่เป็นไปได้ทั้งหมดของสแควร์

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


2

Python 2 , 116 115 117 109 ไบต์

ให้เครดิตกับ @Killill สำหรับการช่วยฉันเล่นกอล์ฟให้มากขึ้นและเพื่อการแก้ปัญหาที่ชาญฉลาดและรวดเร็วของเขา

แก้ไข : Golfed 1 byte โดยใช้แลมบ์ดาฉันไม่รู้ว่าการกำหนดให้ตัวแปรไม่นับรวมเป็นจำนวนไบต์

แก้ไข 2 : คิริลล์ชี้ให้เห็นว่าวิธีการแก้ปัญหาของฉันไม่สามารถใช้งานได้ในกรณีที่อินพุตมีเพียง1s เท่านั้นฉันต้องแก้ไขและสูญเสียสองไบต์ที่มีค่า ...

แก้ไข 3 : เล่นกอล์ฟมากขึ้นต้องขอบคุณ Kirill

รับสตริงคั่นด้วยเครื่องหมายจุลภาคส่งคืนเลขจำนวนเต็ม

lambda g:max(i*i for i in range(len(g))if re.search(("."*(g.find(",")+1-i)).join(["1"*i]*i),g))or 1
import re

ลองออนไลน์!

ฉันพบคำตอบที่ใกล้เคียงกับของ Kiril อย่างอิสระเช่น regex based ยกเว้นว่าฉันใช้re.search และ adefและ

มันใช้ regex ที่สร้างขึ้นระหว่างแต่ละวงเพื่อจับคู่สี่เหลี่ยมที่มีขนาดใหญ่ขึ้นและส่งคืนหนึ่งที่ใหญ่ที่สุดหรือ 1


1
ดีมากฉันทิ้งifวิธีการโดยอัตโนมัติเป็น "นานเกินไปที่แน่นอน" แต่แล้วก็ต้องหาวิธีอื่นเพื่อหาค่าบูลออกจากการแข่งขัน น่าเสียดายที่โซลูชันของคุณพลาดจุดหนึ่ง - คุณไม่มีทางเป็นไปได้range(l)- มันจะคิดถึงเคสเมื่อไม่มีเลขศูนย์เลย เช่นทำกรณีทดสอบที่ 2 และทำให้ครบ 1s - ควรเป็น 16 ไม่ใช่ 9
Kirill L.

ประณามฉันคิดเกี่ยวกับการทดสอบกับศูนย์ทั้งหมด แต่ไม่ได้อยู่กับทุกคน (ไม่เคยเอ่ยถึงในการท้าทาย ... ) ฉันจะลองทำอะไรซักอย่าง
etene

@KirillL ยังไงก็ตามคุณเร็ว! ฉันยังคงทำงานกับคำตอบของฉันเมื่อคุณโพสต์ของคุณและเป็น bummed เล็กน้อย (และภูมิใจ!) เมื่อฉันเห็นวิธีการของเราคล้ายกัน ... ระดับรอบ ๆ ที่นี่น่าประทับใจ
etene

1
findแข็งแรงเล่นกอล์ฟอีกไม่กี่ไบต์โดยการกำจัดซ้ำ ตอนนี้รหัสของเราไม่เหมือนกันอีกต่อไปฉันขอแนะนำให้เราอย่างน้อยก็แก้ไขข้อผิดพลาดที่เห็นได้ชัดจากกันและกัน - ในกรณีของคุณไบต์พิเศษมาจากการใช้ tuple ("1"*i,)แทนที่จะเป็นรายการ
Kirill L.

ขอบคุณใช่ tuple ที่ไร้ประโยชน์นั้นค่อนข้างโง่ในส่วนของฉัน และสิ่งที่พิเศษfindเกินไปนั่นก็คือความฉลาดของคุณ
etene

2

Ruby -n , 63 ไบต์

p (1..l=$_=~/,|$/).map{|i|/#{[?1*i]*i*(?.*(l-i+1))}/?i*i:1}.max

ลองออนไลน์!

รุ่นทับทิมของฉันคำตอบหลาม Golfier เป็นโปรแกรมเต็มรูปแบบ อีกทางเลือกหนึ่งแลมบ์ดานิรนาม:

Ruby , 70 68 ไบต์

->s{(1..l=s=~/,|$/).map{|i|s=~/#{[?1*i]*i*(?.*(l-i+1))}/?i*i:1}.max}

ลองออนไลน์!




1

Clojure, 193 ไบต์

#(apply max(for [f[(fn[a b](take-while seq(iterate a b)))]R(f next %)R(f butlast R)n[(count R)]c(for[i(range(-(count(first R))n -1)):when(apply = 1(for[r R c(subvec r i(+ i n))]c))](* n n))]c))

ว้าวสิ่งที่เพิ่มขึ้น: o

หักกอล์ฟ:

(def f #(for [rows (->> %    (iterate next)    (take-while seq)) ; row-postfixes
              rows (->> rows (iterate butlast) (take-while seq)) ; row-suffixes
              n    [(count rows)]
              c    (for[i(range(-(count(first rows))n -1)):when(every? pos?(for [row rows col(subvec row i(+ i n))]col))](* n n))] ; rectangular subsections
          c))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.