Welche allgemeinen Tipps zum Golfen in TI-BASIC für die Taschenrechner der Serie TI-83/84 + gibt es? Ich bin auf der Suche nach Ideen, die sich auf Code-Golf-Probleme anwenden lassen und die zumindest etwas spezifisch für TI-BASIC sind (z. B. "Kommentare entfernen" ist keine Antwort).
Bitte posten Sie einen Tipp pro Antwort.
Antworten:
Ihr Taschenrechner ist ziemlich geschickt darin, das Zeilenende für Sie abzuleiten, und Sie können daher eine ganze Reihe von Zeichen weglassen.
For(
Schleifen haben eine Syntax wie diese -For(variable, start, end, increment)
, aber Sie können das Inkrement weglassen und es wird 1 verwendet:und Sie können endende Klammern (am Ende von Zeilen) auf der ganzen Linie weglassen:
Getestet mit meinem TI-84 Silver Edition-Rechner
Wenn Sie denken, dass dies mehr als eine Idee ist (Schlussfolgern), dann teile ich sie auf
quelle
not(iPart(B))+(A=5
kann sein(A=5)+not(iPart(B
.{lists}
,"strings"
und[[matrices]]
). Ausdrücke werden automatisch geschlossen, wenn Sie eine neue Zeile, einen Doppelpunkt (ein Ersatz für die neue Zeile; gilt jedoch nicht für Zeichenfolgen, da sie Doppelpunkte enthalten können) oder den Variablenzuweisungspfeil (→
eingegeben mit der Taste STO ▶ `) erreichen ). So ein komisches Merkmal der Sprache.Verwenden
Ans
Wenn Sie nur einen Ausdruck in der nächsten Zeile verwenden, speichern Sie ihn nicht in einer Variablen! Die spezielle Ans-Variable ist ein Ein-Byte-Token, das den Wert des zuletzt ausgewerteten Ausdrucks speichert. Somit:
kann sein
zwei Bytes sparen.
quelle
Verwenden Sie eine in Gleitkommazahlen codierte Nachschlagetabelle
Ein etwas fortgeschrittener Tipp:
Kleine Nachschlagetabellen sind nützlich für Code-Golf: Sehr oft benötigen wir eine Funktion, die beispielsweise 0 zu 1, 1 zu 2, 2 zu 1 und alles andere auf 0 abbildet. TI-BASIC-Arrays sind jedoch nicht geeignet Zu diesem Zweck: Zum einen sind sie einseitig und zum anderen kann ein Wert erst extrahiert werden, wenn das Array in
Ans
oder eine Listenvariable gespeichert ist.In meiner Antwort hier speichere ich eine kleine Nachschlagetabelle in einer magischen Konstante in Basis 11. Listen Sie einfach die Werte auf, die Sie verwenden möchten.
in eine nützliche Form umwandeln
schreibe in deine gewünschte Basis (Basis 11)
und zu Basis 10 konvertieren
Der kürzeste Array-Ansatz ist 8 Byte länger!
TI-BASIC speichert nur Gleitkommazahlen mit 14 Dezimalstellen, sodass Sie bis zu 44ish-Bits, aber nur 14 Dezimalstellen speichern können.
Diese Technik kann häufig weiter verbessert werden, indem eine Brute-Force-Suche verwendet wird, um eine magische Konstante anstelle einer Base-N-Codierung zu finden. Ich bin immer noch dabei, die obige Antwort zu finden, aber der milde TI-BASIC-Golfer Weregoose hat diese Methode verwendet , um die Unterschiede zwischen den Zahlen
6, 4, 2, 4, 2, 4, 6, 2
im Wiki / Forum TI-BASIC mit 30 ( dh einer wiederholten Liste von ) zu ermitteln Entwickler mit diesem Snippet:Die magische Konstante 576 wurde mit Mathematica gefunden. Wenn Sie jedoch keine Kopie besitzen, verwenden Sie ein Skript in Ihrer Lieblingssprache.
quelle
Setzen Sie Gleichungsvariablen mit wiederholten Ausdrücken.
EX:
Kann sein:
Hinweis: Es ist schwer, eine gute Verwendung dafür zu finden, aber das heißt nicht, dass Sie Gleichungsvariablen vergessen sollten: P
Quelle: http://tibasicdev.wikidot.com/selfmodify
-c4ooo von Omnimaga
quelle
n
zusammen mit derRemainder(
Funktion den ersten Ausdruck hinzufügen .Überflüssige Variableninitialisierung überspringen
Derzeit besteht Einigkeit darüber, dass der gesamte Code auf einem neuen Interpreter ausgeführt werden kann. Dies können wir nutzen - alle nicht initialisierten reellen Variablen beginnen bei
0
TI-BASIC undXmin
beginnen als möglicherweise nützlicher Wert-10
. Wenn Sie also jemals eine laufende Summe in einem Programm benötigen, das keine Eingaben von Ans entgegennimmt, oder wirklich ein-10
Byte weniger benötigen , kann Ihnen dieser Tipp helfen.quelle
Kleinere Listengenerierung
Wenn Sie eine Liste benötigen
{1,2,...,N}
, in der N beispielsweise 42 ist, ist der naheliegende Weg, sie zu erstellenEin Byte kleiner ist jedoch ein ordentlicher Hack mit dem
binomcdf(
Befehl (kumulative Binomialverteilung).Dies funktioniert nur, wenn N eine Konstante ist, da die Einsparungen durch das Ersetzen von N-1 durch den Wert im Code erzielt werden.
Es gibt zwei Fälle, in denen noch kürzerer Code zulässig ist.
Wenn Sie bereits eine Liste
L1
der Dimension N haben:Wenn Ihnen die Bestellung egal ist:
quelle
seq(X,X,1,N
selbst wennN
es nicht konstant istcumSum(1 or rand(N
.Beseitigen Sie End-Anweisungen für If-Blöcke am Ende eines Programms
Speichert zwei Bytes: eins für das Ende und eins für den Zeilenumbruch. Außerdem können Sie den implizierten Disp in der letzten Zeile verwenden, wodurch häufig ein zusätzliches Byte gespeichert wird.
Kann sein:
quelle
Kenne deine Redewendungen
Hier sind einige Ausschnitte, die ich im Codegolf häufig verwende:
not(not(Ans
oderAns and 1
. Welche zu verwenden ist, hängt von den benötigten Klammern ab.int(e^(Ans
. Speichert ein Open-Paren vorbei1+(Ans
. Sehr nützlich, da TI-BASIC einbasige Arrays hat.{0,1}
zu{1,-1}
:cos(πAns
. Spart ein Byte mehr1-2Ans
.tanh(ᴇ9Ans
-int(-Ans
1+int(log(Ans
{Re,Im}
:imag(Ans{i,1
seq(inString("...",sub(Ans,X,1)),X,1,length(Ans
(Wo...
ist der Suchbegriff?)ΔList(cumSum(Ans
ΔList(cumSum(Ans)-Ans
L1
eindeutig sind:SortA(L1:min(ΔList(L1
1+sum(not(cumSum(Ans=X
median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans
quelle
tanh(ᴇ9Ans
funktioniert.Wenn Sie sich mit finden
Dann könnten Sie (um ein Byte zu speichern) verwenden:
Dies liegt daran, dass beim Löschen einer Variablen (
G
) dieser Standardwert verwendet wird0
. Anschließend können Sie nach derDelVar
Anweisung eine weitere Zeile einfügen , ohne eine neue Zeile . Seien Sie vorsichtig, wenn Sie wichtige Steueranweisungen direkt nach einerDelVar
Anweisung einfügen.(Getestet auf TI-84)
quelle
Welche Listenvariablen sollen verwendet werden?
Vermeiden Sie bei der Verwendung von Listen die Standardlisten
L₁
bisL₆
zu benannten Listen mit Ein-Buchstaben-Namen:ᶫA
bisᶫZ
(woᶫ
ist das kleine L).Die Referenzierung kostet zwei Bytes (obwohl
L₁
es sich um ein einzelnes Token handelt, handelt es sich um ein Zwei-Byte-Token). Wenn Sie jedoch Werte in einer Liste speichern, können Sie dasᶫ
Symbol löschen und ein Byte speichern:kann sein
Der Taschenrechner überprüft den Datentyp des Ausdrucks, wenn er entscheidet, wo das Ergebnis gespeichert wird.
Ähnlich
Input A
oderPrompt A
wird gespeichert,ᶫA
wenn der Benutzer eine Liste anstelle einer Nummer eingibt.Einige andere Befehle können ohne die verwendet werden
ᶫ
, obwohl die meisten davon beim Golfen selten verwendet werden. Zum BeispielMatr►list(
kann dieᶫ
in der dritten entfernt werden, vierten und höheren Argumente.Die allgemeine Regel lautet: Wenn der Befehl einen Listenvariablennamen und keinen Listenausdruck verwendet und keine alternative Syntax vorhanden ist, mit der eine andere Art von Variable angegeben werden könnte, funktioniert der Befehl möglicherweise mit der
ᶫ
Option "left off".Dies funktioniert nicht beim Ändern eines einzelnen Listeneintrags:
1→ᶫA(3
Kann nicht in geändert werden1→A(3
.Natürlich ist die beste zu verwendende Listenvariable immer
Ans
.quelle
Input A
" wird gespeichert,ᶫA
wenn der Benutzer eine Liste eingibt. "Das bedeutet, dass viele meiner Programme ziemlich einfach zu brechen sind. Dann ist es gut, dass ichInput
sowieso nicht so viele Programme habe, meistens habe ich entweder kleine Tools ohne Fehlerprüfung oder komplette Spiele, dieGetKey
anstelle von verwendenInput
.A
prüfen , können Sie immer einen zufälligen Wert in speichern und überprüfen, ob er sich danach geändert hatInput A
.Kennen Sie Ihre variablen Zuweisungskosten
Wenn Sie
B
-byte-AusdruckszeitenN
verwenden, sollten Sie sie einer Variablen zuweisen?Ans
Die Verwendung kostet1+N
Byte (eines für den Zeilenumbruch und eines für jedes Mal, wenn es verwendet wird. Verwenden Sie Ans, wenn(B-1)*(N-1)>2
. Es kann nur ein ByteAns
pro Zeile geben. Probieren Sie also alle Werte ausAns
, die für diesen Zweck hilfreich sind.Echte Variablen (zB
X
) kosten3+N
Bytes, also benutze sie wann(B-1)*(N-1)>4
.Listen Sie Variablen auf, die
3+2N
Bytes kosten , verwenden Sie sie also, wenn(B-2)*(N-1)>5
.Gleichungsvariablen sind am wenigsten nützlich: Sie benötigen
4+2N
Bytes. Benutze sie wenn(B-2)*(N-1)>6
.Wenn eine Funktion zu einer Liste ausgewertet wird, speichern Sie sie in einer Liste und nicht in einer Gleichungsvariablen wie z
u
. Das spart ein Byte.Denken Sie daran, dass das Vorhandensein oder Fehlen von engen Klammern oft dazu führen kann, dass das Speichern von Ausdrücken vorteilhaft ist, wenn sie neu angeordnet werden.
Jetzt widerspreche ich mir selbst und sage, man sollte so viel wie möglich Code in eine Zeile schreiben. Warum? In der Regel kann ein lange wiederholter Ausdruck in einer Zeile vereinfacht werden.
quelle
int (rand über randInt (
X + int (Yrand ist gleich oder kleiner als randInt (X, Y als randInt ist ein 2-Byte-Token. Einige mögliche Vorteile:
X + kann weggelassen werden, wenn die untere Grenze 0 ist, wodurch zwei Bytes gespart werden
X + ist vor randInt erforderlich (in bestimmten Situationen, zum Beispiel zufällig aus einer Schrittfunktion wie {2,5,8,11})
X + int (Yrand (N kann genauso wie randInt (X, Y, N verwendet werden, um eine Liste von N Zufallszahlen zu generieren
Initialisierung des Grafikbildschirms
Um Funktionen wie Linie zu verwenden (einfach mit Pixelkoordinaten ist es notwendig, die Achsen des Grafikbildschirms auf quadratische Pixel zu initialisieren und Achsen zu entfernen:
Klemme
Wobei N die Zahl oder der Algorithmus ist und U und L obere und untere Schranken sind
Ist N in der Liste
Mehr Liste math
Ausgabe
Disp und Text (können beide verkettet werden, so dass Disp A, B A, dann B in separaten Zeilen und Text (28,40, A, B wird A neben B in einer Zeile gedruckt
Tech aus der optimalen Bewegungsschleife
Viele dieser Optimierungen sind Teil der Technologie, mit der Zeichen in den wenigsten Bytes auf dem Bildschirm verschoben werden
http://tibasicdev.wikidot.com/movement
Token-Größenlisten
http://tibasicdev.wikidot.com/tokens
Für Hilfe beim Scoring
quelle