Introducción
Conocidos códigos de golfistas nos prepararon para la inundación del fin del mundo . Las áreas en riesgo fueron evacuadas y la población se trasladó a terreno elevado.
Subestimamos la inundación (o tal vez hubo un error en el código de @ user12345). Algunas áreas de tierras altas se están acercando rápidamente al nivel del mar. Deben erigirse muros para garantizar la supervivencia de los campamentos ahora densamente poblados. Lamentablemente, el gobierno tiene un suministro limitado de muros.
Problema
Nuestro escenario del fin del mundo se describe con dos números en una sola línea, ny m. Después de esa línea hay nlíneas con mvalores por línea, separadas solo por un espacio único. Cada valor será uno de cuatro caracteres.
xInfranqueable. El agua no puede fluir aquí. Las paredes no se pueden erigir aquí.-Inestable. El agua puede fluir a través de esto aquí. Las paredes no se pueden erigir aquí..Estable. El agua puede fluir por aquí. Las paredes se pueden erigir aquí.oCampamento. El agua puede fluir por aquí. Si lo hace, todos mueren. Los muros no se pueden construir aquí.
El agua fluirá desde todos los bordes del mapa, a menos que el borde sea intransitable o se construya un muro en el azulejo. Escriba un programa que pueda generar la cantidad mínima de muros necesarios para proteger un campamento.
Entrada de ejemplo
6 7
x . . x x x x
x . . x - - x
x . x x - - x
x . o o o - .
x . o o o - .
x x x x x x x
Salida de ejemplo
3
Supuestos
- El agua solo fluye ortogonalmente
- Los campamentos solo existen como un bloque contiguo ortonagonalmente por escenario
- Siempre existirá una solución (aunque puede requerir grandes cantidades de paredes)
- Los campamentos no se pueden ubicar en un borde, ya que el escenario no tendría solución
- 2
n<<16 - 2
m<<16 - La entrada puede proporcionarse desde stdin, leerse desde "city.txt" o aceptarse como un argumento único
¡El código más corto gana!

