Entrada
El tablero: un contenedor 2D (matriz, lista de listas, etc.) de letras como:
["B", "C", "C", "C", "C", "B", "B", "C", "A", "A"],
["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
["B", "B", "B", "A", "C", "B", "A", "C", "B", "A"],
["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
Si elige una lista de listas, puede suponer que todas las sublistas tienen la misma longitud.
Reglas
- Para hacer un rectángulo válido, necesita todas las esquinas del rectángulo con la misma 'letra'.
- Ejemplo, mire el tablero de muestra con X debajo. Puede ver 'X' en (1,0) también en (4,0) también en (1,3) y en (4,3), entonces tiene el rectángulo [1,0,4,3] que significa (1,0) a (4,3):
Tablero de muestra con X :
["B", "X", "C", "C", "X", "B", "B", "C", "A", "A"],
["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
["B", "X", "B", "A", "X", "B", "A", "C", "B", "A"],
["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
- El objetivo es encontrar el rectángulo o uno de los rectángulos con el área más grande, calculado por (derecha-izquierda + 1) * (abajo-arriba + 1)
- Si hay varios rectángulos con la misma área máxima, imprima cualquiera. Opcionalmente el que tiene (coordenada superior, coordenada izquierda, coordenada derecha, coordenada inferior) lexicográficamente más pequeño.
- Los rectángulos deben tener bordes paralelos al borde del tablero.
- Cada letra es un carácter ASCII imprimible de la A a la Z (ambos incluidos).
Salida
La salida debe ser las posiciones izquierda y derecha de las esquinas rectangulares de mayor área. Para el primer "tablero" de muestra, el cuadrado grande es el amarillo:
Y la respuesta debería ser:
[1, 1, 8, 4]
Un segundo caso de prueba de ejemplo
Una entrada de:
["C", "D", "D", "D", "A", "A"],
["B", "D", "C", "D", "A", "A"],
["B", "D", "D", "C", "A", "C"],
["B", "D", "B", "C", "A", "C"]
Debería producir una de estas tres listas de coordenadas que identifiquen un área de seis rectángulos:
[1, 0, 2, 2]
[1, 0, 3, 1]
[3, 2, 5, 3]
Esta pregunta se publica en Stack Overflow con título: ¿Cómo encontrar el rectángulo más grande en una matriz 2D formada por cuatro esquinas idénticas? y con esta solución grosera de JS (puedo decir "grosero" porque es mi código;):
Ok, es mi primer post, sé tolerante conmigo por favor. Cambiaré todo lo que digas para mejorar el cuestionario.
((left,top),(right,bottom))
debería estar bien. Eliminé mi respuesta y respondo nuevamente cuando la pregunta está completamente refinada.Respuestas:
Python 2 ,
148130 bytesPruébalo en línea!
fuente
Retina ,
163162 bytesPruébalo en línea! Editar: se guardó 1 byte porque la
)
coincidencia final$.(
es implícita. Explicación:Esta expresión regular coincide con rectángulos. Los grupos son los siguientes: 1) Fila superior (como recuento de captura) 2) Columna izquierda (como longitud) 3) Equilibrio para garantizar que las esquinas izquierdas se alineen 4) Letra para las esquinas 5) Ancho + 1 (como longitud) 6) Equilibrio para garantizar que las esquinas correctas se alineen 7) Columna derecha (como longitud) 8) sin usar 9) Altura (como recuento de captura). La
w
opción garantiza que todos los anchos posibles de los rectángulos coincidan para cada esquina superior izquierda dada. Las$
opciones enumeran los resultados utilizando el siguiente patrón de sustitución.Las sustituciones son las siguientes: la columna derecha, la fila superior, la columna izquierda, la negación del área del rectángulo (literalmente calculada como la longitud de repetir la cadena de ancho por una más que el número de altura), la columna izquierda , la fila superior, la columna derecha, seguida de una expresión que se evalúa como la fila inferior (una captura habría costado 12 bytes y me he quedado sin variables de un solo dígito). Las primeras cuatro capturas representan el orden de clasificación en orden de prioridad. Como Retina clasifica de manera estable, se puede establecer una clasificación de varias columnas clasificando por cada columna de clasificación de menor a mayor prioridad. (El área se debe ordenar en orden descendente, por lo que no se puede usar una sola cadena).
Luego se realizan cuatro clasificaciones numéricas.
La columna de clasificación se elimina luego de cada clasificación.
Por lo tanto, la primera entrada es ahora el resultado deseado.
Nota: La restricción en la elección del rectángulo de un área dada se ha relajado y la siguiente versión de
144143 bytes prefiere un rectángulo más ancho que uno más alto:Pruébalo en línea!
fuente
Jalea , (27?)
2928 bytes27 si se permite la indexación basada en 1 - eliminar el final
’
Un programa completo
Pruébalo en línea! (o vea el otro caso de prueba )
¿Cómo?
fuente
Perl 6 ,
8373 bytesPruébalo en línea!
Devuelve una lista de listas
((x0 y0) (x1 y1))
.Explicación
fuente
Haskell , 144 bytes
Pruébalo en línea!
fuente
b<=d
, siempre que lo mantengaa<=c
.Jalea , 24 bytes
Pruébalo en línea!
⁺
Demuestra ser útil.Formato de salida: [arriba, abajo], [izquierda, derecha] . 1-indexación.
fuente
JavaScript (ES6), 121 bytes
-1 byte gracias a @ l4m2
-1 byte gracias a @tsh
+2 bytes para cumplir con la nueva regla de puntuación rectangular
Toma la entrada como una matriz de cadenas. Devuelve coordenadas indexadas 0: [x0, y0, x1, y1] .
Pruébalo en línea!
fuente
a=>a.map(b=(r,y)=>r.map((v,x)=>a.map((R,Y)=>R.map((V,X)=>V+R[x]+r[X]!=v+v+v|(A=(X-x)*(Y-y))<=b||(o=[x,y,X,Y],b=A)))))&&o
(A=...)<=b
->(A=...)<b
?APL (Dyalog Classic) , 38 bytes
Pruébalo en línea!
fuente
Java 8,
208205bytesDefinitivamente se puede jugar al golf. Ahora uso el enfoque más obvio de usar
cuatrotres bucles for anidados.-3 bytes gracias a @ceilingcat combina los bucles internos de filas y columnas en un solo bucle.
Explicación:
Pruébalo en línea.
fuente