Jest to dalszy rozwój odpowiedzi @ ais523 , zmniejszając ją do tylko dwóch zestawów nawiasów, a także stosując bardziej zwarte umieszczanie komórek oparte na teorii linijki Golomba. ais523 stworzył kompilator dla tej konstrukcji , a także dla tej sesji TIO pokazującej przykładowy wynikowy program BF działający ze śledzeniem debugowania liczników TWM.
Podobnie jak oryginał, zaczyna się od programu w The Waterfall Model , z pewnymi ograniczeniami, które nie tracą ogólności:
- Wszystkie liczniki mają tę samą wartość samoresetującą R ; to znaczy mapa wyzwalacza TWM f ma właściwość, że f(x,x)=R dla wszystkich x .
- Jest jeden licznik zatrzymania h .
- Liczba c liczników wynosi (p−1)/2 dla niektórych liczb pierwszych p .
Władca Golombów
Łączymy konstrukcję Erdős – Turán z funkcją permutacji tablicy Welch – Costas , aby uzyskać linijkę Golomb o niezbędnych właściwościach.
(Jestem pewien, że ta połączona konstrukcja nie może być nowym pomysłem, ale właśnie znaleźliśmy i dopasowaliśmy te dwa elementy z Wikipedii.)
Niech r będzie pierwotnym pierwiastkiem z p=2c+1 . Zdefiniuj funkcję
g(k)=4ck−((rk−1)mod(2c+1)),k=0,…,2c−1.
- g jestlinijką Golombarzędu2c . Oznacza to, że różnicag(i)−g(j) jest unikalna dla każdej pary odrębnych liczbi,j∈{0,…,2c−1} .
- g(k)mod(2c) przyjmuje każdą wartość0,…,2c−1 dokładnie raz.
Struktura taśmy
Dla każdego licznika TWM x∈{0,…,c−1} przypisujemy dwie pozycje komórki taśmy BF, komórkę rezerwową u(x) i komórkę wartości v(x) :
u(x)=g(k1)<v(x)=g(k2) with u(x)≡v(x)≡x(modc)
Drugą właściwością g są dokładnie dwie różne wartości k1,k2 do wyboru.
Zawartość komórki rezerwowej będzie przez większość czasu utrzymywana na poziomie 0 , z wyjątkiem sytuacji, gdy jej licznik został właśnie odwiedzony, gdy będzie miał wartość 2 R. , czyli dwukrotnie wartość samoresetu licznika. Komórka wartości będzie utrzymywana na poziomie dwukrotności wartości odpowiedniego licznika TWM.
Wszystkie pozostałe komórki, do których może dojść podczas wykonywania programu BF (liczba skończona), będą miały nieparzyste wartości, dzięki czemu zawsze będą testowane jako niezerowe. Po inicjalizacji jest to automatyczne, ponieważ wszystkie korekty komórek są dokonywane w równych ilościach.
W razie potrzeby wszystkie pozycje komórek można przesunąć w prawo o stałą, aby uniknąć przesunięcia się na lewo od początkowej pozycji taśmy BF.
Struktura programu BF
Niech H.= v ( h ) - u ( h ) będzie odległością między wartością licznika zatrzymania a komórkami zastępczymi, i niech N. będzie liczbą wystarczająco dużą, aby c N.+ 1 ≥ v ( ( x + 1 ) mod c ) - u ( x ) dla wszystkich liczników x . Zatem podstawowa struktura programu BF to
inicjalizacja [
>
× ( H+ c N.+1) [
<
×c ]
korekty <
×H ]
Inicjalizacja
Faza inicjalizacji ustawia wszystkie komórki osiągalne przez program do ich wartości początkowych, w stanie, jakby ostatni licznik został właśnie odwiedzony, a właśnie aktywna komórka była komórką zastępczą u(c−1) :
- Komórki wartości są inicjowane do dwukrotności początkowej zawartości odpowiedniego licznika TWM, z tym wyjątkiem, że licznik 0 jest wstępnie zmniejszany.
- Komórki awaryjnej wartość 0 , z wyjątkiem komórek u(c−1) , który jest ustawiony na 2R .
- Wszystkie pozostałe komórki osiągalne przez program (liczba skończona) są ustawione na 1 .
Następnie wskaźnik taśmy przesuwa się do pozycji u(c−1)−H (zawsze niezerowa komórka), zanim dotrzemy do pierwszego programu [
.
Początek zewnętrznej pętli
Na początku iteracji zewnętrznej pętli wskaźnik taśmy będzie miał wartość u(x)−H lub v(x)−H dla licznika x .
Niech y=((x+1)modc) będzie następnym licznikiem do odwiedzenia.
Ruch >
×(H+cN+1) umieszcza wskaźnik taśmy na pozycji ≡y(modc) a nie po lewej stroniev(y) .
Wewnętrzna pętla [
<
×c ]
szuka teraz w lewo w krokach c dla komórki zerowej. Jeśli licznik y wynosi zero, to zatrzyma się na komórce wartości (zero) v(y) ; w przeciwnym razie znajdzie komórkę rezerwową u(y) .
Każda znaleziona komórka staje się nową aktywną komórką.
Korekty
Regulacji fazy reguluje różne komórki na taśmie w oparciu o ich położenia w stosunku do komórki aktywnej. Ta sekcja zawiera tylko +-><
polecenia, więc te korekty odbywają się bezwarunkowo. Ponieważ jednak wszystkie powiązane z sobą komórki są wzorami linijki Golomba, wszelkie korekty, które nie są właściwe dla bieżącej aktywnej komórki, pominą wszystkie ważne komórki i dostosują niektóre nieistotne komórki (zachowując to nieparzyste).
Oddzielny kod musi zatem zostać zawarty w programie dla każdej możliwej wymaganej pary aktywnej i skorygowanej komórki, z wyjątkiem samoregulacji aktywnej komórki, która ponieważ dostosowanie opiera się wyłącznie na pozycji względnej, musi być dzielona między nimi wszystkimi.
Wymagane korekty to:
- Dostosować poprzedni stan licznika komórek zastępczej u(x) przez −2R .
- Dostosuj komórkę cofania u(y) licznika prądu o 2R , z wyjątkiem sytuacji, gdy bieżącą komórką aktywną jest v(h) i dlatego powinniśmy się zatrzymać.
- Dostosuj komórkę wartości następnego licznika v((y+1)modc) o −2 (zmniejszając licznik).
- Gdy aktywna komórka jest komórką wartości v(y) (więc licznik y osiągnął zero), dostosuj wszystkie komórki wartości v(z) o 2f(y,z) z mapy wyzwalacza TWM. v(y) sam zostaje skorygowane przez 2R .
Pierwsza i druga korekta powyżej są konieczne ze względu na fakt, że wszystkie aktywne komórki muszą dostosować się o tę samą wartość, która wynosi 2R dla komórek wartości, a zatem także dla komórek rezerwowych. Wymaga to przygotowania i wyczyszczenia komórek rezerwowych, aby upewnić się, że wrócą do 0 zarówno w gałęzi wartości, jak i rezerwowych.
Koniec zewnętrznej pętli
Ruch <
×H oznacza, że pod koniec fazy dostosowywania wskaźnik taśmy przesuwa się H na lewo od aktywnej komórki.
Dla wszystkich aktywnych komórek innych niż komórka wartości licznika zatrzymania v ( h) jest to komórka nieistotna, a więc nieparzysta i niezerowa, a zewnętrzna pętla kontynuuje kolejną iterację.
W przypadku v ( h ) wskaźnik jest zamiast tego umieszczany na odpowiadającej mu komórce rezerwowej u ( h ) , dla której zrobiliśmy wyjątek powyżej, aby utrzymać go na zero, a więc program wychodzi przez finał ]
i zatrzymuje się.