Golftipps für TI-BASIC

26

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.

Lirtosiast
quelle
6
Bitte geben Sie immer die Version an, auf die Sie sich beziehen!
Fehler

Antworten:

22

Ihr Taschenrechner ist ziemlich geschickt darin, das Zeilenende für Sie abzuleiten, und Sie können daher eine ganze Reihe von Zeichen weglassen.

:Disp "HELLO WORLD    //is the same as...
:Disp "HELLO WORLD"

For(Schleifen haben eine Syntax wie diese - For(variable, start, end, increment), aber Sie können das Inkrement weglassen und es wird 1 verwendet:

:For(A,1,5     //is the same as...
:For(A,1,5,1)

und Sie können endende Klammern (am Ende von Zeilen) auf der ganzen Linie weglassen:

:Output(1,1,A
:int(A
:round(A
etc.

Getestet mit meinem TI-84 Silver Edition-Rechner

Wenn Sie denken, dass dies mehr als eine Idee ist (Schlussfolgern), dann teile ich sie auf

Stretch Maniac
quelle
5
.... das ist einfach falsch 😭
Beta Decay
2
Versuchen Sie außerdem, Code neu zu schreiben, damit Sie die geringste Anzahl schließender Klammern verwenden. Nur für den letzten Ausdruck jeder Zeile erhalten Sie die Klammern kostenlos. Verschieben Sie also die am meisten verschachtelten Anweisungen ans Ende. Das heißt, not(iPart(B))+(A=5kann sein (A=5)+not(iPart(B.
Lirtosiast
4
Dies gilt für alles, was nicht nur die Klammer (nämlich muss schließen {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.
MI Wright
14

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:

Xsin(A)->R
Disp R+tanh(R

kann sein

Xsin(A)
Disp Ans+tanh(Ans

zwei Bytes sparen.

Lirtosiast
quelle
9

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 Ansoder 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.

{0,-1,5,-1,-1,2,9,-1,8,6}

in eine nützliche Form umwandeln

{1,0,6,0,0,3,10,0,9,7}

schreibe in deine gewünschte Basis (Basis 11)

.106003A097

und zu Basis 10 konvertieren

-1+int(11fPart(11^Ans.0954191904

Der kürzeste Array-Ansatz ist 8 Byte länger!

{1,0,6,0,0,3,10,0,9,7}-1:Ans(X+1

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, 2im Wiki / Forum TI-BASIC mit 30 ( dh einer wiederholten Liste von ) zu ermitteln Entwickler mit diesem Snippet:

2+2iPart(3fPart(576e^(fPart(I/8

Die magische Konstante 576 wurde mit Mathematica gefunden. Wenn Sie jedoch keine Kopie besitzen, verwenden Sie ein Skript in Ihrer Lieblingssprache.

Lirtosiast
quelle
5

Setzen Sie Gleichungsvariablen mit wiederholten Ausdrücken.

EX:

Remainder(randInt(1,9),1
Remainder(randInt(1,9),5
Remainder(randInt(1,9),10

Kann sein:

"randInt(1,9→u
Remainder(u,1
Remainder(u,5
Remainder(u,10

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

user1812
quelle
In diesem Beispiel könnten Sie mehr sparen, indem Sie nzusammen mit der Remainder(Funktion den ersten Ausdruck hinzufügen .
Conor O'Brien
5

Ü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 0TI-BASIC und Xminbeginnen 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 -10Byte weniger benötigen , kann Ihnen dieser Tipp helfen.

Lirtosiast
quelle
Xmax ist 10 und Ymin und Ymax verhalten sich ähnlich, richtig? Ich denke, es gibt auch einige andere Diagrammparameter, die andere Werte haben.
Fabian Röling
5

Kleinere Listengenerierung

Wenn Sie eine Liste benötigen {1,2,...,N}, in der N beispielsweise 42 ist, ist der naheliegende Weg, sie zu erstellen

seq(X,X,1,42. 

Ein Byte kleiner ist jedoch ein ordentlicher Hack mit dem binomcdf(Befehl (kumulative Binomialverteilung).

cumSum(binomcdf(41,0

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 L1der Dimension N haben:

cumSum(1 or L1

Wenn Ihnen die Bestellung egal ist:

randIntNoRep(1,N     ;random permutation of numbers from 1 to N
Lirtosiast
quelle
2
Garantiert ein Byte kleiner (und dummerweise langsamer) als seq(X,X,1,Nselbst wenn Nes nicht konstant ist cumSum(1 or rand(N.
Mischa Lawrow
4

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.

[code]
If A>5
Then
Output(1,1,Ans²+Ans+A
Disp 3ln(A
End
//end of program

Kann sein:

[code]
If A>5
Then
Output(1,1,Ans²+Ans+A
3ln(A
//end of program
Lirtosiast
quelle
Es sollte beachtet werden, dass dieser Tipp nicht für Schleifenblöcke funktioniert. +1 für den guten Tipp
Tau
4

Kenne deine Redewendungen

Hier sind einige Ausschnitte, die ich im Codegolf häufig verwende:

  • In Wahrheitswert (0/1) umrechnen: not(not(Ansoder Ans and 1. Welche zu verwenden ist, hängt von den benötigten Klammern ab.
  • Fügen Sie ein zu einem Wahrheitswert: int(e^(Ans. Speichert ein Open-Paren vorbei 1+(Ans. Sehr nützlich, da TI-BASIC einbasige Arrays hat.
  • Karte {0,1}zu {1,-1}: cos(πAns. Spart ein Byte mehr 1-2Ans.

  • Vorzeichenfunktion einer Zahl: tanh(ᴇ9Ans
  • Runde gegen positive Unendlichkeit: -int(-Ans
  • Anzahl der Stellen in einer positiven Ganzzahl: 1+int(log(Ans
  • Komplexe Nummer zur Liste {Re,Im}:imag(Ans{i,1

  • String in Liste konvertieren: seq(inString("...",sub(Ans,X,1)),X,1,length(Ans(Wo ...ist der Suchbegriff?)
  • Hacken Sie das erste Element einer Liste ab: ΔList(cumSum(Ans
  • Hacken Sie das letzte Element einer Liste ab: ΔList(cumSum(Ans)-Ans
  • Überprüfen Sie, ob alle Elemente der Liste L1eindeutig sind:SortA(L1:min(ΔList(L1
  • Suche nach der Nummer X in einer Liste (gibt das erste Vorkommen zurück): 1+sum(not(cumSum(Ans=X
  • Modus einer Liste, wenn ein einzelner Modus vorhanden ist und die Liste höchstens 10 Elemente enthält: (hässlich, aber kurz): median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans
Lirtosiast
quelle
Ich verstehe wirklich nicht, warum das tanh(ᴇ9Ansfunktioniert.
SuperJedi224
1
@ SuperJedi224 Nun, tanh (0 ist Null und die Grenzen für Unendlich links und rechts sind -1 und 1. Es nähert sich exponentiell diesen Werten, also liegt es nach + -17 oder so innerhalb eines Rundungsfehlers von + -1. Wenn die absoluten Werte bereits größer als 17 sind, verwenden wir nur tanh (alone.
lirtosiast 06.10.15
3

Wenn Sie sich mit finden

0→G ;or any other variable
;other lines of code

Dann könnten Sie (um ein Byte zu speichern) verwenden:

DelVar G;other lines of code

Dies liegt daran, dass beim Löschen einer Variablen ( G) dieser Standardwert verwendet wird 0. Anschließend können Sie nach der DelVarAnweisung eine weitere Zeile einfügen , ohne eine neue Zeile . Seien Sie vorsichtig, wenn Sie wichtige Steueranweisungen direkt nach einer DelVarAnweisung einfügen.

(Getestet auf TI-84)

Conor O'Brien
quelle
Dies ist selten nützlich; Variablen werden standardmäßig mit 0 initialisiert, und Sie können Y mit ZStandard auf Null setzen.
Lirtosiast
@ThomasKwa Es hat mir in vielen Fällen geholfen, vor allem. Wenn während der Ausführung ein Reset erforderlich ist.
Conor O'Brien
2
Im Code Golf? Wann? Wenn Sie mir das Programm zeigen, denke ich, kann ich den DelVar optimieren.
Lirtosiast
@ThomasKwa Kein XODE-Golf per se , sondern Programmieren auf wenig Speicherplatz (TI-83). Ich habe das Programm momentan nicht. Ich werde darauf zurückkommen.
Conor O'Brien
1
Nach ein paar Minuten kann ich mir ein paar Szenarien überlegen, in denen DelVar möglicherweise am kürzesten sein kann, wie nach einzeiligen If-Anweisungen.
Lirtosiast
3

Welche Listenvariablen sollen verwendet werden?

Vermeiden Sie bei der Verwendung von Listen die Standardlisten L₁bis L₆zu benannten Listen mit Ein-Buchstaben-Namen: ᶫAbis ᶫ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:

{1,2,3,4,5→ᶫA

kann sein

{1,2,3,4,5→A

Der Taschenrechner überprüft den Datentyp des Ausdrucks, wenn er entscheidet, wo das Ergebnis gespeichert wird.

Ähnlich Input Aoder Prompt Awird gespeichert, ᶫAwenn 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 Beispiel Matr►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(3Kann nicht in geändert werden 1→A(3.

Natürlich ist die beste zu verwendende Listenvariable immer Ans.

Mischa Lawrow
quelle
Warte was? " Input A" wird gespeichert, ᶫAwenn der Benutzer eine Liste eingibt. "Das bedeutet, dass viele meiner Programme ziemlich einfach zu brechen sind. Dann ist es gut, dass ich Inputsowieso nicht so viele Programme habe, meistens habe ich entweder kleine Tools ohne Fehlerprüfung oder komplette Spiele, die GetKeyanstelle von verwenden Input.
Fabian Röling
1
Wenn Sie wirklich daran interessiert sind, Ihre Programme gegen dieses zu Aprüfen , können Sie immer einen zufälligen Wert in speichern und überprüfen, ob er sich danach geändert hat Input A.
Mischa Lawrow
2

Kennen Sie Ihre variablen Zuweisungskosten

Wenn Sie B-byte-Ausdruckszeiten Nverwenden, sollten Sie sie einer Variablen zuweisen?

AnsDie Verwendung kostet 1+NByte (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 Byte Anspro Zeile geben. Probieren Sie also alle Werte aus Ans, die für diesen Zweck hilfreich sind.

Echte Variablen (zB X) kosten 3+NBytes, also benutze sie wann (B-1)*(N-1)>4.

Listen Sie Variablen auf, die 3+2NBytes kosten , verwenden Sie sie also, wenn (B-2)*(N-1)>5.

Gleichungsvariablen sind am wenigsten nützlich: Sie benötigen 4+2NBytes. Benutze sie wenn (B-2)*(N-1)>6.

Min. bytes in an expression to save
 N \ var. | Ans | Real | List | Eqn
------------------------------------
 2           4     5      8      9
 3           3     4      5      6
 4           2     3      4      5

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.

Lirtosiast
quelle
1

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:

AxesOff
84→Xmin
72→Ymax
ZInteger

Klemme

min(U,max(L,N

Wobei N die Zahl oder der Algorithmus ist und U und L obere und untere Schranken sind

Ist N in der Liste

max(N={X,Y,Z

Mehr Liste math

L1*L2→L3

instead of

for(A,1,dim(L1
L1(A)*L2(A→L3(A
End

This also works for things like this:
not(L1
L1 and L2

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

TiKevin83
quelle