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, n
y m
. Después de esa línea hay n
líneas con m
valores por línea, separadas solo por un espacio único. Cada valor será uno de cuatro caracteres.
x
Infranqueable. 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í.o
Campamento. 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
,x
ys
denota las posiciones de "o", "x" y "." respectivamente.Luego, para cualquier subconjunto
w
des
(los subconjuntos están ordenados por longitud), elimino los vértices enx
yw
desdeg
(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 primerow
es 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 < input
donde 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>X
objetivo 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.
C
hace 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, llamaC
desde todos los puntos del borde de manera tal queC
tenga 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,C
también anexa ningún espacios vacíos que encuentra a una lista,S
, por lo que la funciónD
es también utilizado para primera construcción de la lista de espacios vacíos. Por esta razón, utilizo ensum
lugar deany
, para asegurarme de que todos los.
correos electrónicos se recopilan en el primer recorrido.Invoco
D
una vez, luego copio la lista de espacios vacíosZ
ya queS
se seguirá agregando a (ineficiente, pero más barato en el recuento de caracteres). Luego usoitertools.combinations
para seleccionar cada combo de puntos vacíos, desde 0 puntos hacia arriba. Ejecuto cada combo a través deD
e 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, donden
es 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+67
iteraciones 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.'⍳
reemplacex
con 0,o
con 1,.
con 2 y todos los demás con 3s←(4,4,⍨⍉)⍣2
una función que rodea una matriz con 4sa←
asignar la matriz numérica rodeada de 4s a una variablea
b←⍸2=
b
es la lista de pares de coordenadas donde los 2 (es decir, los.
-s) son(,⍳2⊣¨b)/¨⊂b
generar todas las combinaciones de elementos deb
c[⍋≢¨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@⍵⊢a
d
esa
con 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 vecinoss
el 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éa
corresponde a los 1 en nuestra matriz booleana?1∊
¿Hay algún 1, es deciro
, campamentos?fuente