Dies ist eine Weiterentwicklung der Antwort von @ ais523 , die auf nur zwei Sätze von Klammern reduziert wurde und außerdem eine kompaktere Zellenplatzierung verwendet , die auf der Golomb-Lineal-Theorie basiert. ais523 hat einen Compiler für diese Konstruktion sowie für diese TIO-Sitzung erstellt , der ein Beispiel für ein BF-Programm zeigt, das mit Debug-Tracing der TWM-Zähler ausgeführt wird.
Dies beginnt wie das Original mit einem Programm in The Waterfall Model , mit einigen Einschränkungen, die nicht an Allgemeingültigkeit verlieren:
- Alle Zähler haben den gleichen Rückstellwert R ; Das heißt, die TWM-Trigger-Map f hat die Eigenschaft, dass f(x,x)=R für alle x .
- Es gibt einen einzelnen Haltezähler h .
- Die Anzahl c der Zähler ist (p−1)/2 für eine Primzahl p .
Golomb Herrscher
Wir kombinieren die Erdős-Turán-Konstruktion mit der Permutationsfunktion eines Welch-Costas-Arrays , um ein Golomb-Lineal mit den erforderlichen Eigenschaften zu erhalten.
(Ich bin mir sicher, dass diese kombinierte Konstruktion keine neue Idee sein kann, aber wir haben gerade diese beiden Teile aus Wikipedia gefunden und zusammengefügt.)
Sei r eine Urwurzel von p=2c+1 . Definieren Sie die Funktion
g(k)=4ck−((rk−1)mod(2c+1)),k=0,…,2c−1.
- g ist einGolomb-Linealder Ordnung2c . Das heißt, der Unterschiedg(i)−g(j) ist für jedes Paar unterschiedlicher Zahleni,j∈{0,…,2c−1} eindeutig.
- g(k)mod(2c) nimmt jeden Wert0,…,2c−1 genau einmal an.
Bandstruktur
Für jeden TWM-Zähler x∈{0,…,c−1} weisen wir zwei BF-Bandzellenpositionen zu, eineErsatzzelle u(x) und eineWertzelle v(x) :
u(x)=g(k1)<v(x)=g(k2) with u(x)≡v(x)≡x(modc)
Durch die zweite Eigenschaft von g stehen genau zwei verschiedene k1,k2 -Werte zur Auswahl.
Der Inhalt einer Fallback-Zelle wird die meiste Zeit auf 0 , es sei denn, der Zähler wurde gerade aufgesucht, und bei 2R wird der doppelte Wert für die Selbstzurücksetzung des Zählers erreicht. Eine Wertzelle wird auf dem doppelten Wert des entsprechenden TWM-Zählers gehalten.
Alle anderen Zellen, die von der BF-Programmausführung erreicht werden können (eine endliche Zahl), werden auf ungeraden Werten gehalten, sodass sie immer als ungleich Null getestet werden. Nach der Initialisierung erfolgt dies automatisch, da alle Zelleneinstellungen in geraden Mengen vorgenommen werden.
Falls gewünscht, können alle Zellenpositionen um eine Konstante nach rechts verschoben werden, um zu vermeiden, dass die ursprüngliche Position des BF-Bandes nach links verschoben wird.
BF Programmstruktur
Sei H=v(h)−u(h) der Abstand zwischen dem Wert des Stoppzählers und den Fallback-Zellen, und sei N eine Zahl, die groß genug ist, dass cN+1≥v((x+1)modc)−u(x) für alle Zählerx . Dann ist die grundlegende BF-Programmstruktur
Initialisierung [
>
×(H+cN+1) [
<
×c ]
Anpassungen <
×H ]
Initialisierung
In der Initialisierungsphase werden alle vom Programm erreichbaren Zellen auf ihre Anfangswerte gesetzt, und zwar in einem Zustand, in dem der letzte Zähler gerade besucht wurde und die gerade aktive Zelle die Ersatzzelle u(c−1) :
- Wertzellen werden auf den doppelten Anfangsinhalt des entsprechenden TWM-Zählers initialisiert, mit der Ausnahme, dass der Zähler 0 vorab dekrementiert wird.
- Fallback-Zellen sind auf gesetzt 0 , mit Ausnahme der Zelleu(c−1) , die auf2R .
- Alle anderen vom Programm erreichbaren Zellen (eine endliche Zahl) werden auf 1 .
Dann wird der Bandzeiger auf die Position u(c−1)−H (eine Zelle, die immer nicht Null ist) bewegt, bevor wir das erste Programm erreichen [
.
Beginn der äußeren Schleife
Zu Beginn einer Iteration der äußeren Schleife befindet sich der Bandzeiger entweder auf u(x)−H oder v(x)−H für einen Zähler x .
Lassen y=((x+1)modc) der nächste zu besuchende Zähler.
Die Bewegung >
×(H+cN+1) legtdas Band Zeiger auf eine Positiondie ist≡y(modc) und nicht links vonv(y) .
Die innere Schleife [
<
×c ]
sucht nun in Schritten von c nach links nach einer Nullzelle. Wenn der Zähler y Null ist, stoppt er bei der (Null-) Wertzelle v(y) . Andernfalls wird die Fallback-Zelleu(y) .
Welche Zelle gefunden wird, wird zur neuen aktiven Zelle.
Anpassungen
In der Anpassungsphase werden verschiedene Zellen auf dem Band basierend auf ihrer Position relativ zur aktiven Zelle angepasst. Dieser Abschnitt enthält nur +-><
Befehle, daher erfolgen diese Anpassungen bedingungslos. Da sich jedoch alle mit Zählern verbundenen Zellen in einem Golomb-Linealmuster befinden, werden bei Anpassungen, die für die derzeit aktive Zelle nicht geeignet sind, alle wichtigen Zellen übersehen und stattdessen einige irrelevante Zellen angepasst (wobei sie ungerade bleiben).
Daher muss für jedes möglicherweise erforderliche Paar von aktiven und angepassten Zellen ein separater Code in das Programm aufgenommen werden, mit Ausnahme der Selbsteinstellung einer aktiven Zelle, die, da die Einstellung ausschließlich auf der relativen Position basiert, von allen geteilt werden muss.
Die erforderlichen Anpassungen sind:
- Passen Sie die Fallback-Zelle u des vorherigen Zählers an ( xu(x)um−2R .
- Passen Sie die Fallback-Zelle u(y) des aktuellen Zählers um 2R . denn, die derzeit aktive Zelle ist v(h) und wir sollten anhalten.
- Passen Sie den Wert der Zelle v ( ( y + 1 ) mod c des nächsten Zählers anv((y+1)modc) von−2 (Dekrementieren des Zählers).
- Wenn die aktive Zelle eine Wertezelle v(y) (der Zähler y hat also Null erreicht), passen Sie alle Wertezellen v(z) über die TWM-Triggerzuordnung um 2f(y,z) an. v(y) selbst wird um 2R angepasst .
Die obigen ersten und zweiten Anpassungen werden dadurch erforderlich, dass sich alle aktiven Zellen um denselben Wert anpassen müssen , d. H2Rfür Wertzellen und damit auch für Fallback-Zellen 2 R beträgt. Dazu müssen die Fallback-Zellen vorbereitet und bereinigt werden, um sicherzustellen, dass siesowohl im Wert- als auch im Fallback-Zweigauf0 zurückkehren.
Ende der äußeren Schleife
Die Bewegung <
×H stellt dar, dass am Ende der Anpassungsphase der Bandzeiger umH Stellen links von der aktiven Zellebewegtwird.
Für alle aktiven Zellen andere als die Anhaltewertzelle des Zählersv(h) ,ist dies ein irrelevantes Zelle, und so ungerade und ungleich Null, und die äußere Schleifefortgesetzt fürweitere Iteration.
Für v(h) wird der Zeiger stattdessen auf die entsprechende Fallback-Zelle gesetzt. u(h) , für die wir oben eine Ausnahme gemacht haben, um sie auf Null zu halten, und daher wird das Programm durch das Ende ]
und die Unterbrechungen beendet.