Te dan una cuadrícula hexagonal de los personajes .
y #
, así:
. . . . . . . .
. . . . # . . .
. # . . . # . .
. . . # . . . .
. . . . . # . .
. . . . . . . .
Su tarea es llenar todo el cuadro delimitador alineado con el eje #
con #
:
. . . . . . . .
. . # # # # . .
. # # # # # . .
. . # # # # # .
. . # # # # . .
. . . . . . . .
El cuadro delimitador alineado con el eje es la forma hexagonal convexa más pequeña que contiene todo #
. Tenga en cuenta que en el caso de la cuadrícula hexagonal, hay tres ejes a considerar (W / E, SW / NE, NW / SE):
Aquí hay otro ejemplo para mostrar que en algunos casos, uno o más lados contendrán solo uno #
:
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . . . . . . . . . . . . .
Puede verlos como hexágonos con lados degenerados, o puede dibujar el cuadro delimitador alrededor de ellos, como he hecho anteriormente, en cuyo caso todavía son hexágonos:
¿Demasiado duro? ¡Prueba la parte I!
Reglas
Puede usar cualquiera de los dos caracteres ASCII imprimibles distintos de espacio (0x21 a 0x7E, inclusive), en lugar de #
y .
. Sin embargo , continuaré refiriéndome a ellos como #
y .
para el resto de la especificación.
La entrada y la salida pueden ser una sola cadena separada por salto de línea o una lista de cadenas (una para cada línea), pero el formato debe ser coherente.
Puede suponer que la entrada contiene al menos una #
y todas las líneas tienen la misma longitud. Tenga en cuenta que hay dos "tipos" diferentes de líneas (comenzando con un espacio o un no-espacio) - es posible que no se asuma que la entrada se inicia siempre con el mismo tipo. Puede suponer que el cuadro delimitador siempre cabe dentro de la cuadrícula que se le proporciona.
Puede escribir un programa o una función y utilizar cualquiera de nuestros métodos estándar para recibir entradas y proporcionar salidas.
Puede usar cualquier lenguaje de programación , pero tenga en cuenta que estas lagunas están prohibidas de forma predeterminada.
Este es el código de golf , por lo que gana la respuesta válida más corta, medida en bytes .
Casos de prueba
Cada caso de prueba tiene entrada y salida una al lado de la otra.
# #
. . . .
# . # # # #
. . . .
. # . #
. . . . # .
# . # .
# . # .
. . . . # .
. # . #
# . # .
# . . # # .
. # # #
. # # #
# . . # # #
. # # #
. . # . # #
. . # #
# . . # # .
# . . # # .
. . # #
. . # . # #
. . . . . . . . . . . . . . . .
. . # . # . . . . . # # # . . .
. . . . . . . . . . . # # . . .
. . . # . . . . . . . # . . . .
. . . . . . . . . . . . . . . .
. . # . . . # . . . # # # # # .
. . . . . . . . . . . # # # # .
. . . # . . . . . . . # # # . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . # . . . . . # # # # . .
. # . . . # . . . # # # # # . .
. . . # . . . . . . # # # # # .
. . . . . # . . . . # # # # . .
fuente
Respuestas:
Pyth ,
8271 bytesPruébalo en línea!
Explicación
Sea A el punto con la coordenada y más baja y B el punto con la coordenada y más alta.
Sea C el punto con el más bajo (valor x menos el valor y) y D el punto con el más alto.
Sea E el punto con el valor más bajo (valor x más valor y) y F el punto con el valor más alto.
Entonces es equivalente a encontrar las coordenadas en las que la coordenada y está entre A y B, el valor x menos el valor y está entre C y D, y el valor x más el valor y está entre E y F.
fuente
Haskell,
256 254243 bytes¡Gracias @Damien por jugar al golf
f
!La entrada se toma como una lista de caracteres, la salida se proporciona de la misma manera.
Así que esta era una bestia para escribir. Se basa en la idea de LeakyNun utilizando un filtrado basado en máximo y mínimo en las coordenadas de los elementos.
Estoy realmente sorprendido por el hecho de que
m=map
realmente ahorra bytes, ya que parece muy costoso.Explicación:
Aquí hay una versión ligeramente menos descuartizada (énfasis en ligeramente ):
f
es una función que asigna a cada carácter un índice(y-index, x-index)
mientras preserva la estructura original de la lista.b
: Dado un elemento de la lista indexada,b
computa[y-index, y - x, y + x]
.p
: Dado el campo indexado, devuelve 3 funcionesInt -> Bool
, la primera de las cuales es la verificación del índice y, la segunda de la diferencia y la tercera de la suma.min(snd e)
cuida los espacios (un espacio es más pequeño que ambos). Esta función está incorporada en el código de golf.q
dado el campo indexado, cambie todo lo necesario.
para#
verificar si ese campo específico vuelveTrue
a cada función de prueba.La solución final es entonces la composición de
q
yf
.fuente
f=z(\y->z((,).(,)y)[0..])[0..]
h x=z x[0..]
f=h$h.curry(,)
Python 3,
380378348346 bytesTenga en cuenta que la sangría es con pestañas, no espacios.
Versión de golf:
Pruébalo en Ideone
Explicación (para la versión no golfizada a continuación):
Todo el procesamiento se realiza sin ninguna conversión, los caracteres de espacio simplemente se omiten.
La función
axes_pos
calcula 3-tuplas de coordenadas imaginarias "3D", se acumulan en (mínimo en elementos) 3-tuplas máximas (bmin
,bmax
) para todos los#
caracteres.Las coordenadas se calculan en
def axes_pos(x, y): return y, x + y, lc - y + x
;donde X cuenta de 0 a derecha e Y cuenta de 0 a abajo (de la primera línea a la última).
La primera coordenada imaginaria es básicamente Y, porque es obvio por qué. Su hacha es ortogonal a los límites verdes (en las imágenes del OP). La
segunda es ortogonal a los límites rojos, y la tercera es ortogonal a los límites azules.
En la segunda pasada, el reemplazo se realiza para todos los
.
caracteres cuyas coordenadas "3D" caen dentro debmin
...bmax
rango, elemento inteligente: esto se verifica en esta expresiónall(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))
.Versión sin golf con pruebas, también en Ideone :
Actualización 1:Eliminado innecesario
Actualización 2,3:-1
para la tercera coordenada imaginaria, porque no cambia nadaMejoras parcialmente implementadas sugeridas por
Leaky Nun
+ my own también.fuente
def A(x,y):return y,x+y,len(L)-1-y+x
->A=lambda x,y:(y,x+y,len(L)-1-y+x)
len(L)-y+x
enx-y
Gelatina ,
4535 134241 bytesEsta es una lista de enlaces; el último tiene que ser llamado en la entrada para producir la salida.
I / O está en forma de matrices de cadenas, donde
.
indica vacío e@
indica lleno.Pruébalo en línea! o verificar todos los casos de prueba .
Fondo
Consideremos el siguiente ejemplo.
Al dibujar un par o líneas paralelas, el par más cercano que encierra todas las posiciones rellenas, en cada una de las tres direcciones, podemos determinar el cuadro de límite hexagonal.
En la implementación, reemplazamos todos los caracteres entre esas dos líneas con
@
, y todo lo que esté fuera de estas líneas.
, con la posible excepción de diagonales que solo contienen espacios).Para el eje horizontal, esto da
para el eje diagonal descendente, da
y para el eje diagonal de elevación, da
Al tomar el mínimo en cuanto a carácter de los tres, ya que
.
<@
, obtenemosTodo lo que queda por hacer es restaurar los espacios.
Cómo funciona
fuente
Python,
237230 bytes7 bytes gracias a Dennis.
Puerto de mi respuesta en Pyth .
Toma una matriz de líneas como entrada, emite una matriz 2D de caracteres.
fuente
Perl,
128126 bytesIncluye +6 para
-0F\n
Ejecutar con entrada en STDIN. Uso
1
para lleno,0
para vacío. Las líneas no tienen que rellenarse con espacios al final:hexafill.pl
Utiliza coordenadas de cubo. Determine el máximo y el mínimo durante el
$= == 1
ciclo y complete las coordenadas entre estos límites durante el$= == 0
ciclo. Los primeros 58 bucles no tienen sentido y solo están allí para llenar$-
con el número de líneasfuente
TSQL, 768 bytes
Escribí una consulta para resolver esto, que encontré bastante difícil. No puede competir con todas las excelentes respuestas más cortas. Pero quería publicarlo de todos modos para aquellos interesados. Perdón por la longitud de la respuesta: esperar que codegolf también se trate de enfoques diferentes.
Golfizado:
Sin golf:
Violín sin golf
fuente
Octava GNU,
212, 196 bytesTal vez no sea el idioma de elección favorito de un golfista, pero eso es lo que hace el desafío, ¿no? Suponiendo que m se toma como una matriz de caracteres: 178 bytes independientes y 196 si se introducen en una función .
golfizado:
sin golf:
Explicación : construimos un sistema de coordenadas, 3 ejes, ortogonales a los lados de los hexágonos, encontramos el máximo y el mínimo de cada coordenada, luego construimos una máscara lógica que comienza con 1 en todas partes y lógicamente y: ajustando cada coordenada máxima y mínima, finalmente restableciendo cada posición "verdadera" restante a "#" char.
Si quieres probarlo, puedes crear una matriz m como esta:
y luego llame a f (m) y compare con m construyendo una matriz con ambos en:
fuente
m
y la salida se almacenarák
. Las respuestas siempre deben ser programas completos o funciones invocables.