Respuestas:
Mathematica,
257253caracteresLa entrada se lee desde
"city.txt".Explicación:
Mathematica tiene muchas funciones para tratar con gráficos.
Primero, leo los datos de
"city.txt".Luego construyo un gráfico de cuadrícula con 'm' * 'n' vértices (
GridGraph@d[[1,{2,1}]]), y agrego un "vértice en el infinito" que está conectado a cada vértice en los "bordes" del gráfico. Este vértice es de donde fluye el agua.Y
o,xysdenota las posiciones de "o", "x" y "." respectivamente.Luego, para cualquier subconjunto
wdes(los subconjuntos están ordenados por longitud), elimino los vértices enxywdesdeg(VertexDelete[g,x⋃w]), y encuentro la longitud de la ruta más corta desde el "vértice en el infinito" hasta el campamentoo. Si la longitud es infinita, entonces el campamento estará a salvo. Entonces, la longitud del primerowes el número mínimo de paredes requeridas para proteger un campamento.fuente
C,
827 799522Golfizado:
La entrada se proporciona con la altura y con argumentos de línea de comando, y luego la cuadrícula se lee como una sola cadena en stdin de la siguiente manera:
./a.out 6 7 < inputdonde la entrada tiene esta forma (de izquierda a derecha, de arriba a abajo):"Legible":
No es tan corto como la solución de @Claudiu, pero funciona increíblemente rápido. En lugar de inundación desde los bordes, encuentra el campamento y trabaja hacia afuera desde las fichas 'o'.
Ejemplos de ubicaciones de pared:
fuente
@). Traté de ejecutar tu código yo mismo, pero no pareció funcionarPython,
553525512449414404387368 caracteres (+4? Para invocación)Me divertí demasiado jugando al golf. ¡Es 82 bytes más grande si intentas comprimirlo! Ahora que es una medida de compacidad y falta de repetición.
Los niveles de sangría son espacio, tabulación.
Uso :
Lee de
city.txt:Invoque de la siguiente manera:
El
2>Xobjetivo es ocultar stderr ya que el programa se cierra al generar una excepción. Si esto se considera injusto, siéntase libre de agregar 4 caracteres para la invocación.Explicacion :
Fuerza bruta simple.
Chace un relleno de inundación y devuelve verdadero si golpea un campamento. Sin relleno adicional ya que tomó demasiado espacio para configurar el relleno correctamente.D, dado un conjunto de muros para rellenar, llamaCdesde todos los puntos del borde de manera tal queCtenga en cuenta esos muros e imprime la longitud y las salidas si ninguno de ellos llega al campamento. La lista de paredes también se utiliza para realizar un seguimiento del relleno de inundación, por lo que no es necesario copiar el tablero. Trickily,Ctambién anexa ningún espacios vacíos que encuentra a una lista,S, por lo que la funciónDes también utilizado para primera construcción de la lista de espacios vacíos. Por esta razón, utilizo ensumlugar deany, para asegurarme de que todos los.correos electrónicos se recopilan en el primer recorrido.Invoco
Duna vez, luego copio la lista de espacios vacíosZya queSse seguirá agregando a (ineficiente, pero más barato en el recuento de caracteres). Luego usoitertools.combinationspara seleccionar cada combo de puntos vacíos, desde 0 puntos hacia arriba. Ejecuto cada combo a través deDe imprime la longitud del primero que funciona, lo que genera una excepción para salir del programa. Si no se encuentra ninguna respuesta, no se imprime nada.Tenga en cuenta que actualmente, el programa no funciona si no se necesitan paredes. Sería +3 personajes para encargarse de este caso; No estoy seguro si es necesario.
También tenga en cuenta que este es un
O(2^n)algoritmo, dondenes el número de puntos vacíos. Por lo tanto, para un tablero 15x15 completamente vacío con un campamento en el medio, esto tomará2^(15*15-1)=2.6959947e+67iteraciones para completar, ¡lo que va a ser mucho tiempo!fuente
Groovy:
841805754Sin golf:
Mucho más golf por venir ...
Devuelve 2E9 si no hay solución.
fuente
Dyalog APL , 91 bytes
⊃∊{1∊a[⍸×{(×d)∧s 3∨/3∨⌿⍵}⍣≡4=d←0@⍵⊢a]:⍬⋄≢⍵}¨c[⍋≢¨c←(,⍳2⊣¨b)/¨⊂b←⍸2=a←(s←(4,4,⍨⍉)⍣2)'xo.'⍳⎕]asume
⎕IO=0, usa características de v16.0 (@y⍸), el tiempo de ejecución es exponencial en el número de.-s⎕se evalúa la entrada, debe ser una matriz de caracteres'xo.'⍳reemplacexcon 0,ocon 1,.con 2 y todos los demás con 3s←(4,4,⍨⍉)⍣2una función que rodea una matriz con 4sa←asignar la matriz numérica rodeada de 4s a una variableab←⍸2=bes la lista de pares de coordenadas donde los 2 (es decir, los.-s) son(,⍳2⊣¨b)/¨⊂bgenerar todas las combinaciones de elementos debc[⍋≢¨c←...]ordenarlos por tamaño{... :⍬⋄≢⍵}¨para cada combinación, marque algo y devuelva su longitud o una lista vacía⊃∊el primer resultado no vacíod←0@⍵⊢adesacon algunos elementos reemplazados por 04=crear matriz booleana: ¿dónde están los 4? es decir, el borde que agregamos{...}⍣≡siga aplicando la función{}hasta que el resultado se estabilice3∨/3∨⌿⍵"booleano o" cada elemento con sus vecinossel resultado será más pequeño, así que volvamos a crear el borde(×d)∧aplicar los elementos distintos de cero ded(los no muros) como una máscara booleanaa[⍸× ...]¿Quéacorresponde a los 1 en nuestra matriz booleana?1∊¿Hay algún 1, es deciro, campamentos?fuente