Quảng trường lớn nhất


9

Câu hỏi này tương tự như Quảng trường lớn nhất trong một lưới .

Thử thách

Đưa ra một ma trận 10ở định dạng chuỗi "xxxx,xxxxx,xxxx,xx.."hoặc định dạng mảng ["xxxx","xxxx","xxxx",...], Bạn sẽ tạo một hàm xác định diện tích của hàm con hình vuông lớn nhất chứa tất cả 1.

Subatrix vuông là một trong những chiều rộng và chiều cao bằng nhau, và hàm của bạn sẽ trả về diện tích của hàm con lớn nhất chỉ chứa 1.

Ví dụ:

Cho "10100,10111,11111,10010", điều này trông giống như ma trận sau:

1 0 1 0 0

1 0 1 1 1

1 1 1 1 1

1 0 0 1 0

Bạn có thể thấy phần đậm được 1tạo ra một hàm con vuông lớn nhất có kích thước 2x2, vì vậy chương trình của bạn sẽ trả về diện tích là 4.

Quy tắc

  • Submatrix phải là một trong những chiều rộng và chiều cao bằng nhau
  • Submatrix phải chỉ chứa các giá trị 1
  • Hàm của bạn phải trả về diện tích của hàm con lớn nhất
  • Trong trường hợp không tìm thấy hàm con, trả về 1
  • Bạn có thể tính diện tích của hàm con bằng cách đếm số lượng của 1lớp con

Các trường hợp thử nghiệm

Đầu vào: "10100,10111,11111,10010" Đầu ra: 4

Đầu vào: "0111,1111,1111,1111" Đầu ra: 9

Đầu ra đầu vào "0111,1101,0111" : 1


Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


3
Tại sao định dạng chuỗi?
Stewie Griffin

3
Chúng ta có thể lấy đầu vào dưới dạng ma trận nhị phân (số) không?
Stewie Griffin

5
Đối với [0] vẫn cần cho đầu ra 1?
l4m2

6
Hãy đợi, tại sao trả về 1 khi không tìm thấy ma trận phụ tất cả 1, 0 sẽ có ý nghĩa hơn nhiều? (Nếu không, nó chỉ đơn giản là một trường hợp đặc biệt để xử lý)
Jonathan Allan

2
Vì tôi nghĩ rằng cả hai người trả lời sẽ không phiền nếu bạn thay đổi thông số kỹ thuật và tôi thực sự khuyên bạn nên làm như vậy bởi vì không có điểm nào để trả về 1 và nó không làm cho bài nộp trở nên thú vị hơn.
ბიმო

Câu trả lời:


2

Thạch , 18 byte

+2 để xử lý đầu ra hiện tại của danh sách con không có tất cả 1

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

Hãy thử trực tuyến! Hoặc xem bộ thử nghiệm

Làm sao?

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

Tuyệt vời. Bạn có thể thêm một số lời giải thích?
Luis felipe De jesus Munoz

Tôi sẽ, tôi đang cố gắng nghĩ ngắn hơn trước ...
Jonathan Allan

@ Mr.Xcoder Tôi đã cập nhật để xử lý yêu cầu hiện tại
Jonathan Allan

5

Haskell , 113 121 118 117 byte

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]

Hãy thử trực tuyến!

-3 byte nhờ Laikoni !

-1 byte nhờ Lynn !

+8 byte cho yêu cầu vô lý là trả về 1 không có ma trận con all-1s ..

Giải thích / Ungolfed

Hàm trợ giúp sau chỉ tạo các offset cho xphép giảm chúng bằng cách s:

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

x#ysẽ bỏ ycác phần tử từ một danh sách và sau đó lấy x:

t#d=take t.drop d

Các fvòng lặp hàm trên tất cả các kích thước có thể có cho các ma trận con theo thứ tự, tạo ra từng ma trận con có kích thước tương ứng, kiểm tra xem nó chỉ chứa '1's và lưu trữ kích thước. Do đó, giải pháp sẽ là mục cuối cùng trong danh sách:

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

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

