Jakie masz ogólne wskazówki na temat gry w golfa w TI-BASIC w kalkulatorach serii TI-83/84 +? Szukam pomysłów, które można by zastosować do problemów związanych z golfem i które są przynajmniej w pewnym stopniu specyficzne dla TI-BASIC (np. „Usuń komentarze” nie jest odpowiedzią).
Proszę zamieścić jedną wskazówkę na odpowiedź.
Odpowiedzi:
Twój kalkulator jest całkiem sprytny w ustalaniu końca linii, dlatego możesz pominąć kilka znaków.
For(
Pętle mają taką składnię -For(variable, start, end, increment)
ale możesz pominąć przyrost i użyje 1:i możesz pominąć końcowe nawiasy (na końcu linii) na całej planszy:
Testowany na moim kalkulatorze TI-84 Silver Edition
Jeśli uważasz, że to więcej niż jeden pomysł (wnioskowanie zakończeń), podzielę je
źródło
not(iPart(B))+(A=5
może być(A=5)+not(iPart(B
.{lists}
,"strings"
a[[matrices]]
). Wyrażenia zostaną automatycznie zamknięte po osiągnięciu nowego wiersza, dwukropka (stand-in dla nowego wiersza; nie dotyczy jednak ciągów, ponieważ mogą zawierać dwukropki) lub strzałki przypisania zmiennej (→
wpisanej za pomocą przycisku STO ▶ ` ). Taka dziwna cecha języka.Posługiwać się
Ans
Jeśli użyjesz tylko wyrażenia w następnym wierszu, nie przechowuj go w zmiennej! Specjalna zmienna Ans jest jednobajtowym tokenem, który przechowuje wartość ostatniego ocenianego wyrażenia. A zatem:
może być
zapisywanie dwóch bajtów.
źródło
Użyj tabeli odnośników zakodowanej w liczbach zmiennoprzecinkowych
Nieco zaawansowana wskazówka:
Małe tabele odnośników są przydatne do gry w golfa: bardzo często potrzebujemy funkcji, która mapuje na przykład 0 do 1, 1 do 2, 2 do 1 i wszystko inne na 0. Jednak tablice TI-BASIC nie są odpowiednie w tym celu: z jednej strony są one oparte na jednej, a dla drugiej wartości nie można wyodrębnić, dopóki tablica nie zostanie zapisana
Ans
lub zmienna listy.W mojej odpowiedzi tutaj przechowuję małą tabelę odnośników w magicznej stałej w bazie 11. Po prostu wypisz wartości, których chcesz użyć,
przekonwertować na przydatną formę
napisz w wybranej bazie (baza 11)
i przekonwertować na bazę 10
Najkrótsza metoda tablicowa ma 8 bajtów dłużej!
TI-BASIC przechowuje tylko liczby zmiennoprzecinkowe do 14 cyfr dziesiętnych, więc możesz przechowywać do 44 bitów, ale tylko 14 cyfr dziesiętnych.
Technikę tę można często ulepszyć jeszcze bardziej, stosując wyszukiwanie z użyciem siły brutalnej w celu znalezienia stałej magicznej zamiast kodowania podstawowego N. Nadal jestem w trakcie gry w golfa na powyższą odpowiedź, ale golfista TI-BASIC Weregoose użył tej metody do wygenerowania różnic między liczbami coprime z 30 (to jest powtarzającą się listą
6, 4, 2, 4, 2, 4, 6, 2
) na wiki / forum TI-BASIC Deweloper z tym fragmentem:Stała magiczna 576 została znaleziona przy użyciu Mathematica, ale jeśli nie masz kopii, użyj skryptu w swoim ulubionym języku.
źródło
Umieść zmienne równania wyrażeń powtarzalnych.
DAWNY:
Może być:
Uwaga: trudno jest znaleźć odpowiednie zastosowanie, ale nie oznacza to, że należy zapomnieć o zmiennych równań: P
Źródło: http://tibasicdev.wikidot.com/selfmodify
-c4ooo z Omnimaga
źródło
n
do pierwszego wyrażenia wraz zRemainder(
funkcją.Pomiń niepotrzebną inicjalizację zmiennych
Obecny konsensus polega na tym, aby cały kod mógł być uruchamiany na nowym tłumaczu. Możemy z tego skorzystać - wszystkie niezainicjowane zmienne rzeczywiste zaczynają się
0
w TI-BASIC iXmin
zaczynają jako potencjalnie użyteczna wartość-10
. Więc jeśli kiedykolwiek potrzebujesz wziąć sumę bieżącą w programie, który nie pobiera danych wejściowych z Ans, lub naprawdę potrzebujesz-10
mniejszego bajtu, ta wskazówka może ci pomóc.źródło
Mniejsze generowanie list
Jeśli potrzebujesz listy
{1,2,...,N}
, gdzie N to, powiedzmy, 42, oczywistym sposobem jej utworzenia jestJednak jeden bajt mniejszy to czysty hack przy użyciu polecenia
binomcdf(
(skumulowany rozkład dwumianowy).Działa to tylko wtedy, gdy N jest stałą, ponieważ oszczędności pochodzą z zastąpienia N-1 wartością w kodzie.
Istnieją dwa przypadki, które pozwalają na jeszcze krótszy kod.
Jeśli masz już listę
L1
wymiarów N:Jeśli nie zależy ci na zamówieniu:
źródło
seq(X,X,1,N
nawet wtedy, gdyN
nie jest stałycumSum(1 or rand(N
.Wyeliminuj instrukcje End dla bloków If na końcu programu
Zapisuje dwa bajty: jeden dla końca i jeden dla podziału linii. Pozwala także na użycie domyślnego Disp w ostatnim wierszu, często oszczędzając dodatkowy bajt.
Może być:
źródło
Poznaj swoje idiomy
Oto kilka fragmentów, których zwykle używam w golfie kodowym:
not(not(Ans
lubAns and 1
. To, którego użyć, zależy od potrzebnych nawiasów.int(e^(Ans
. Oszczędza na otwartym miąższu1+(Ans
. Bardzo przydatne, ponieważ TI-BASIC ma tablice oparte na jednym.{0,1}
do{1,-1}
:cos(πAns
. Oszczędza jeden bajt1-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
(gdzie...
jest szukany ciąg)ΔList(cumSum(Ans
ΔList(cumSum(Ans)-Ans
L1
są unikalne:SortA(L1:min(ΔList(L1
1+sum(not(cumSum(Ans=X
median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans
źródło
tanh(ᴇ9Ans
działa.Jeśli okaże się, że używasz
Następnie możesz użyć (aby zapisać bajt):
Dzieje się tak, ponieważ po usunięciu zmiennej (
G
) staje się ona wartością domyślną, w tym przypadku0
. Następnie możesz wstawić kolejny wiersz poDelVar
instrukcji, bez nowego wiersza . Zachowaj ostrożność, umieszczając kluczowe instrukcje sterujące bezpośrednio poDelVar
instrukcji.(Testowane na TI-84)
źródło
Jakich zmiennych listy użyć?
W przypadku korzystania z list uniknąć listy domyślnych
L₁
poprzezL₆
na rzecz wymienionych list z nazwiskami jedną literę:ᶫA
przezᶫZ
(gdzieᶫ
jest mało L).Jeden z nich kosztuje dwa bajty do odwołania (chociaż
L₁
jest to pojedynczy token, jest to token dwubajtowy), ale podczas przechowywania wartości na liście możesz upuścićᶫ
symbol, zapisując bajt:może być
Kalkulator sprawdza typ danych wyrażenia przy podejmowaniu decyzji, gdzie przechowywany jest wynik.
Podobnie
Input A
lubPrompt A
będzie przechowywaćᶫA
jeśli użytkownik wprowadzi listę zamiast liczby.Bez
ᶫ
nich można używać kilku innych poleceń , choć większość z nich jest rzadko używana w golfie. Na przykładMatr►list(
pozwalaᶫ
usunąć argument w trzecim, czwartym i wyższym argumencie.Ogólna zasada jest taka, że jeśli polecenie przyjmuje nazwę zmiennej listy, a nie wyrażenie listy , i jeśli nie istnieje alternatywna składnia, która mogłaby wstawić tam inną zmienną, wówczas polecenie może działać z
ᶫ
pominięciem.Nie działa to z modyfikacją pojedynczego wpisu na liście:
1→ᶫA(3
nie można go zmienić na1→A(3
.Oczywiście najlepszą zmienną listy do użycia jest zawsze
Ans
.źródło
Input A
” zapamiętuje,ᶫA
czy użytkownik wejdzie na listę. ”Oznacza to, że wiele moich programów można łatwo złamać. To dobrze, że i tak nie mam tak wieluInput
programów, głównie mam małe narzędzia bez sprawdzania błędów lub kompletne gry, które używająGetKey
zamiastInput
.A
i sprawdzić, czy zmieniła się późniejInput A
.Poznaj swoje zmienne koszty przydziału
Jeśli używasz czasów
B
wyrażenia -bajtN
, czy powinieneś przypisać go do zmiennej?Ans
kosztuje1+N
bajty do użycia (jeden dla podziału linii i jeden dla każdego użycia, więc użyj Ans kiedy(B-1)*(N-1)>2
. Może być tylko jedenAns
na linię, więc wypróbuj wszystkie wartości dlaAns
które mogą być przydatne.Zmienne rzeczywiste (np.
X
) Kosztują3+N
bajty, więc używaj ich, kiedy(B-1)*(N-1)>4
.Lista zmiennych kosztuje
3+2N
bajty, więc używaj ich, kiedy(B-2)*(N-1)>5
.Zmienne równania są najmniej przydatne: potrzebują
4+2N
bajtów. Użyj ich, kiedy(B-2)*(N-1)>6
.Kiedy funkcja przekształca się w listę, zapisz ją na liście zamiast zmiennej równania, takiej jak
u
; oszczędza to jeden bajt.Pamiętaj, że obecność lub brak bliskich nawiasów może często powodować, że przechowywanie wyrażeń będzie korzystne, jeśli zostaną one uporządkowane.
Teraz zaprzeczę sobie i powiem, że należy pisać kod w jednym wierszu tak często, jak to możliwe. Czemu? Zwykle, gdy na linii pojawia się długo powtarzające się wyrażenie, można je uprościć.
źródło
int (rand over randInt (
X + int (Yrand jest równy lub mniej bajtów niż randInt (X, Y jako randInt to token 2-bajtowy. Niektóre potencjalne korzyści:
X + można pominąć, gdy dolna granica wynosi 0, co pozwala zaoszczędzić dwa bajty
X + jest konieczne przed randInt (zresztą w niektórych sytuacjach, na przykład losowo z funkcji kroku, takiej jak {2,5,8,11}
X + int (Yrand (N może być użyte tak samo jak randInt (X, Y, N do wygenerowania listy N liczb losowych
Inicjalizacja ekranu graficznego
Aby korzystać z funkcji takich jak Linia (łatwo ze współrzędnymi pikseli, konieczne jest zainicjowanie osi ekranu wykresu na piksele kwadratowe i usunięcie osi:
Zacisk
Gdzie N jest liczbą lub algorytmem, a U i L to górna i dolna granica
Jest na liście
Więcej matematyki listy
Wydajność
Disp i tekst (mogą być połączone w łańcuch, więc Disp A, B wyświetli A, a następnie B w osobnych wierszach i tekst (28,40, A, B wydrukuje A obok B w jednym wierszu
Technologia z optymalnej pętli ruchu
Wiele z tych optymalizacji jest częścią technologii używanej do poruszania postacią po ekranie w jak najmniejszej liczbie bajtów
http://tibasicdev.wikidot.com/movement
Listy rozmiarów żetonów
http://tibasicdev.wikidot.com/tokens
Aby uzyskać pomoc w punktacji
źródło