Las especies de gansos conocidos como Alex A son conocidos por residir en cuadrículas triangulares que consisten en 64 células:
(Imagen tomada de este problema no relacionado del Proyecto Euler ).
Vamos a etiquetar cada celda con los números 0
para 63
comenzar desde la fila superior y luego movernos de izquierda a derecha en cada fila debajo de eso. Entonces la celda superior es 0
y la celda inferior derecha es 63
.
Cada celda tiene tres bordes. Podemos etiquetar cada borde en la forma a,b
donde a
y b
son los números de las celdas que comparten ese borde. Por ejemplo, el borde entre la celda 0
y 2
se llamaría 0,2
o 2,0
(no importa en qué orden los coloque).
El sistema de etiquetado para los bordes en el borde de la cuadrícula es diferente, ya que las celdas en el borde de la cuadrícula tienen un borde que no comparten con otras celdas. Si un borde es solo parte de una celda, utilizaremos la letra X
. Por ejemplo, las tres fronteras de célula 0
son 0,2
, 0,X
, y 0,X
.
Algunas de las células contienen gansos . Sin embargo, estos gansos serán asesinados por zorros malvados (que vienen de fuera de los bordes de la cuadrícula) si no los proteges. Y si todos los gansos mueren, BrainSteel estará triste. Por lo tanto, escribiremos un programa que construya cercas alrededor de los gansos para protegerlos de los zorros. Los gansos deberían existir en un único polígono de cercos completamente cerrado. Nuestro presupuesto de cercas es bastante bajo, así que use la menor cantidad de cercas posible.
Descripción de entrada
Una lista de números, separados por comas, de 0
a 63
, que representan las celdas que contienen gansos. Ejemplo:
6,12
Descripción de salida
Una lista de fronteras que necesitan tener cercas construidas para proteger a los gansos con éxito. Este debería ser el menor número de cercas posible. Ejemplo:
5,6 6,7 11,12 12,13
Respuestas:
C #, 530 bytes
Complete el programa C #, toma la entrada como una sola línea desde STDIN y emite una sola línea hacia STDOUT, con un "" final.
Esto es bastante largo ... y tiene demasiada repetición x / y / z, pero hasta ahora no he podido reducirlo a nada sensato, y tener un examen en 2 horas, podría volver a esto mañana.
Este diagrama explica la mayor parte de lo que está sucediendo.
Reconozca que debido a que no podemos tener secciones de ancho 0, un "hexágono" siempre será la forma más barata (y tiene la ventaja de dar a los gansos el máximo espacio para moverse).
El programa funciona traduciendo primero todos los índices de las celdas de entrada a las coordenadas x / y / z, y encontrando el mínimo / máximo de cada uno de x / y / z.
A continuación, revisa cada índice de celda y comprueba si encaja en el límite 'hexágono' que hemos descrito. Si es así, comprueba si está en cualquiera de los bordes extremos de los límites (es decir, x = xmin, o y = ymax) y agrega los bordes correspondientes si es así. Tiene que resolver el índice del borde al lado del cual está. Para x y z, simplemente los incrementamos / decrementamos como queramos, y luego usamos la siguiente fórmula:
Observe que la "paridad" siempre cambia, y que y no está involucrado. Para y, no tenemos que cambiar nada, pero el código es un poco desordenado porque tiene que realizar una comprobación de límites de "triángulo" para detectar si la celda de al lado debe ser una "X" o no.
Solución de ejemplo (Celdas con gansos justo desde las tres esquinas):
Código ordenado con comentarios:
fuente
using System;
.using Q=System.Console;Q.Write();Q.ReadLine()
(45 Bytes) versus su sugerenciausing System;Console.Write();Console.ReadLine()
(47 Bytes).i
,x
,y
,z
, yp
a 0.