The biggest square
Haskell, 113 121 118 117 bytes
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]
Try it online!
-3 bytes thanks to Laikoni!
-1 byte thanks to Lynn!
+8 bytes for the ridiculous requirement of returning 1 for no all-1s sub-matrix..
Explanation/Ungolfed
The following helper function just creates offsets for x
allowing to decrement them by s
:
x!s=[0..length x-s]
x#y
will drop y
elements from a list and then take x
:
t#d=take t.drop d
The function f
loops over all possible sizes for sub-matrices in order, generates each sub-matrix of the corresponding size, tests whether it contains only '1'
s and stores the size. Thus the solution will be the last entry in the list:
-- 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
]
APL (Dyalog Unicode), 35 34 32 bytes
{⌈/{×⍨⍵×1∊{∧/∊⍵}⌺⍵ ⍵⊢X}¨⍳⌊/⍴X←⍵}
Try it online!
Adám's SBCS has all of the characters in the code
Explanation coming eventually!
Haskell, 99 97 bytes
b s@((_:_):_)=maximum$sum[length s^2|s==('1'<$s<$s)]:map b[init s,tail s,init<$>s,tail<$>s]
b _=1
Checks if input is a square matrix of just ones with s==('1'<$s<$s)
, if it is, answer is length^2, else 0. Then recursively chops first/last column/row and takes the maximum value it finds anywhere.
Try it online!