Esta pergunta é semelhante à maior praça de uma grade .
Desafio
Dada uma matriz 1
e 0
em um formato de cadeia "xxxx,xxxxx,xxxx,xx.."
ou formato de matriz ["xxxx","xxxx","xxxx",...]
, você criará uma função que determina a área da maior submatriz quadrada que contém todas 1
.
Uma submatriz quadrada é uma de largura e altura iguais, e sua função deve retornar a área da maior submatriz que contém apenas 1
.
Por exemplo:
Dado "10100,10111,11111,10010"
, isso se parece com a seguinte matriz:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Você pode ver o negrito 1
criar a maior submatriz quadrada de tamanho 2x2, portanto seu programa deve retornar a área que é 4.
Regras
- A submatriz deve ser de largura e altura iguais
- A submatriz deve conter apenas valores
1
- Sua função deve retornar a área da maior submatriz
- Caso nenhuma submatriz seja encontrada, retorne
1
- Você pode calcular a área da submatriz contando o número de
1
na submatriz
Casos de teste
Entrada: "10100,10111,11111,10010"
Saída: 4
Entrada: "0111,1111,1111,1111"
Saída: 9
Saída de entrada "0111,1101,0111"
: 1
Isso é código-golfe , então a resposta mais curta em bytes vence.
Respostas:
Geléia , 18 bytes
+2 para lidar com a saída atual da sublist no-all-1
Experimente online! Ou veja a suíte de testes
Como?
fonte
Haskell ,
113 121 118117 bytesExperimente online!
-3 bytes graças a Laikoni !
-1 byte graças a Lynn !
+8 bytes para o requisito ridículo de retornar 1 para nenhuma sub-matriz all-1s.
Explicação / Ungolfed
A seguinte função auxiliar apenas cria deslocamentos para
x
permitir diminuí-loss
:x#y
soltaráy
elementos de uma lista e, em seguida, pegaráx
:A função faz um
f
loop em todos os tamanhos possíveis para sub-matrizes em ordem, gera cada sub-matriz do tamanho correspondente, testa se ela contém apenas se'1'
armazena o tamanho. Assim, a solução será a última entrada na lista:fonte
Haskell ,
9997 bytesVerifica se a entrada é uma matriz quadrada de apenas uma com
s==('1'<$s<$s)
, se for, a resposta tem comprimento ^ 2, mais o 0. Então, recursivamente divide a primeira / última coluna / linha e leva o valor máximo que encontra em qualquer lugar.Experimente online!
fonte
K (ngn / k) ,
3328 bytesExperimente online!
fonte
J ,
3327 bytes-6 bytes graças ao FrownyFrog!
Experimente online!
Explicação:
Vou usar o primeiro caso de teste na minha explicação:
Eu gero todas as submatrizes quadradas possíveis com tamanho de 1 ao número de linhas da entrada.
,~@#\
cria uma lista de pares para os tamanhos das submatrizes,.
unindo o comprimento dos prefixos sucessivos#\
da entrada:Então eu os uso para cortar
x u ;. _3 y
a entrada em submatrizes. Eu já tenhox
(a lista de tamanhos);y
é o argumento certo]
(a entrada).Para cada submatriz, verifico se ela consiste inteiramente de 1s:
(#**/)@,
- achatar a matriz e alterar o número de itens por seu produto. Se todos os itens forem 1s, o resultado será sua soma, caso contrário - 0:Por fim, aplico a lista de resultados para cada submatriz e encontro o máximo:
>./@,
fonte
,~@#\
e"1 2
->"$
"$
#
é menor que a soma dos 1s.APL (Dyalog Unicode) ,
353432 bytesExperimente online!
O SBCS de Adám possui todos os caracteres no código
Explicação chegando eventualmente!
fonte
Retina , 143 bytes
Experimente online! O link inclui casos de teste. Recebe entrada como sequências separadas por vírgula. Explicação:
Adicione a
,
para finalizar a última cadeia, a;
para separar as cadeias de se#
um#
como contador.Repita o bloco até que não ocorram mais subsituções (porque cada string agora possui apenas um dígito).
Triplicar a linha, configurando o contador para 1 na primeira linha e incrementando-o na última linha.
Na primeira linha, exclua o primeiro dígito de cada sequência, enquanto na segunda linha, exclua todos os dígitos, exceto o primeiro.
Na terceira linha, bit a bit e os dois primeiros dígitos juntos.
Nesse ponto, cada linha consiste em dois valores: a) um contador de largura horizontal eb) o bit a bit e o número de bits extraídos de cada string. Converta qualquer
1
s restante em#
s para que eles possam ser comparados com o contador.Encontre todas as execuções de bits (verticalmente) que correspondam ao contador (horizontalmente), correspondentes aos quadrados de
1
s na entrada original e quadrilhe o comprimento.Classifique numericamente.
Pegue o maior.
Caso especial da matriz zero.
fonte
JavaScript, 92 bytes
Mostrar snippet de código
fonte
APL (Dyalog Classic) ,
2120 bytesExperimente online!
fonte
Python 2 ,
117109 bytesOs nossos agradecimentos a @etene por apontar uma ineficiência que me custou um byte adicional.
Experimente online!
Recebe a entrada como uma sequência separada por vírgula. Essa é uma abordagem baseada em regex que tenta combinar a sequência de entrada com os padrões do formulário
111.....111.....111
para todos os tamanhos possíveis do quadrado.Nos meus cálculos, fazer isso com um lambda anônimo é apenas um pouco menor que a função definida ou um programa completo. A
or 1
parte no final é necessária apenas para lidar com o caso estranho da aresta, onde devemos produzir1
se não houver nenhum na entrada.fonte
Python 2 ,
116115117109 bytesCréditos ao @Kirill por me ajudarem a jogar ainda mais e por sua solução inteligente e inicial
Edit : Golfed 1 byte usando um lambda, eu não sabia que atribuí-lo a uma variável não conta para a contagem de bytes.
Edit 2 : Kirill apontou que minha solução não funcionava nos casos em que a entrada contém apenas
1
s, tive que corrigi-la e perdi dois bytes preciosos ...Edit 3 : mais golfe graças a Kirill
Pega uma sequência separada por vírgula e retorna um número inteiro.
Experimente online!
Eu encontrei independentemente uma resposta próxima à de Kiril, ou seja, com base em regex, exceto que eu uso
re.search
e a.def
Ele usa uma regex criada durante cada loop para corresponder a um quadrado incrementalmente maior e retorna o maior ou 1.
fonte
if
abordagem como "muito longa, com certeza", mas depois tive que inventar outra maneira de fazer com que um valor bool fora da partida. Infelizmente, sua solução perde um ponto - você não pode ter apenasrange(l)
- perderá o caso quando não houver zeros. Por exemplo, tomar caso 2º teste e fazer tudo 1s - deve se tornar 16, não 9.find
. Agora que nossos códigos não são mais idênticos, sugiro que ao menos corrijamos os erros óbvios um do outro - no seu caso, o byte extra vem do uso da tupla em("1"*i,)
vez da lista.find
também, foi inteligente da sua parte.Ruby
-n
, 63 bytesExperimente online!
Versão Ruby da minha resposta em Python . Golfier como um programa completo. Como alternativa, uma lambda anônima:
Ruby ,
7068 bytesExperimente online!
fonte
Perl 6 ,
616058 bytesExperimente online!
fonte
Python 2 ,
138128 bytesExperimente online!
Salvou
fonte
Clojure, 193 bytes
Uau, as coisas aumentaram: o
Menos golfe:
fonte