Este es un desarrollo adicional de la respuesta de @ ais523 , reduciéndolo a solo dos conjuntos de paréntesis, y también usando una colocación de celda más compacta basada en la teoría de la regla de Golomb. ais523 ha creado un compilador para esta construcción , así como esta sesión de TIO que muestra un ejemplo del programa BF resultante que se ejecuta con el seguimiento de depuración de los contadores TWM.
Al igual que el original, esto comienza con un programa en The Waterfall Model , con algunas restricciones que no pierden generalidad:
- Todos los contadores tienen el mismo valor de restablecimiento automático R ; es decir, el mapa de disparo TWM f tiene la propiedad de que f(x,x)=R para todas las x .
- Hay un solo contador de detención h .
- El número c de contadores es (p−1)/2 para algún número primo p .
Gobernante Golomb
Combinamos la construcción Erdős – Turán con la función de permutación de una matriz Welch – Costas para obtener una regla Golomb con las propiedades necesarias.
(Estoy seguro de que esta construcción combinada no puede ser una idea nueva, pero acabamos de encontrar y encajar estas dos piezas de Wikipedia).
Sea r una raíz primitiva de p=2c+1 . Definir la función
g(k)=4ck−((rk−1)mod(2c+1)),k=0,…,2c−1.
- g es una regla Golomb de orden . Es decir, la diferencia es única para cada par de números distintos .2 c g ( i ) - g ( j ) i , j ∈ { 0 , … , 2 c - 1 }2cg(i)−g(j)i,j∈{0,…,2c−1}
- g(k)mod(2c) toma cada valor exactamente una vez.0,…,2c−1
Estructura de la cinta
Para cada contador TWM , asignamos dos posiciones de celda de cinta BF, una celda de reserva y una celda de valor :x∈{0,…,c−1}u ( x ) v ( x ) u(x) v(x)
u(x)=g(k1)<v(x)=g(k2) with u(x)≡v(x)≡x(modc)
Por la segunda propiedad de hay exactamente dos valores distintos de para elegir.gk1,k2
El contenido de una celda de reserva se mantendrá la mayor parte del tiempo en , excepto cuando se haya visitado su contador, cuando esté en , el doble del valor de restablecimiento automático del contador. Una celda de valor se mantendrá al doble del valor del contador TWM correspondiente.02R
Todas las demás celdas a las que puede llegar la ejecución del programa BF (un número finito) se mantendrán en valores impares, de modo que siempre se prueben como distintos de cero. Después de la inicialización, esto es automático porque todos los ajustes de celda son por cantidades pares.
Si lo desea, todas las posiciones de las celdas se pueden desplazar hacia la derecha por una constante para evitar moverse a la izquierda de la posición inicial de la cinta BF.
Estructura del programa BF
Sea la distancia entre el valor del contador de detención y las celdas de reserva, y sea un número lo suficientemente grande como para que para todos los contadores . Entonces la estructura básica del programa BF esH=v(h)−u(h)NcN+1≥v((x+1)modc)−u(x)x
inicialización ajustes[
>
×(H+cN+1) [
<
×c × H]
<
×H ]
Inicialización
La fase de inicialización establece todas las celdas accesibles por el programa a sus valores iniciales, en un estado como si el último contador hubiera sido visitado y la celda activa era su celda de respaldo :u(c−1)
- Las celdas de valor se inicializan al doble del contenido inicial del contador TWM correspondiente, excepto que el contador se decrementa previamente.0
- Las celdas de reserva se establecen en , excepto la celda , que se establece en .0u(c−1)2R
- Todas las otras celdas accesibles por el programa (un número finito) se establecen en .1
Luego, el puntero de la cinta se mueve a la posición (una celda siempre distinta de cero) antes de llegar primero al programa .u(c−1)−H[
Comienzo del bucle externo
Al comienzo de una iteración del bucle externo, el puntero de la cinta estará en o para un contador .u(x)−Hv(x)−Hx
Deje ser el siguiente contador para visitar.y=((x+1)modc)
El movimiento coloca el puntero de la cinta en una posición que es y no a la izquierda de .>
×(H+cN+1)≡y(modc)v(y)
El bucle interno ahora busca hacia la izquierda en los pasos de para una celda cero. Si el contador es cero, se detendrá en la celda de valor (cero) ; de lo contrario, encontrará la celda de reserva .[
<
×c ]
cyv(y)u(y)
Cualquier celda que se encuentre se convierte en la nueva celda activa .
Ajustes
La fase de ajuste ajusta varias celdas en la cinta según su posición con respecto a la celda activa. Esta sección contiene solo +-><
comandos y, por lo tanto, estos ajustes ocurren incondicionalmente. Sin embargo, debido a que todas las celdas relacionadas con el contador están en un patrón de regla de Golomb, cualquier ajuste que no sea apropiado para la celda activa actual perderá todas las celdas importantes y en su lugar ajustará alguna celda irrelevante (mientras la mantiene impar).
Por lo tanto, debe incluirse un código separado en el programa para cada posible par requerido de celda activa y ajustada, excepto para el autoajuste de una celda activa, que, debido a que el ajuste se basa únicamente en la posición relativa, debe compartirse entre todos ellos.
Los ajustes requeridos son:
- Ajuste la celda de retroceso del contador anterior en .u(x)−2R
- Ajuste la celda de reserva del contador actual en , excepto si la celda activa actual es y, por lo tanto, deberíamos detenernos.u(y)2Rv(h)
- Ajuste la celda de valor del siguiente contador en (decrementando el contador).v((y+1)modc)−2
- Cuando la celda activa es una celda de valor (de modo que el contador ha alcanzado cero), ajuste todas las celdas de valor en desde el mapa de disparo TWM. se ajusta por .v(y)yv(z)2f(y,z)v(y)2R
El primer y segundo ajustes anteriormente se hacen necesarias por el hecho de que todas las células activas deben ajustarse a sí mismos por el mismo valor, que es para celdas de valores, y por lo tanto también para las células de retorno. Esto requiere preparar y limpiar las celdas de reserva para garantizar que vuelvan a tanto en el valor como en las ramas de reserva.2R0
Fin del bucle externo
El movimiento representa que al final de la fase de ajuste, el puntero de la cinta se mueve a la izquierda de la celda activa.<
×HH
Para todas las celdas activas que no sean la celda de valor del contador de detención , esta es una celda irrelevante, y por lo tanto impar y distinta de cero, y el bucle externo continúa durante otra iteración.v(h)
Para , el puntero se coloca en su celda de reserva , para lo cual hemos hecho una excepción arriba para mantenerlo en cero, y así el programa sale por el final y se detiene.v(h)u(h)]