La imagen de arriba se llama hexa-glifo. Los hexaglifos son algunos patrones geniales que inventé mientras hacía garabatos durante mi clase DiffEq. Así es como haces uno:
- Considere el siguiente conjunto de puntos, con forma de hexagrama regular. El hexágono interno es el que contendrá el glifo final, mientras que los 6 puntos externos forman una estrella y es donde comenzaremos a dibujar nuestras líneas.
- De los seis puntos externos, seleccione aleatoriamente un par. Para mayor eficiencia, debería haber al menos otro punto entre los dos puntos seleccionados (de lo contrario, no tendría ningún efecto en la figura final). Luego, desde cada uno de los dos puntos, lanza un rayo hacia el otro. Este rayo está bloqueado por líneas anteriores.
- Repita este proceso hasta que se hayan formado los 9 bordes, como se muestra en las siguientes imágenes.
- Aquí hay un ejemplo de rayos bloqueados. Los extremos del segmento del rayo todavía son visibles, pero la porción central está ocluida por los dos primeros segmentos que dibujamos.
- Estos dos rayos también están "bloqueados", pero esto no causa ninguna diferencia visible porque están bloqueados por la misma otra línea.
- Avance rápido hasta que se dibujan las 9 líneas. Si desea una explicación más detallada de estos pasos omitidos, puedo exponer.
- Finalmente, elimina los puntos de la estrella. Para que parezca más bonito, también se eliminan los puntos gruesos.
El reto
Su desafío es generar una representación visual de un hexaglifo aleatorio. Este es el código de golf, gana la menor cantidad de bytes.
Todos los hexaglifos posibles deben aparecer con alguna probabilidad positiva. Se generan diferentes hexaglifos al cambiar el orden en que se dibujan los 9 bordes.
Además, todas las imágenes producidas por su programa deben ser hexaglifos válidos. Ciertos patrones (como un esquema completo del hexágono interno) no pueden aparecer como un hexaglifo, por lo que el programa no debe generarlos.
El resultado debe ser una imagen gráfica (impresa en pantalla o archivo).
El hexágono debe ser regular, pero puede aparecer en cualquier orientación.
Las reflexiones / rotaciones no se consideran únicas. (Esto podría hacer que el requisito 1 sea más fácil de seguir).
fuente
I made up while doodling during my DiffEq class
. La forma en que ocurren todos los grandes descubrimientos ...: P'01'
espacio intercalado en lugar de' *'
.Respuestas:
Mathematica,
273268264242 bytesSe
representa como un superíndiceT
en Mathematica y es un operador de transposición de postfix.Resolver los errores en esto tomó una eternidad ... hacia el final, pirateé algunas cosas juntas para que funcionara, así que esto definitivamente es subóptimo. También me pregunto si en general sería mejor implementar la especificación más literalmente a través de las líneas a través del hexágono exterior y dejar que las funciones de geometría de Mathematica manejen las intersecciones.
Tenga en cuenta que este es un programa completo y si desea ejecutar el código varias veces dentro de una sola sesión REPL, deberá prefijarlo
Clear[b]
.Aquí están los resultados de 20 carreras:
Explicación
Esta solución no hace uso de los puntos estelares externos en absoluto. En cambio, trabaja directamente con los puntos que forman parte del hexágono y las líneas que cubren tres de ellos a la vez.
Etiquetemos los puntos:
1
comienza en una esquina ligeramente extraña, pero esto se debe al comportamiento predeterminado (también algo extraño) deCirclePoints
. Comenzar el hexágono desde allí resultó más barato.Ahora queremos encontrar las líneas relevantes a través de tres de esos puntos que corresponden a puntos conectados de la estrella exterior. Los que rodean el hexágono son, por supuesto, solo 3 puntos adyacentes (módulo 12), comenzando desde un número impar. Los del otro lado del centro consisten en un número par
n
,13
yn+6
.Las representaciones de estas líneas (en forma de listas de tres puntos son generadas por el siguiente código):
El
Partition
genera las líneas alrededor del hexágono yArray
las líneas a través del centro. Para procesar ambas vigas, asignamos esta función sobre la lista de líneas:Ahora los barajamos
RandomSample
para procesarlos en un orden aleatorio.Join @@
aplana la lista de pares para que tengamos una lista de vigas.Intermedio breve: para realizar un seguimiento de los puntos que ya están bloqueados, utilizamos una función de búsqueda
b
, que se inicializaTrue
para todos los valores medianteb@_=k=1>0;
. Al procesar una viga, conservamos todos los puntos hasta el primer punto que tieneb[n] == False
( incluido ese):Siento que esta es la parte más golfa en este momento ... el uso de dos variables temporales para jugar Mastermind parece realmente costoso. De todos modos, el resultado de esto nos da los puntos en una línea que podemos dibujar. Ahora esta función se asigna sobre cada uno de esos puntos:
La primera parte genera la lista de los 13 puntos utilizando los resultados intercalados de dos llamadas a
CirclePoints
(con diferentes radios para los centros de los bordes y las esquinas del hexágono). Tenga en cuentab@#=!k
que ahora establece el valor de la tabla de búsqueda para el punto actual, deFalse
modo que ninguna viga más pueda pasar a través de él. Finalmente, el valor se usa como índice en la lista de coordenadas para obtener el punto 2D correcto.Esto descarta todas las listas de un solo elemento, ya que se representarían como puntos individuales (y visibles). Finalmente presentamos el resultado:
fuente
b@_=1>0
=b=1>0&
Zapatos (Ruby) Rev C 184 bytes
Se ahorran 12 bytes transfiriendo la responsabilidad de verificar si una media línea particular se debe dibujar del programa principal al método de dibujo. Sin embargo, el programa principal todavía tiene que verificar si toda la línea está completamente bloqueada.
Zapatos (Ruby)
205... Rev B 196 bytesShoes es una herramienta basada en rubíes para crear GUI, etc. Es la primera vez que la uso. mothereff.in/byte-counter cuenta mi envío como 196 bytes, pero por alguna razón Shoes lo cuenta como 202.
Además, Ruby te permite hacer cosas como,
t[a=i.ord]
pero extrañamente, parece que no funciona como se esperaba con Shoes.Explicación
No considero las partes de la línea fuera del hexágono. Solo dibujo la parte que necesita ser dibujada. Lo importante es si las líneas cruzan las intersecciones (si solo dibujamos las partes que deben dibujarse, esto significa que comienzan / terminan en las intersecciones).
La regla básica es que si se han visitado los dos puntos finales de una línea, la línea está bloqueada y no debe dibujarse. Como las líneas se dibujan en dos mitades, también tenemos que verificar si se ha visitado el punto medio para ver si cada mitad se debe dibujar o no.
Llevo un registro de los puntos que se han visitado en la matriz
t[]
. Esto termina conteniendo una entrada para cada coordenada física en la cuadrícula a continuación. No hay una matriz lógica de 13 elementos separada. Al final,t[]
puede tener 87 elementos, aunque solo hasta 13 contendrán datos útiles.Internamente, las coordenadas de los puntos finales de las líneas están dadas por un solo número z, donde z% 6 es la coordenada y y z / 6 es la coordenada x. En este sistema, el hexágono se aplana. Cuando se trazan las líneas, la escala x se multiplica por 8 y la escala y se multiplica por 14, que es una aproximación racional muy cercana a la relación correcta: 14/8 = 1.75 vs sqrt (3) = 1.732.
El sistema de coordenadas interno se muestra a continuación, con algunas salidas de muestra.
Sin golf
Más salidas de muestra
Estos se hicieron con una versión anterior del programa. La única diferencia es que el posicionamiento del hexágono en la ventana ahora es ligeramente diferente.
fuente
mothereff.in/byte-counter counts my submission as 196 bytes, but for some reason Shoes counts it as 202.
No sé al 100% si esto es cierto, pero creo que la razón por la que Shoes contó su código como 202 bytes en lugar de 196 es porque sus líneas nuevas son en realidad una secuencia de dos caracteres "\ r \ n". Esto hace que cada nueva línea se cuente dos veces. Aquí hay una respuesta de desbordamiento de pila con respecto a \ r y \ n.Python,
604591574561538531536534528493483452431420419415388385384 bytesHe adaptado la idea de Level River St de verificar si una línea se bloqueará al verificar si ambos puntos finales de la línea ya han sido visitados anteriormente. Esto ahorra 27 bytes. Sugerencias de golf bienvenidas.
Editar: corrección de errores y golf
g(p,q)
para 3 bytes. GolfizadoL
por un byte.No golfista:
Los hexaglifos en sí son bastante pequeños, ya que utilizamos un hexágono de 12 píxeles como base (por razones de golf). Aquí hay algunos ejemplos de hexa-glifos (disculpas por el mal cultivo):
fuente
R=range;G=goto