Esta pregunta es similar a Biggest Square en una cuadrícula .
Desafío
Dada una matriz de 1
y 0
en un formato de cadena "xxxx,xxxxx,xxxx,xx.."
o formato de matriz ["xxxx","xxxx","xxxx",...]
, creará una función que determina el área de la submatriz cuadrada más grande que contiene todo 1
.
Una submatriz cuadrada es una de igual ancho y alto, y su función debe devolver el área de la submatriz más grande que solo contiene 1
.
Por ejemplo:
Dado "10100,10111,11111,10010"
, esto se parece a la siguiente matriz:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Puede ver que la negrita 1
crea la submatriz cuadrada más grande de tamaño 2x2, por lo que su programa debe devolver el área que es 4.
Reglas
- La submatriz debe ser de igual ancho y alto
- La submatriz debe contener solo valores
1
- Su función debe devolver el área de la submatriz más grande
- En caso de que no se encuentre la submatriz, regrese
1
- Puede calcular el área de la submatriz con el número de
1
la submatriz
Casos de prueba
Entrada: "10100,10111,11111,10010"
Salida: 4
Entrada: "0111,1111,1111,1111"
Salida: 9
Entrada "0111,1101,0111"
Salida: 1
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Respuestas:
Jalea , 18 bytes
+2 para manejar la salida presente de la sublista no todo-1
Pruébalo en línea! O ver el conjunto de pruebas
¿Cómo?
fuente
Haskell ,
113 121 118117 bytesPruébalo en línea!
-3 bytes gracias a Laikoni !
-1 byte gracias a Lynn !
+8 bytes para el requisito ridículo de devolver 1 para ninguna submatriz de todos 1.
Explicación / Ungolfed
La siguiente función auxiliar solo crea compensaciones para
x
permitir disminuirlass
:x#y
eliminaráy
elementos de una lista y luego tomaráx
:La función
f
recorre todos los tamaños posibles para las submatrices en orden, genera cada submatriz del tamaño correspondiente, prueba si contiene solo'1'
sy almacena el tamaño. Por lo tanto, la solución será la última entrada en la lista:fuente
Haskell ,
9997 bytesComprueba si input es una matriz cuadrada de unos con
s==('1'<$s<$s)
, si es así, la respuesta es length ^ 2, else 0. Luego corta recursivamente la primera / última columna / fila y toma el valor máximo que encuentra en cualquier parte.Pruébalo en línea!
fuente
K (ngn / k) ,
3328 bytesPruébalo en línea!
fuente
J ,
3327 bytes-6 bytes gracias a FrownyFrog!
Pruébalo en línea!
Explicación:
Usaré el primer caso de prueba en mi explicación:
Genero todas las submatrices cuadradas posibles con un tamaño de 1 al número de filas de la entrada.
,~@#\
crea una lista de pares para los tamaños de las submatrices,.
uniendo juntas la longitud de los prefijos sucesivos#\
de la entrada:Luego los uso para cortar
x u ;. _3 y
la entrada en submatrices. Ya tengox
(la lista de tamaños);y
es el argumento correcto]
(la entrada).Para cada submatriz
(#**/)@,
, verifico si consta completamente de 1: aplanar la matriz y multiplicar el número de elementos por su producto. Si todos los elementos son 1s, el resultado será su suma; de lo contrario, 0:Finalmente, aplané la lista de resultados para cada submatriz y encuentro el máximo:
>./@,
fuente
,~@#\
y"1 2
->"$
"$
#
es más corto que sumar los 1s.APL (Dyalog Unicode) ,
353432 bytesPruébalo en línea!
El SBCS de Adám tiene todos los caracteres en el código
¡La explicación viene eventualmente!
fuente
Retina , 143 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Toma la entrada como cadenas separadas por comas. Explicación:
Agregue a
,
para terminar la última cadena, a;
para separar las cadenas de la#
sy a#
como contador.Repita el bloque hasta que no ocurran más subvenciones (porque cada cadena ahora tiene solo un dígito de longitud).
Triplique la línea, establezca el contador en 1 en la primera línea e increméntelo en la última línea.
En la primera línea, elimine el primer dígito de cada cadena, mientras que en la segunda línea, elimine todos los dígitos excepto el primero.
En la tercera línea, bit a bit y los dos primeros dígitos juntos.
En este punto, cada línea consta de dos valores, a) un contador de ancho horizontal yb) los bits y la cantidad de bits tomados de cada cadena. Convierta los
1
s restantes en#
s para poder compararlos con el contador.Encuentre cualquier corrida de bits (verticalmente) que coincida con el contador (horizontalmente), correspondiente a los cuadrados de
1
s en la entrada original, y al cuadrado la longitud.Ordenar numéricamente.
Toma la más grande.
Caso especial de la matriz cero.
fuente
JavaScript, 92 bytes
Mostrar fragmento de código
fuente
APL (Dyalog Classic) ,
2120 bytesPruébalo en línea!
fuente
Python 2 ,
117109bytesGracias a @etene por señalar una ineficiencia que me costó un byte adicional.
Pruébalo en línea!
Toma la entrada como una cadena separada por comas. Este es un enfoque basado en expresiones regulares que intenta hacer coincidir la cadena de entrada con los patrones del formulario
111.....111.....111
para todos los tamaños posibles del cuadrado.En mis cálculos, hacer esto con una lambda anónima es solo un poco más corta que la función definida o un programa completo. La
or 1
parte al final solo es necesaria para manejar el extraño caso de borde, donde debemos generar resultados1
si no hay ninguno en la entrada.fuente
Python 2 ,
116115117109 bytesCréditos a @Kirill por ayudarme a jugar al golf aún más y por su solución inteligente y temprana
Editar : Golfé 1 byte usando una lambda, no sabía que asignarlo a una variable no contaba para el conteo de bytes.
Edición 2 : Kirill señaló que mi solución no funcionó para los casos en que la entrada solo contiene
1
s, tuve que arreglarlo y perdí dos bytes preciosos ...Edición 3 : más golf gracias a Kirill
Toma una cadena separada por comas, devuelve un entero.
Pruébalo en línea!
Independientemente encontré una respuesta cercana a la de Kiril, es decir, basada en expresiones regulares, excepto que uso
re.search
y a.def
Utiliza una expresión regular construida durante cada ciclo para hacer coincidir un cuadrado incrementalmente más grande y devuelve el más grande, o 1.
fuente
if
enfoque como "demasiado largo seguro", pero luego tuve que inventar alguna otra forma de sacar un valor bool del partido. Desafortunadamente, su solución pierde un punto, no puede tener solorange(l)
, perderá el caso cuando no haya ceros en absoluto. Por ejemplo, tome el segundo caso de prueba y hágalo todo 1s - debería ser 16, no 9.find
. Ahora que nuestros códigos ya no son idénticos, sugiero que al menos arreglemos los errores obvios entre nosotros; en su caso, el byte adicional proviene del uso de tupla en("1"*i,)
lugar de la lista.find
también, eso fue inteligente de tu parte.Ruby
-n
, 63 bytesPruébalo en línea!
Versión rubí de mi respuesta de Python . Golfier como un programa completo. Alternativamente, una lambda anónima:
Ruby ,
7068 bytesPruébalo en línea!
fuente
Perl 6 ,
616058 bytesPruébalo en línea!
fuente
Python 2 ,
138128 bytesPruébalo en línea!
Salvado
fuente
Clojure, 193 bytes
Wow, las cosas se intensificaron: o
Menos golfizado:
fuente