Ein paar Tipps hier:
Konstanten:
Auf der Konstantenseite von Esolangs finden Sie eine äußerst nützliche Liste der kürzesten Möglichkeiten, um bestimmte Werte zu erstellen. Ich sehe mich mindestens zweimal pro Programm auf dieser Seite.
Der Anfang von allem:
+++[[<+>>++<-]>]
Dadurch wird das Band im Format 3 * n ^ 2 erstellt, wie es aussieht
3 6 12 24 48 96 192 128 0 0 '
Warum ist das so wichtig?
Gehen wir die Liste durch:
- 3 und 6 sind langweilig
- 12: Fast 10 (Zeilenvorschub) oder 13 (Wagenrücklauf). Kann auch für den Zähler für 0-9 verwendet werden
- 24: Fast 26, die Anzahl der Buchstaben im Alphabet
- 48: ASCII für
0
- 96: Nahe an 97, ASCII für
a
- 196 und 128: 196-128 = 64, nahe 65, der ASCII für
A
.
Von diesem einen Algorithmus sind wir am Anfang praktisch jeder Sequenz im ASCII-Bereich, zusammen mit einem Zähler für jede und einer leicht erreichbaren Newline.
Ein praktisches Beispiel:
Drucken aller Groß- und Kleinbuchstaben und Ziffern.
Mit Algorithmus:
+++[[<+>>++<-]>]<<[-<->]<<<<++[->>+.>+.<<<]<--[>>.+<<-]
Ohne:
+++++++++++++[->+++++++>++>+++++>++++>+<<<<<]>+++++>[-<+.>>.+<]>>---->---[-<.+>]
Wir verbringen die meisten Bytes damit, nur das Band im zweiten Beispiel zu initialisieren . Ein Teil davon wird durch die zusätzlichen Bewegungen im ersten Beispiel ausgeglichen, aber diese Methode hat eindeutig den Vorteil.
Ein paar andere interessante Algorithmen in der gleichen Richtung:
3 * 2 ^ n + 1:
+++[[<+>>++<-]+>]
Tape: 4 7 13 25 49 65 197 129 1 0'
Dies versetzt die Werte um 1, was einige Dinge bewirkt. Es macht die 12 zu einem Wagenrücklauf, die 64 zum eigentlichen Beginn des Großbuchstabens und die 24 näher an der 26.
2 ^ n:
+[[<+>>++<-]>]
Tape: 1 2 4 8 16 32 64 128
Da 64 für Großbuchstaben geeignet ist, ist 32 der ASCII-Wert für Leerzeichen und 128 kann als Zähler für 26 verwendet werden (130/5 = 26). In bestimmten Situationen, in denen Ziffern und Kleinbuchstaben nicht benötigt werden, können so Bytes gespart werden.
Wählen Sie die Implementierung, die zu der Frage passt:
- Negative Zellen sind fast immer nützlich, und es gibt keinen Grund, sie zu vermeiden (es sei denn, dies ändert nichts an Ihrem Bytecount).
- Fast dasselbe gilt für das Umschließen von Zellen, zumal viele Konstanten das Umschließen verwenden.
- Beliebige Zellgrößen sind nützlich für unendliche mathematische Sequenzen, z. B. die Berechnung der Fibonacci-Sequenz unendlich (
+[[-<+>>+>+<<]>]
) oder die Verarbeitung größerer / negativer Zahlen. Der Nachteil ist, dass einige der gebräuchlichsten Methoden, wie z. B. [-]
und [->+<]
nicht, angewendet werden können, nur für den Fall, dass die Zahl negativ ist.
- EOF als 0, -1 oder keine Änderung. In der Regel ist 0 vorzuziehen, da Sie eine ganze Eingabe ohne zusätzliche Prüfungen durchlaufen können. -1 ist nützlich, wenn Sie eine Schleife über Array-Strukturen ausführen. Ich habe noch keine Verwendung für keine Änderung gefunden :(.
Behalte den Überblick, was mit dem Frick los ist:
Zu jeder Zeit sollten Sie Kommentare dazu haben, wo sich der Zeiger in Bezug auf die umliegenden Daten befinden soll, und sicherstellen, dass Sie den Bereich der möglichen Werte jeder Zelle kennen. Dies ist besonders wichtig, wenn Sie den Zeiger vor einer Schleife geteilt haben, da Sie die beiden Möglichkeiten anschließend wieder zusammenfügen möchten.
Zu jedem Zeitpunkt ist mein Code mit Kommentaren in jeder anderen Zeile übersät, die so aussehen:
*0 *dat a_1 ? 0' !0 0*
or
*0 *dat 0' ap1 0 !0 0*
Ein zusätzlicher Rat ist, den Symbolen besondere Bedeutungen zuzuweisen. In dem obigen Beispiel bedeutet '
der Zeiger *
Wiederholung in dieser Richtung, ?
bedeutet eine Zelle mit unbekanntem Wert, !0
bedeutet eine Zelle ungleich Null, _
ist ein Ersatz für -
und p
ist ein Ersatz für +
. or
impliziert, dass das Band wie eine der Darstellungen aussehen kann und als solche behandelt werden muss.
Ihr Symbolschema muss nicht unbedingt dasselbe sein wie meins (mit einigen Fehlern), es muss nur konsistent sein. Dies ist auch beim Debuggen äußerst nützlich, da Sie es bis zu diesem Punkt ausführen und das tatsächliche Band mit dem vergleichen können, was Sie haben sollten , was auf potenzielle Fehler in Ihrem Code hinweisen kann.