Kiểm tra xem đầu vào có phải là ma trận vuông chỉ với một ma trận không s==('1'<$s<$s), nếu có, câu trả lời có độ dài ^ 2, khác 0. Sau đó, chọn đệ quy cột đầu tiên / cột cuối / hàng và lấy giá trị tối đa mà nó tìm thấy ở bất cứ đâu.

Hãy thử trực tuyến!



3

J , 33 27 byte

-6 byte nhờ FrownyFrog!

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

Hãy thử trực tuyến!

Giải trình:

Tôi sẽ sử dụng trường hợp thử nghiệm đầu tiên trong lời giải thích của tôi:

    ] 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

Tôi tạo tất cả các mô hình con vuông có thể có với kích thước từ 1 đến số hàng của đầu vào.

,~@#\tạo một danh sách các cặp cho kích thước của các mô hình con bằng cách khâu ,.để tăng độ dài của các tiền tố liên tiếp #\của đầu vào:

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

Sau đó, tôi sử dụng chúng để cắt x u ;. _3 yđầu vào thành mô hình con. Tôi đã có x(danh sách các kích cỡ); ylà đối số đúng ](đầu vào).

 ((,~@#\)<;._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│   │ │
├─────┼─────┼─────┼───┼─┤
│     │     │     │   │ │
│     │     │     │   │ │
├─────┼─────┼─────┼───┼─┤
│     │     │     │   │ │
└─────┴─────┴─────┴───┴─┘

Đối với mỗi hàm con, tôi kiểm tra xem nó có bao gồm 1s không: (#**/)@,- làm phẳng ma trận và thay đổi số lượng vật phẩm theo sản phẩm của chúng. Nếu tất cả các mục là 1s, kết quả sẽ là tổng của chúng, nếu không - 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

Cuối cùng, tôi làm phẳng danh sách kết quả cho mỗi hàm con và tìm mức tối đa:

>./@,

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

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

@FrownyFrog Cảm ơn bạn! Tôi không biết về"$
Galen Ivanov

1
#ngắn hơn so với cộng 1s.
FrownyFrog

@ FrownyFrog Hmm, nó thực sự là. Hay quá cảm ơn!
Galen Ivanov


2

Võng mạc , 143 byte

%`$
,;#
+%(`(\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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Đưa đầu vào dưới dạng các chuỗi được phân tách bằng dấu phẩy. Giải trình:

%`$
,;#

Thêm a ,để chấm dứt chuỗi cuối cùng, a ;để tách các chuỗi khỏi #s và a #làm bộ đếm.

+%(`
)

Lặp lại khối cho đến khi không còn các phần phụ nữa xảy ra (vì mỗi chuỗi bây giờ chỉ dài một chữ số).

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

Tăng gấp ba dòng, đặt bộ đếm thành 1 trên dòng đầu tiên và tăng nó trên dòng cuối cùng.

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

Trên dòng đầu tiên, xóa chữ số đầu tiên của mỗi chuỗi, trong khi trên dòng thứ hai, xóa tất cả các chữ số nhưng đầu tiên.

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

Trên dòng thứ ba, bitwise và hai chữ số đầu tiên với nhau.

1,
#

Tại thời điểm này, mỗi dòng bao gồm hai giá trị, a) bộ đếm chiều rộng ngang và b) bitwise và của nhiều bit được lấy từ mỗi chuỗi. Chuyển đổi bất kỳ 1s còn lại thành #s để chúng có thể được so sánh với bộ đếm.

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

Tìm bất kỳ chuỗi bit nào (theo chiều dọc) khớp với bộ đếm (theo chiều ngang), tương ứng với bình phương của 1s trong đầu vào ban đầu và bình phương chiều dài.

N`

Sắp xếp số lượng.

-1G`

Lấy lớn nhất.

^$
1

Trường hợp đặc biệt ma trận bằng không.


2

JavaScript, 92 byte

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 Classic) , 21 20 byte

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

Hãy thử trực tuyến!


Đệ quy! Đẹp!
Zacharý

