El granjero Jack es muy pobre. Quiere iluminar toda su granja pero con un costo mínimo. Una lámpara puede iluminar su propia celda y sus ocho vecinos. Él ha dispuesto las lámparas en su campo, pero necesita su ayuda para averiguar si ha guardado o no lámparas adicionales.
Lámparas adicionales: Lámparas que al retirar de la granja no harán ninguna diferencia en el número de celdas encendidas. Además, las lámparas que apuntará no se eliminarán una por una, sino que se eliminarán simultáneamente.
Nota: La única acción que puede realizar es quitar algunas lámparas. No puede reorganizar ni insertar lámparas. Su objetivo final es eliminar el número máximo de lámparas de manera que cada celda que se encendió antes todavía esté encendida.
Ayuda al granjero Jack a detectar la cantidad máxima de lámparas inútiles para que pueda usarlas en otro lugar.
Entrada
Se le dará en las primeras dimensiones de la línea del campo de M y N .Next M líneas siguen conteniendo N caracteres cada uno que representa el campo.
'1' representa la celda donde se guarda la lámpara.
'0' representa una celda vacía.
Salida
Debe generar un número entero que contenga varias lámparas inútiles.
Entrada de muestra:
3 3
100
010
001
Salida de muestra:
2
Ganador:
Como se trata de un código de golf, el ganador será el que completará con éxito la tarea en el menor número de caracteres.
Respuestas:
Mathematica 186 (codicioso) y 224 (todas las combinaciones)
Solución codiciosa
Esto apaga las luces superfluas una por una. Si la cobertura de la luz no disminuye cuando la luz se apaga, esa luz se puede eliminar. El enfoque codicioso es muy rápido y puede manejar fácilmente matrices de 15x15 y mucho más grandes (ver más abajo). Devuelve una solución única, pero no se sabe si eso es óptimo o no. Ambos enfoques, en las versiones de golf, devuelven el número de luces no utilizadas. Los enfoques sin golf también muestran las cuadrículas, como se muestra a continuación.
Antes de:
Después:
Soluciones óptimas que utilizan todas las combinaciones de luces (224 caracteres)
Gracias a @ Clément.
Versión sin golf con todas las combinaciones de luces.
La función de transformación morfológica utilizada en los
sameCoverageQ
tratamientos como iluminado (valor = 1 en lugar de cero) del cuadrado de 3 x3 en el que reside cada luz. Cuando una luz está cerca del borde de la granja, solo los cuadrados (menos de 9) dentro de los bordes de se cuenta la granja. No se cuenta demasiado; simplemente se enciende un cuadrado iluminado por más de una lámpara. El programa apaga cada luz y comprueba si se reduce la cobertura de iluminación general en la granja. Si no es así, esa luz se elimina.nOnes[matrix]
cuenta el número de celdas marcadas. Se usa para contar las luces y también para contar las celdas encendidassameCoverageQ[mat1, mat2]
prueba si las celdas encendidas en mat1 son iguales al número de celdas encendidas en mat2.MorphologicalTransform [[mat] toma una matriz de luces y devuelve una matriz` de las celdas que encienden.c[m1]
toma todas las combinaciones de luces de m1 y las prueba para su cobertura. Entre los que tienen la máxima cobertura, selecciona los que tienen menos bombillas. Cada uno de estos es una solución óptima.Ejemplo 1:
Una configuración de 6x6
Todas las soluciones óptimas.
Versión de golf con todas las combinaciones de luces.
Esta versión calcula el número de luces no utilizadas. No muestra las cuadrículas.
c
Devuelve el número de luces no utilizadas.n[matrix]
cuenta el número de celdas marcadas. Se usa para contar las luces y también para contar las celdas encendidass[mat1, mat2]
prueba si las celdas encendidas en mat1 son iguales al número de celdas encendidas en mat2.t [[mat] toma una matriz de luces y devuelve una matriz` de las celdas que encienden.c[j]
toma todas las combinaciones de luces de j y las prueba para su cobertura. Entre los que tienen la máxima cobertura, selecciona los que tienen menos bombillas. Cada uno de estos es una solución óptima.Ejemplo 2
Se pueden guardar dos luces con la misma cobertura de iluminación. cm]
fuente
Python, 309 caracteres
Funciona con máscaras de bits.
L
es una lista de las luces, donde cada luz está representada por un número entero con (hasta) 9 bits establecidos para su patrón de luz. Luego buscamos exhaustivamente los subconjuntos de esta lista cuyo bit a bit, o es el mismo que el bit a bit, o de toda la lista. El subconjunto más corto es el ganador.m
es una máscara que evita que los bits se envuelvan al desplazarse.fuente
Java 6 - 509 bytes
Hice algunas suposiciones sobre los límites y resolví el problema como se indicó en este momento.
Corre así:
java F <inputfile 2>/dev/null
fuente
java F <inputfile 2>nul
, si eso falla,java F <inputfile
ignore la excepción. Además, no se ejecutará con Java 7.c ++ - 477 bytes
fuente
Rubí, 303
[esto fue codificado para responder una versión previa de la pregunta; lea la nota a continuación]
Convirtiendo en matrices de booleanos y luego comparando barrios para los cambios.
Limitación (?): El tamaño máximo del campo de la granja es 1,000 x 1,000. El problema dice "El granjero Jack es muy pobre", así que supongo que su granja no es más grande. ;-) La limitación se puede eliminar agregando 2 caracteres.
NOTA: Desde que comencé a codificar esto, parece que los requisitos de la pregunta cambiaron. Se agregó la siguiente aclaración "las lámparas que señalará no se eliminarán una por una, sino que se eliminarán simultáneamente" . La ambigüedad de la pregunta original me permitió guardar algo de código al probar la eliminación de lámparas individuales . Por lo tanto, mi solución no funcionará para muchos casos de prueba bajo los nuevos requisitos. Si tengo tiempo, arreglaré esto. Yo quiza no. Por favor, no vote esta respuesta, ya que otras respuestas aquí pueden ser totalmente compatibles.
fuente
APL, 97 caracteres / bytes *
Asume una
⎕IO←1
y⎕ML←3
entorno de APL.Versión sin golf:
Estoy de acuerdo en que más casos de prueba serían mejores. Aquí hay uno al azar:
Entrada:
Salida (lámparas inútiles):
Diseño con lámparas mínimas (no incluidas en la versión de golf):
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ *: APL se puede escribir en su propio juego de
caracteres de un solo byte (heredado) que asigna símbolos APL a los valores superiores de 128 bytes. Por lo tanto, para fines de puntuación, un programa de N caracteres que solo usa caracteres ASCII y símbolos APL puede considerarse que tiene una longitud de N bytes.
fuente
C ++ 5.806 bytes
Esto aún no está optimizado para el tamaño. Pero como hay pocos concursantes, lo dejaré así por ahora.
FarmersField Header:
FarmersField CPP:
Y un conjunto de pruebas para mostrar que el código hace para lo que fue creado:
fuente
Perl 3420 bytes
No es una solución de golf, pero este problema me pareció interesante:
(Se sacaron las E / S para poder mostrar pruebas concretas)
fuente
Python - 305 bytes
fuente