O fazendeiro Jack é muito pobre. Ele quer iluminar toda a fazenda, mas com o mínimo de custo. Uma lâmpada pode iluminar sua própria célula e seus oito vizinhos. Ele organizou as lâmpadas em seu campo, mas ele precisa de sua ajuda para descobrir se ele manteve ou não outras lâmpadas.
Lâmpadas extras: as lâmpadas que, ao serem removidas da fazenda, não farão diferença no número de células acesas. Além disso, as lâmpadas que você apontará não serão removidas uma a uma, mas serão removidas simultaneamente.
Nota: A única ação que você pode executar é remover algumas lâmpadas. Você não pode reorganizar nem inserir lâmpadas. Seu objetivo final é remover o número máximo de lâmpadas, de modo que todas as células que foram acesas antes ainda estejam acesas.
Ajude o fazendeiro Jack a detectar o número máximo de lâmpadas inúteis para que ele possa usá-las em outros lugares.
Entrada
Você será indicado nas dimensões da primeira linha do campo M e N. As próximas linhas M seguem contendo N caracteres, cada um representando o campo.
'1' representa a célula onde a lâmpada é mantida.
'0' representa uma célula vazia.
Resultado
Você precisa emitir um número inteiro contendo o número de lâmpadas inúteis.
Entrada de amostra:
3 3
100
010
001
Saída de amostra:
2
Vencedora:
Como é código de golfe, o vencedor será aquele que concluirá a tarefa com sucesso em menos número de caracteres
Respostas:
Mathematica 186 (ganancioso) e 224 (todas as combinações)
Solução gananciosa
Isso apaga as luzes supérfluas uma a uma. Se a cobertura da luz não diminui quando a luz se apaga, essa luz pode ser eliminada. A abordagem gananciosa é muito rápida e pode lidar facilmente com matrizes de 15x15 e muito maiores (veja abaixo). Ele retorna soluções únicas, mas não se sabe se isso é ideal ou não. Ambas as abordagens, nas versões golfadas, retornam o número de luzes não utilizadas. As abordagens sem golfe também exibem as grades, como abaixo.
Antes:
Depois de:
Soluções ideais usando todas as combinações de luzes (224 caracteres)
Com agradecimentos a @ Clément.
Versão ungolfed usando todas as combinações de luzes
fA função de transformação morfológica usada em
sameCoverageQ
trata como iluminado (valor = 1 em vez de zero) o quadrado 3 x3 no qual cada luz reside.Quando uma luz está próxima à borda da fazenda, apenas os quadrados (menos de 9) dentro das bordas da a fazenda é contada. Não há contagem excessiva; um quadrado aceso por mais de uma lâmpada é simplesmente aceso. O programa apaga cada luz e verifica se a cobertura geral de iluminação da fazenda é reduzida.Se não estiver, essa luz será eliminada.nOnes[matrix]
conta o número de células sinalizadas. É usado para contar as luzes e também para contar as células acesassameCoverageQ[mat1, mat2]
testa se as células acesas em mat1 são iguais ao número de células acesas em mat2.MorphologicalTransform [[mat] pega uma matriz de luzes e retorna uma matriz` das células que acendem.c[m1]
pega todas as combinações de luzes de m1 e as testa quanto à cobertura. Entre os que têm cobertura máxima, seleciona aqueles que têm menos lâmpadas. Cada um deles é uma solução ideal.Exemplo 1:
Uma configuração 6x6
Todas as soluções ideais.
Versão Golfed usando todas as combinações de luzes.
Esta versão calcula o número de luzes não utilizadas. Não exibe as grades.
c
retorna o número de luzes não utilizadas.n[matrix]
conta o número de células sinalizadas. É usado para contar as luzes e também para contar as células acesass[mat1, mat2]
testa se as células acesas em mat1 são iguais ao número de células acesas em mat2.t [[mat] pega uma matriz de luzes e retorna uma matriz` das células que acendem.c[j]
pega todas as combinações de luzes de j e testa sua cobertura. Entre os que têm cobertura máxima, seleciona aqueles que têm menos lâmpadas. Cada um deles é uma solução ideal.Exemplo 2
Duas luzes podem ser salvas com a mesma cobertura de iluminação. cm]
fonte
Python, 309 caracteres
Funciona usando máscaras de bits.
L
é uma lista das luzes, em que cada luz é representada por um número inteiro com (até) 9 bits definidos para seu padrão de luz. Em seguida, pesquisamos exaustivamente subconjuntos dessa lista cujo bit a bit - ou é o mesmo que o bit a bit - ou da lista inteira. O subconjunto mais curto é o vencedor.m
é uma máscara que impede a envolvência dos bits ao mudar.fonte
Java 6 - 509 bytes
Fiz algumas suposições sobre os limites e resolvi o problema conforme declarado neste momento.
Execute assim:
java F <inputfile 2>/dev/null
fonte
java F <inputfile 2>nul
, se isso falhar,java F <inputfile
ignore a exceção. Além disso, ele não roda com o java 7.c ++ - 477 bytes
fonte
Ruby, 303
[isto foi codificado para responder a uma versão anterior da pergunta; leia a nota abaixo]
Convertendo em matrizes de booleanos e comparando vizinhanças para alterações.
Limitação (?): O tamanho máximo do campo do farm é 1.000 x 1.000. O problema declara "O fazendeiro Jack é muito pobre", então estou assumindo que a fazenda dele não é maior. ;-) A limitação pode ser removida adicionando 2 caracteres.
NOTA: Desde que comecei a codificar isso, parece que os requisitos da pergunta foram alterados. O esclarecimento a seguir foi adicionado "as lâmpadas que você apontará não serão removidas uma a uma, mas serão removidas simultaneamente" . A ambiguidade da pergunta original me permitiu salvar algum código testando as remoções de lâmpadas individuais . Portanto, minha solução não funcionará para muitos casos de teste sob os novos requisitos. Se eu tiver tempo, vou consertar isso. Eu não posso. Por favor, não marque esta resposta, pois outras respostas aqui podem ser totalmente compatíveis.
fonte
APL, 97 caracteres / bytes *
Assume um ambiente
⎕IO←1
e⎕ML←3
APL.Versão não destruída:
Concordo que mais casos de teste seriam melhores. Aqui está um aleatório:
Entrada:
Saída (lâmpadas inúteis):
Layout com lâmpadas mínimas (não incluídas na versão golfed):
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL pode ser escrito na sua própria (legado) de conjunto de caracteres de byte único que mapeia símbolos APL para os 128 valores de bytes superiores. Portanto, para fins de pontuação, um programa de N caracteres que usa apenas caracteres ASCII e símbolos APL pode ser considerado como N bytes.
fonte
C ++ 5.806 bytes
Ainda não está otimizado para tamanho. Mas como existem poucos concorrentes, deixarei por enquanto.
Cabeçalho do campo:
CPP de campo:
E um conjunto de testes para mostrar que o código faz o que foi criado para fazer:
fonte
Perl 3420 bytes
Não é uma solução de golfe, mas achei este problema interessante:
(A E / S foi retirada para que eu pudesse mostrar testes concretos)
fonte
Python - 305 bytes
fonte