Gusanos de Golf Paterson


11

Los gusanos de Paterson son una especie de autómata celular que existe en una cuadrícula triangular infinita y, a cada paso, giran en alguna dirección y mueven una unidad. Sus propiedades definitorias son que nunca pueden pasar por el mismo lugar dos veces, y cada vez que se encuentran con el mismo entorno, toman la misma decisión. Un gusano siempre "ve" desde su propia perspectiva con su cola ubicada en 3 y su cabeza ubicada en el centro de este hexágono:

Imagen de wikipedia

Por ejemplo, considere el gusano con las reglas:

  1. Si 0, 1, 2, 4 y 5 están en blanco, muévase en la dirección 2
  2. Si 0, 1, 4 y 5 están en blanco, y 2 está lleno, muévase en la dirección 0
  3. Si 0, 1 y 5 están en blanco, y 2 y 4 están llenos, muévase en la dirección 0

Esto da como resultado la siguiente ruta (de Wikipedia):

Camino de gusano

Si el gusano se encuentra en una situación en la que se llenan todos los alrededores, termina.

Entrada

Una lista de números. El enésimo número indica qué decisión debe tomar el gusano en la enésima situación nueva que encuentra donde tiene que tomar una decisión. Tenga en cuenta que si todos menos uno de sus alrededores están llenos, debe moverse en la única dirección que está vacía. Esto no cuenta como una "decisión" y no consume un número. Para generar el gusano de ejemplo que se muestra arriba, la entrada sería [2, 0, 0]. La entrada está garantizada para producir un gusano que termina y no vuelve sobre su camino, y la entrada nunca será demasiado corta.

Salida

Emite una lista de coordenadas que indica dónde está la cabeza del gusano, comenzando en (1, 0). Consideraremos que moverse hacia arriba y hacia la derecha es una disminución solo en el valor y, pero moverse hacia arriba y hacia la izquierda es una disminución en el valor xy una disminución en el valor y. Por ejemplo, la salida de la ruta para la entrada de ejemplo es

(1, 0), (1, 1), (0, 0), (-1, -1), (0, -1), (0, 0), (0, 1), (-1, 0), (0, 0)

Casos de prueba

También puede usar el fragmento de JavaScript para ejecutar pruebas.

[2,0,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(0,1),(-1,0),(0,0)
[1,0,4,0,1,5]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,1),(4,2),(4,3),(3,3),(2,2),(1,1),(1,0),(2,0),(3,1),(3,0),(4,0),(5,1),(5,2),(4,2),(3,2),(2,1),(1,1),(0,0),(-1,0),(-2,-1),(-2,-2),(-1,-2),(0,-1),(1,0),(1,-1),(2,-1),(3,0),(4,1),(4,2),(5,3),(5,4),(4,4),(3,3),(3,4),(2,4),(1,3),(1,2),(1,1),(0,1),(-1,0),(-1,1),(-2,1),(-3,0),(-3,-1),(-2,-1),(-1,-1),(0,0)
[1,0,5,1]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,2),(3,3),(2,3),(1,2),(0,2),(-1,1),(-1,0),(0,0),(1,1),(1,2),(1,3),(0,3),(-1,2),(-1,1),(-2,0),(-2,-1),(-1,-1),(0,0)
[2,0,1,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(-1,0),(-1,-1),(-1,-2),(0,-1),(1,0),(2,1),(1,1),(0,1),(0,0)

El siguiente programa rápidamente ensamblado (posiblemente con errores) mostrará los gusanos:


2
Caso de prueba sugerido : p (Esto es [1,0,4,2,0,1,5])
Arnauld

¿Podemos tomar la entrada en orden inverso?
Arnauld

1
@Arnauld seguro que parece estar bien
soktinpk

Respuestas:


4

JavaScript (ES6),  261 250  249 bytes

[x,y]

a=>(G=[[[x=1]]],v=[0,1,1,0,-1,-1],F=y=>[[x,y],...v.every((_,i)=>k^=g(o+i)[q%3]<<i,k=63,g=o=>(r=G[Y=y-o%2*v[q=(o+3)%6]]=G[Y]||[])[X=x-o%2*v[-~q%6]]=r[X]||[])?F(y+v[g(o+=F[k]|=1/F[k]?0:k&~-k?a.pop():31-Math.clz32(k))[q%3]=1,o%6],x+=v[-~o%6]):[]])(o=0)

Pruébalo en línea!

Esto es esencialmente un puerto del fragmento de demostración.


4

K (ngn / k) , 115 bytes

D,:-D:2\6 3;f:{d::0;m::2/=6;X::(!6),x;{m::?m,p:2/^(+':x)?(2*h:*|x)+/:D 6!d+!6;$[(~p)|^c:X m?p;x;x,,h+D 6!d+:c]}/,1 0}

(sin contar la parte de denominación de funciones f:)

Pruébalo en línea!

D,:-D:2\6 3 genera las seis direcciones cardinales (1 0;1 1;0 1;-1 0;-1 -1;0 -1)

d::0 es la dirección actual, utilizada como índice mod 6 en D

m::2/=6genera la memoria inicial del gusano 32 16 8 4 2 1. Los bits de cada número codifican el entorno (0 = segmento visitado; 1 = no visitado). inicialmente mcontiene solo entornos no ambiguos, aquellos en los que hay una única salida disponible.

X::(!6),xson las reglas del gusano. que anteponer 0 1 2 3 4 5para que coincida con el entorno sin ambigüedades en intial m.

{... }/,1 0aplique hasta la convergencia la función que { }comienza con una lista de 1 elemento que contiene 1 0. La lista contendrá pares de coordenadas visitadas por el gusano.

D 6!d+!6las seis direcciones cardinales que comienzan dy van en sentido horario

h:*|x último argumento, es decir, la posición de la cabeza del gusano

(2*h:*|x)+/:D 6!d+!6multiplique las coordenadas de la cabeza por 2 y agregue las direcciones cardinales. Esta es nuestra forma de representar los segmentos entre puntos.

+':x agregue pares de puntos adyacentes visitados, esto nos da las representaciones de segmentos entre ellos

^(... )?... descubra cuáles de los segmentos circundantes de la cabeza aún no han sido visitados

p:2/ codificar binario y asignar a p

m::?m,panexados para my mantener la diferencia, es decir, anexados pa msólo si pno se produce enm

$[... ;... ;... ]si-entonces-más

c:X m?pencuentre el índice de pin my úselo como índice en X. resultados de indexación fuera de límites en 0N("nulo")

$[(~p)|^c:X m?p;x;... ]si pes 0 (sin ruta de salida) o ces 0N, entonces devuelve xlo que forzará la convergencia y detendrá el bucle

x,,h+D 6!d+:cde lo contrario, agregue la nueva cabeza xy repita

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.