Uno de mis pasatiempos matemáticos favoritos es dibujar una cuadrícula rectangular y luego encontrar todos los rectángulos visibles en esa cuadrícula. ¡Toma esta pregunta y aventúrate por ti mismo!
¿Puedes contar la cantidad de rectángulos?
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
El número total de rectángulos para este tablero de 4 x 4 minichess es exactamente
100
¿Estabas en lo correcto?
Matemáticas relacionadas: ¿Cuántos rectángulos hay en un tablero de ajedrez de 8 × 8?
El reto
Escriba la función / programa más corto que cuente el número total de rectángulos visibles en una cuadrícula / imagen no toroidal .
Desafíos relacionados: ¡ Cuenta los rectángulos únicos! , Encuentra el número de rectángulos en una matriz de bytes 2D .
Formato de entrada
Su función o programa puede elegir trabajar con entrada basada en texto o entrada gráfica.
Entrada basada en texto
La cuadrícula será una cuadrícula ASCII m -by- n ( m filas, n columnas) que consta de los siguientes caracteres:
- espacios,
-
para partes de un segmento de línea horizontal,|
para partes de un segmento de línea vertical, y+
para esquinas
Puede introducir esta cuadrícula ASCII como la entrada / argumento de su programa / función en forma de
- una sola cadena delimitada por saltos de línea,
- una cadena sin líneas nuevas pero con uno o dos enteros que codifican las dimensiones de la cuadrícula, o
- Un conjunto de cuerdas.
Nota: La entrada basada en texto contiene al menos 1 fila y al menos 1 columna.
Entrada gráfica
Alternativamente, las cuadrículas se codifican como imágenes PNG en blanco y negro de 5 * n píxeles de ancho y 5 * m píxeles de alto. Cada imagen consta de bloques de 5 px * 5 px que corresponden a la entrada ASCII por:
- Los espacios se convierten en bloques blancos. Estos bloques se denominan bloques de espacios en blanco .
- Los segmentos de línea y las esquinas se convierten en bloques que no son espacios en blanco. El píxel central de tales bloques es negro.
- Editar: si dos esquinas (en la entrada ASCII) están conectadas por un segmento de línea, los centros de bloque correspondientes (en la entrada gráfica) también deberían estar conectados por una línea negra.
Esto significa que cada bloque solo se puede elegir (haga clic aquí para ampliar la imagen) .
Nota: Los límites azules son solo para fines ilustrativos. La entrada gráfica tiene al menos 5 px de ancho y 5 px de alto. Puede convertir la entrada gráfica a cualquier imagen monocroma, potencialmente a otros formatos de archivo de imagen). Si elige convertir, especifique en la respuesta. No hay penalidad para la conversión.
Formato de salida
Si está escribiendo un programa, debe mostrar un número no negativo que indique el número total de rectángulos en la entrada.
Si está escribiendo una función, también debería devolver un número no negativo que indica el número total de rectángulos en la entrada.
Casos de ejemplo
Caso 1, Gráfico: ( 30 px * 30 px), ASCII: ( 6 filas, 6 cols)
+--+
| |
| ++-+
+-++ |
| |
+--+
Rendimiento esperado: 3
Caso 2, Gráfico: ( 20 px * 20 px), ASCII: ( 4 filas, 4 cols)
++-+
|+++
+++|
+-++
Rendimiento esperado: 6
Caso 3, Gráfico: ( 55 px * 40 px), ASCII: ( 8 filas, 11 cols)
+++--+
+-+++ |
| | ++--+
+--+--++ ++
| ||
| ||
++ +--++
++
Rendimiento esperado: 9
Caso 4, Gráfico: ( 120 px * 65 px), ASCII: ( 13 filas, 24 cols)
+--+--+ +--+ +--+ +--+
| | | | | | | | |
+--+--+ | | | | | |
| | | +--+--+--+--+--+
+--+--+ | | | |
| | | | ++
+-+-+-+-+ +--+ +--+ ++
| | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
Rendimiento esperado: 243
Caso 5, Gráfico: ( 5 px * 5 px. ¡Sí, está ahí!), ASCII: Solo un espacio.
Rendimiento esperado: 0
Caso 6, Gráfico: ( 35 px * 20 px), ASCII: ( 4 filas, 7 cols)
+--+--+
|++|++|
|++|++|
+--+--+
Rendimiento esperado: 5
Supuestos
Para facilitarle la vida, tiene la garantía de que:
- Al ser no toroidal , la cuadrícula no se ajusta horizontal ni verticalmente.
- No hay cabos sueltos, por ejemplo,
+---
o+- -+
. Todos los segmentos de línea tienen dos extremos. - Dos líneas que se encuentran en
+
deben cruzarse en ese punto. - No tiene que preocuparse por entradas no válidas.
Se aplican las reglas contra las lagunas estándar. Por favor trate los cuadrados como rectángulos. Opcionalmente, puede eliminar los espacios finales en cada fila de la cuadrícula.
Este es el código de golf , así que haga su entrada lo más corta posible. Las soluciones gráficas y basadas en texto competirán juntas.
Tabla de clasificación
fuente
Respuestas:
Grime ,
3128 bytesPruébalo en línea!
Toma entrada en formato ASCII.
Explicación
La sintaxis de Grime está muy cerca de las expresiones regulares. Cada línea define un patrón que puede coincidir o no con un rectángulo de caracteres.
T
coincide con un rectángulo cuya fila superior y columna izquierda parecen válidas.La segunda fila es el "programa principal".
fuente
JavaScript (ES6),
176171 bytesToma la entrada como una matriz de cadenas de igual longitud. Explicación: Crea una serie de expresiones regulares que coinciden con rectángulos de todos los anchos y alturas posibles (y algunos anchos y alturas imposibles, pero ese es el código de golf para usted) y cuenta cuántas coincidencias producen todos. Debido a que hay un grupo de captura en la expresión regular,
split
regresa2n+1
para lasn
coincidencias, por lo que me desplazo a la derecha en 1 para obtener el número de coincidencias, ya que eso ahorra un byte sobre hacer que el grupo no se capture.fuente
J ,
1039586807670 bytesPruébalo en línea!
Toma la entrada como una matriz de cadenas con espacios finales (para que cada cadena sea del mismo tamaño). Utiliza el operador de submatriz completo
;._3
para iterar sobre cada tamaño de submatriz posible mayor que 2 x 2, y cuenta las submatrices que son rectángulos válidos. Completa todos los casos de prueba casi al instante.fuente
Mathematica,
136134132 bytesUso: (para la versión antigua de 136 bytes, pero la nueva versión es básicamente idéntica)
Nota:
@*
es nuevo en la versión 10. En versiones anteriores, use enTr~Composition~Flatten
lugar deTr@*Flatten
.fuente
"Tr@" cannot be followed by "*Flatten".
@*
(abreviatura deComposition
) es nuevo en la versión 10.RectangleCount[]
?Jalea ,
60 53 52 5150 bytesUn programa completo que acepta una lista de cadenas (filas de igual longitud) e imprime el recuento.
Pruébalo en línea!
... o para facilitar la entrada de copiar y pegar, use este programa completo (con un byte adicional para dividir líneas)
. Sin embargo, tenga en cuenta que las líneas deben contener espacios finales para que el programa funcione correctamente.
¿Cómo?
fuente
Slip ,
3229 bytesPruébalo en línea!
27 bytes de código + 2 bytes para las banderas
n
yo
. Toma información en el mismo formato provisto en la pregunta (es decir, bloque de líneas delimitado por nueva línea).fuente
Haskell,
180167166 bytesPruébalo en línea!
Revise todas las posiciones de esquina posibles con cuatro bucles anidados y verifique si todos los caracteres en las líneas entre ellos consisten en
+-
(horizontal) o+|
(vertical).fuente
Jalea ,
41393433 bytesPruébalo en línea! o Ver todos los casos.
Basado en mi respuesta en J.
Explicación
fuente