Um dos meus passatempos matemáticos favoritos é desenhar uma grade retangular e, em seguida, encontrar todos os retângulos visíveis nessa grade. Aqui, faça esta pergunta e aventure-se!
Você pode contar o número de retângulos?
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
O número total de retângulos para este 4 x 4 bordo minichess é exatamente
100
Você estava correto?
Matemática relacionada: Quantos retângulos existem em um tabuleiro de xadrez 8 × 8?
O desafio
Escreva a função / programa mais curta que conte o número total de retângulos visíveis em uma grade / imagem não toroidal .
Desafios relacionados: Conte os retângulos exclusivos! , Encontre o número de retângulos em uma matriz de bytes 2D .
Formato de entrada
Sua função ou programa pode optar por trabalhar com entrada baseada em texto ou gráfica.
Entrada baseada em texto
A grade será uma grade ASCII m- por- n ( m linhas, n colunas), consistindo nos seguintes caracteres:
- espaços,
-
para partes de um segmento de linha horizontal,|
para partes de um segmento de linha vertical e+
para cantos.
Você pode introduzir essa grade ASCII como entrada / argumento para seu programa / função na forma de
- uma única sequência delimitada por quebras de linha,
- uma sequência sem novas linhas, mas com um ou dois números inteiros que codificam as dimensões da grade, ou
- uma matriz de seqüências de caracteres.
Nota: A entrada baseada em texto contém pelo menos 1 linha e pelo menos 1 coluna.
Entrada gráfica
Como alternativa, as grades são codificadas como imagens PNG em preto e branco de 5 * n pixels de largura e 5 * m pixels de altura. Cada imagem consiste em blocos de 5 px * 5 px que correspondem à entrada ASCII por:
- Os espaços são convertidos em blocos brancos. Esses blocos são chamados de blocos de espaço em branco .
- Os segmentos de linha e os cantos são convertidos em blocos que não são de espaço em branco. O pixel central desses blocos é preto.
- Editar: Se dois cantos (na entrada ASCII) estiverem conectados por um segmento de linha, os centros de bloco correspondentes (na entrada gráfica) também deverão ser conectados por uma linha preta.
Isso significa que cada bloco só pode ser escolhido (clique aqui para ampliar a imagem) .
Nota: Os limites azuis são apenas para fins ilustrativos. A entrada gráfica tem pelo menos 5 px de largura e 5 px de altura. Você pode converter a entrada gráfica em qualquer imagem monocromática, potencialmente em outros formatos de arquivo de imagem). Se você optar por converter, especifique na resposta. Não há penalidade para a conversão.
Formato de saída
Se você estiver escrevendo um programa, ele deve exibir um número não negativo indicando o número total de retângulos na entrada.
Se você estiver escrevendo uma função, ela também deve retornar um número não negativo, indicando o número total de retângulos na entrada.
Casos de exemplo
Caso 1, Gráfico: ( 30 px * 30 px), ASCII: ( 6 linhas, 6 colunas )
+--+
| |
| ++-+
+-++ |
| |
+--+
Saída esperada: 3
Caso 2, Gráfico: ( 20 px * 20 px), ASCII: ( 4 linhas, 4 colunas )
++-+
|+++
+++|
+-++
Saída esperada: 6
Caso 3, Gráfico: ( 55 px * 40 px), ASCII: ( 8 linhas, 11 colunas )
+++--+
+-+++ |
| | ++--+
+--+--++ ++
| ||
| ||
++ +--++
++
Saída esperada: 9
Caso 4, Gráfico: ( 120 px * 65 px), ASCII: ( 13 linhas, 24 colunas )
+--+--+ +--+ +--+ +--+
| | | | | | | | |
+--+--+ | | | | | |
| | | +--+--+--+--+--+
+--+--+ | | | |
| | | | ++
+-+-+-+-+ +--+ +--+ ++
| | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
Saída esperada: 243
Caso 5, Gráfico: ( 5 px * 5 px. Sim, está lá!), ASCII: Apenas um único espaço.
Saída esperada: 0
Caso 6, Gráfico: ( 35 px * 20 px), ASCII: ( 4 linhas, 7 colunas )
+--+--+
|++|++|
|++|++|
+--+--+
Saída esperada: 5
Suposições
Para facilitar a vida, você tem a garantia de que:
- Por não ser toroidal , a grade não quebra horizontalmente ou verticalmente.
- Não há pontas soltas, por exemplo ,
+---
ou+- -+
. Todos os segmentos de linha têm duas extremidades. - Duas linhas que se encontram em
+
devem se cruzar nesse ponto. - Você não precisa se preocupar com entradas inválidas.
Aplicam-se regras contra brechas padrão. Por favor, trate os quadrados como retângulos. Opcionalmente, você pode remover os espaços finais em cada linha da grade.
Isso é código-golfe , então faça sua entrada o mais curta possível. Soluções gráficas e baseadas em texto competirão juntas.
Entre os melhores
fonte
Respostas:
Grime ,
3128 bytesExperimente online!
Recebe entrada no formato ASCII.
Explicação
A sintaxe do Grime está muito próxima das expressões regulares. Cada linha define um padrão que pode ou não corresponder a um retângulo de caracteres.
T
corresponde a um retângulo cuja linha superior e coluna esquerda parecem válidas.A segunda linha é o "programa principal".
fonte
JavaScript (ES6),
176171 bytesRecebe entrada como uma matriz de cadeias de comprimento igual. Explicação: Cria uma série de expressões regulares que correspondem a retângulos de todas as larguras e alturas possíveis (e algumas larguras e alturas impossíveis, mas isso é código de golfe para você) e conta quantas correspondências elas produzem. Como há um grupo de captura na regexp,
split
retorna2n+1
paran
correspondências, então eu desloco à direita 1 para obter o número de correspondências, pois isso economiza um byte em tornar o grupo não capturador.fonte
J ,
1039586807670 bytesExperimente online!
Recebe a entrada como uma matriz de cadeias com espaços à direita (para que cada cadeia tenha o mesmo tamanho). Usa o operador de subarray completo
;._3
para iterar todos os tamanhos possíveis de subarray maiores que 2 x 2 e conta os subarrays que são retângulos válidos. Conclui todos os casos de teste quase instantaneamente.fonte
Mathematica,
136134132 bytesUso: (para a versão antiga de 136 bytes, mas a nova versão é basicamente idêntica)
Nota:
@*
é novo na versão 10. Nas versões mais antigas, use emTr~Composition~Flatten
vez deTr@*Flatten
.fonte
"Tr@" cannot be followed by "*Flatten".
@*
(abreviação deComposition
) é novo na versão 10.RectangleCount[]
?Geléia ,
60 53 52 5150 bytesUm programa completo que aceita uma lista de cadeias (linhas de comprimento igual) e imprime a contagem.
Experimente online!
... ou para facilitar a entrada de copiar e colar, use este programa completo (com um byte extra para dividir linhas)
- observe que as linhas são necessárias para conter espaços à direita para que o programa funcione corretamente.
Quão?
fonte
Deslizamento ,
3229 bytesExperimente online!
27 bytes de código + 2 bytes para os sinalizadores
n
eo
. Recebe entrada no mesmo formato fornecido na pergunta (ou seja, bloco de linhas delimitado por nova linha).fonte
Haskell,
180167166 bytesExperimente online!
Passe por todas as posições de canto possíveis com quatro loops aninhados e verifique se todos os caracteres nas linhas entre eles consistem em
+-
(horizontal) ou+|
(vertical).fonte
Geléia ,
41393433 bytesExperimente online! ou Exibir todos os casos.
Com base na minha resposta em J.
Explicação
fonte