@ Zacharý Cảm ơn. Trên thực tế, thay vì đệ quy, tôi thích một cái gì đó như k \ f cho một đơn nguyên f, đó là (x; fx; ffx; ...) cho đến khi hội tụ, nhưng không có tương đương trong APL (chưa). Làm điều đó với mất quá nhiều byte.
ngn

2

Python 2 , 117 109 byte

Tín dụng cho @etene để chỉ ra một sự không hiệu quả khiến tôi phải trả thêm một byte.

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

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng một chuỗi được phân tách bằng dấu phẩy. Đây là một cách tiếp cận dựa trên regex, cố gắng khớp chuỗi đầu vào với các mẫu của biểu mẫu 111.....111.....111cho tất cả các kích thước có thể có của hình vuông.

Theo tính toán của tôi, thực hiện điều này với lambda ẩn danh chỉ là một đoạn ngắn hơn hàm được xác định hoặc một chương trình đầy đủ. Phần or 1cuối cùng chỉ cần thiết để xử lý trường hợp cạnh lạ, nơi chúng ta phải xuất 1nếu không có cái nào trong đầu vào.


2

Python 2 , 116 115 117 109 byte

Tín dụng cho @Kirill vì đã giúp tôi chơi golf nhiều hơn và cho giải pháp thông minh & sớm của anh ấy

Chỉnh sửa : Đã đánh gôn 1 byte bằng cách sử dụng lambda, tôi không biết việc gán nó cho một biến không được tính vào số byte.

Chỉnh sửa 2 : Kirill chỉ ra giải pháp của tôi không hoạt động trong trường hợp đầu vào chỉ chứa 1s, tôi phải sửa nó và mất hai byte quý giá ...

Chỉnh sửa 3 : chơi golf nhiều hơn nhờ Kirill

Lấy một chuỗi được phân tách bằng dấu phẩy, trả về một số nguyên.

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

Hãy thử trực tuyến!

Tôi độc lập tìm thấy một câu trả lời gần với câu trả lời của Kiril, tức là dựa trên regex, ngoại trừ việc tôi sử dụng re.search và adef .

Nó sử dụng một biểu thức chính được xây dựng trong mỗi vòng lặp để khớp với một hình vuông lớn hơn tăng dần và trả về một hình vuông lớn nhất hoặc 1.


1
Thật tuyệt, tôi bằng cách nào đó đã tự động loại bỏ ifcách tiếp cận là "quá lâu chắc chắn", nhưng sau đó phải tạo ra một số cách khác để tạo ra giá trị bool ra khỏi trận đấu. Thật không may, giải pháp của bạn bỏ lỡ một điểm - bạn không thể có range(l)- nó sẽ bỏ lỡ trường hợp khi không có số không. Ví dụ: lấy trường hợp thử nghiệm thứ 2 và biến tất cả thành 1 giây - nó sẽ trở thành 16 chứ không phải 9.
Kirill L.

Chết tiệt, tôi đã nghĩ về việc thử nghiệm với tất cả các số 0 nhưng không phải với tất cả các số không (không bao giờ được đề cập trong thử thách ...). Tôi sẽ cố gắng để làm một cái gì đó lên.
etene

@KirillL. Nhân tiện, bạn nhanh quá! Tôi vẫn đang nghiên cứu câu trả lời của mình khi bạn đăng bài của bạn và hơi bối rối (và tự hào!) Khi tôi thấy cách tiếp cận của chúng tôi tương tự ... mức độ quanh đây thật ấn tượng.
etene

1
Đánh gôn thêm một vài byte bằng cách loại bỏ trùng lặp find. Bây giờ các mã của chúng tôi không còn giống nhau nữa, tôi khuyên chúng tôi ít nhất nên sửa các lỗi rõ ràng từ nhau - trong trường hợp của bạn, byte bổ sung đến từ việc sử dụng tuple ("1"*i,)thay vì danh sách.
Kirill L.

Cảm ơn bạn, vâng, tuple vô dụng là khá ngu ngốc về phía tôi. Và thêm findnữa, đó là thông minh của bạn.
etene




1

Clojure, 193 byte

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

Wow, mọi thứ leo thang: o

Ít chơi gôn hơn:

(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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.