Este é um desenvolvimento adicional da resposta do @ ais523 , reduzindo-o para apenas dois conjuntos de colchetes e também usando uma colocação de célula mais compacta, baseada na teoria das réguas de Golomb. o ais523 criou um compilador para essa construção , bem como esta sessão TIO mostrando um exemplo de programa BF resultante em execução com rastreamento de depuração dos contadores TWM.
Como o original, isso começa com um programa em The Waterfall Model , com algumas restrições que não perdem generalidade:
- Todos os contadores têm o mesmo valor de redefinição automática R ; isto é, o mapa de gatilho TWMf tem a propriedade quef(x,x)=R para todos osx .
- Há um único contador de parada h .
- O número c dos contadores é (p−1)/2 para algum número primo p .
Régua de Golomb
Combinamos a construção Erdős – Turán com a função de permutação de um conjunto Welch – Costas para obter uma régua de Golomb com as propriedades necessárias.
(Tenho certeza de que essa construção combinada não pode ser uma idéia nova, mas acabamos de encontrar e encaixar essas duas peças da Wikipedia.)
Deixei r uma raiz primitiva dep=2c+1 . Defina a função
g(k)=4ck−((rk−1)mod(2c+1)),k=0,…,2c−1.
- g é umaréguadeGolombda ordem2c . Ou seja, a diferençag(i)−g(j) é única para cada par de números distintosi,j∈{0,…,2c−1} .
- g(k)mod(2c) assume todos os valores0,…,2c−1 exatamente uma vez.
Estrutura de fita
Para cada contador TWM x∈{0,…,c−1} , atribuímos duas posições de célula de fita BF, uma célula de fallback u(x) e umacélula de valor v(x) :
u(x)=g(k1)<v(x)=g(k2) with u(x)≡v(x)≡x(modc)
Pela segunda propriedade de g existem exatamente dois valores distintos de k1,k2 para você escolher.
O conteúdo de uma célula de fallback na maioria das vezes é mantido em 0 , exceto quando seu contador acaba de ser visitado, quando fica em 2R , duas vezes o valor de redefinição automática do contador. Uma célula de valor será mantida com o dobro do valor do contador TWM correspondente.
Todas as outras células que podem ser alcançadas pela execução do programa BF (um número finito) serão mantidas em valores ímpares, para que sempre testem como diferente de zero. Após a inicialização, isso é automático, porque todos os ajustes das células são iguais.
Se desejado, todas as posições da célula podem ser deslocadas para a direita por uma constante, a fim de evitar mover para a esquerda da posição inicial da fita BF.
Estrutura do programa BF
Seja H=v(h)−u(h) a distância entre o valor do contador de parada e as células de fallback, e seja N um número grande o suficiente para que cN+1≥v((x+1)modc)−u(x) para todos os contadores x . Então a estrutura básica do programa BF é
inicialização [
>
×(H+cN+1) [
<
×c ]
ajustes de <
×H ]
Inicialização
A fase de inicialização define todas as células alcançáveis pelo programa com seus valores iniciais, em um estado como se o último contador tivesse acabado de ser visitado e a célula apenas ativa fosse sua célula de fallback u(c−1) :
- As células de valor são inicializadas com o dobro do conteúdo inicial do contador TWM correspondente, exceto que o contador 0 é pré-decrementado.
- As células de fallback são definidas como 0 , exceto a célula u(c−1) , que é definida como 2R .
- Todas as outras células alcançáveis pelo programa (um número finito) são definidas como 1 .
Em seguida, o ponteiro da fita é movido para a posição u(c−1)−H (uma célula sempre diferente de zero) antes de chegarmos à primeira[
.
Início do loop externo
No início de uma iteração do loop externo, o ponteiro da fita estará em u(x)−H ou v(x)−H para um contador x .
Seja y=((x+1)modc) o próximo contador a visitar.
O movimento >
×(H+cN+1) coloca o ponteiro fita numa posição que é ≡y(modc) e não à esquerda dev(y) .
O loop interno [
<
×c ]
agora pesquisa para a esquerda nas etapas de c uma célula zero. Se o contador y for zero, ele irá parar na célula de valor (zero) v(y) ; caso contrário, encontrará a célula de fallback u(y) .
Qualquer célula encontrada se torna a nova célula ativa .
Ajustes
A fase de ajuste ajusta várias células da fita com base em sua posição em relação à célula ativa. Esta seção contém apenas+-><
comandos e, portanto, esses ajustes ocorrem incondicionalmente. No entanto, como todas as células relacionadas ao contador estão em um padrão de régua de Golomb, qualquer ajuste que não seja apropriado para a célula ativa atual perderá todas as células importantes e ajustará alguma célula irrelevante (mantendo-a ímpar).
Assim, um código separado deve ser incluído no programa para cada possível par necessário de célula ativa e ajustada, exceto o auto-ajuste de uma célula ativa, que, porque o ajuste é baseado apenas na posição relativa, deve ser compartilhada entre todos eles.
Os ajustes necessários são:
- Ajuste a célula de fallback do contador anterior u(x) em −2R .
- Ajuste a célula de fallback do contador atual u(y) em 2R , exceto se a célula ativa atual for v(h) e, portanto, devemos parar.
- Ajuste a célula de valor do contador seguinte v((y+1)modc) por −2 (diminuindo o contador).
- Quando a célula ativa for uma célula de valor v(y) (para que o contador y tenha atingido zero), ajuste todas as células de valor v(z) por 2f(y,z) no mapa de acionamento do TWM. v(y) é ajustado em 2R .
O primeiro e o segundo ajustes acima são necessários porque todas as células ativas devem se ajustar pelo mesmo valor, que é 2R para células de valor e, portanto, também para células de fallback. Isso requer a preparação e a limpeza das células de fallback para garantir que elas voltem a 0 nas ramificações de valor e de fallback.
Fim do loop externo
O movimento <
×H representa que, no final da fase de ajuste, o ponteiro da fita é movido H para a esquerda da célula ativa.
Para todas as células activas outras que não as células valor do contador suspensão v(h) , esta é uma célula irrelevante, e por isso estranho e diferente de zero, e a espira externa continua para outra iteração.
Para v(h) , o ponteiro é colocado em sua célula de fallback correspondente u(h) , para a qual fizemos uma exceção acima para mantê-la zero e, portanto, o programa sai pela final ]
e pára.