Entrada
Quadro: Um contêiner 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"]
Se você escolher uma lista de listas, poderá assumir que todas as sublistas têm o mesmo comprimento.
Regras
- Para criar um retângulo válido, você precisa de todos os cantos do retângulo com a mesma 'letra'.
- Exemplo, veja o quadro de amostras com o X abaixo. Você pode ver 'X' em (1,0) também em (4,0) também em (1,3) e em (4,3), então você tem o retângulo [1,0,4,3] que significa de (1,0) a (4,3):
Placa de amostra com 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"]
- O objetivo é encontrar o retângulo ou um dos retângulos com a maior área, calculado por (direita-esquerda + 1) * (inferior-superior + 1)
- Se houver vários retângulos com a mesma área máxima, faça a saída de qualquer um. Opcionalmente, aquele com (coordenada superior, coordenada esquerda, coordenada direita, coordenada inferior) lexicograficamente menor.
- Os retângulos devem ter bordas paralelas à borda da placa.
- Cada letra é um caractere ASCII imprimível de A a Z (ambos incluídos).
Saída
A saída deve estar nas posições esquerda e direita dos maiores cantos do retângulo da área. Para a primeira amostra "tabuleiro", o quadrado grande é o amarelo:
E a resposta deve ser:
[1, 1, 8, 4]
Um segundo exemplo de caso de teste
Uma 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"]
Deve produzir uma dessas três listas de coordenadas, identificando uma área de seis retângulos:
[1, 0, 2, 2]
[1, 0, 3, 1]
[3, 2, 5, 3]
Esta pergunta foi publicada no Stack Overflow com o título: Como encontrar o maior retângulo em uma matriz 2D formada por quatro cantos idênticos? e com esta solução JS rude (posso dizer "rude" porque é o meu código;):
Ok, é o meu primeiro post, seja tolerante comigo, por favor. Vou mudar tudo o que você diz para melhorar o teste.
((left,top),(right,bottom))
deve estar bem também. Excluí minha resposta e respondo novamente quando a pergunta é completamente refinada.Respostas:
Python 2 ,
148130 bytesExperimente online!
fonte
Retina ,
163162 bytesExperimente online! Editar: salvou 1 byte porque a
)
correspondência correspondente à$.(
está implícita. Explicação:Essa expressão regular corresponde a retângulos. Os grupos são os seguintes: 1) Linha superior (como contagem de capturas) 2) Coluna esquerda (como comprimento) 3) Balanceamento para garantir o alinhamento dos cantos esquerdos 4) Letra dos cantos 5) Largura + 1 (como comprimento) 6) Balanceamento para garantir o alinhamento dos cantos direitos 7) Coluna direita (como comprimento) 8) não utilizada 9) Altura (como contagem de capturas). A
w
opção garante que todas as larguras possíveis de retângulos sejam correspondidas para cada canto superior esquerdo. As$
opções listam os resultados usando o seguinte padrão de substituição.As substituições são as seguintes: A coluna da direita, a linha superior, a coluna da esquerda, a negação da área do retângulo (literalmente calculada como o comprimento de repetir a cadeia de largura por um a mais que o número de alturas de vezes), a coluna da esquerda , a linha superior, a coluna da direita, seguida por uma expressão que é avaliada na linha inferior (uma captura custaria 12 bytes, mais as variáveis de um dígito acabaram). As quatro primeiras capturas representam a ordem de classificação em ordem de prioridade. À medida que a Retina classifica de maneira estável, uma classificação de várias colunas pode ser estabelecida, classificando cada coluna de classificação, por sua vez, da menor para a maior prioridade. (A área deve ser classificada em ordem decrescente, para que uma única classificação de sequência não possa ser usada.)
Quatro classificações numéricas são então executadas.
A coluna de classificação é excluída após cada classificação.
A primeira entrada é, portanto, agora o resultado desejado.
Nota: A restrição na escolha do retângulo de uma determinada área foi flexibilizada e a seguinte versão de
144143 bytes prefere um retângulo mais largo do que alto:Experimente online!
fonte
Gelatina , (27?)
2928 bytes27 se a indexação baseada em 1 for permitida - remova o final
’
Um programa completo.
Experimente online! (ou veja o outro caso de teste )
Quão?
fonte
Perl 6 ,
8373 bytesExperimente online!
Retorna uma lista de listas
((x0 y0) (x1 y1))
.Explicação
fonte
Haskell , 144 bytes
Experimente online!
fonte
b<=d
, desde que mantenhaa<=c
.Gelatina , 24 bytes
Experimente online!
⁺
prova ser útil.Formato de saída: [superior, inferior], [esquerda, direita] . Indexação 1.
fonte
JavaScript (ES6), 121 bytes
-1 byte graças a @ l4m2
-1 byte graças a @tsh
+2 bytes para cumprir com a nova regra de pontuação de retângulos
Recebe entrada como uma matriz de seqüências de caracteres. Retorna coordenadas indexadas em 0: [x0, y0, x1, y1] .
Experimente online!
fonte
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
Experimente online!
fonte
Java 8,
208205 bytesDefinitivamente, posso jogar golfe. Agora, uso a abordagem mais óbvia do uso de
quatrotrês for-loops aninhados.-3 bytes graças ao @ceilingcat combinando os loops internos de linhas e colunas em um único loop.
Explicação:
Experimente online.
fonte