Wskazówki do gry w golfa w TI-BASIC

26

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

lirtosiast
źródło
6
Zawsze dołączaj do której wersji się odwołujesz!
flawr

Odpowiedzi:

22

Twój kalkulator jest całkiem sprytny w ustalaniu końca linii, dlatego możesz pominąć kilka znaków.

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

For(Pętle mają taką składnię - For(variable, start, end, increment)ale możesz pominąć przyrost i użyje 1:

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

i możesz pominąć końcowe nawiasy (na końcu linii) na całej planszy:

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

Testowany na moim kalkulatorze TI-84 Silver Edition

Jeśli uważasz, że to więcej niż jeden pomysł (wnioskowanie zakończeń), podzielę je

Stretch Maniac
źródło
5
.... to po prostu źle 😭
Beta Decay
2
Spróbuj także przepisać kod, aby użyć najmniejszej liczby nawiasów zamykających. Tylko na ostatnim wyrażeniu każdego wiersza otrzymujesz nawiasy za darmo, więc przenieś najbardziej zagnieżdżone instrukcje na koniec. To znaczy not(iPart(B))+(A=5może być (A=5)+not(iPart(B.
lirtosiast
4
Odnosi się do wszystkiego, co wymaga zamknięcia, a nie tylko nawiasy (mianowicie {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.
MI Wright,
14

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:

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

może być

Xsin(A)
Disp Ans+tanh(Ans

zapisywanie dwóch bajtów.

lirtosiast
źródło
9

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 Anslub 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ć,

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

przekonwertować na przydatną formę

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

napisz w wybranej bazie (baza 11)

.106003A097

i przekonwertować na bazę 10

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

Najkrótsza metoda tablicowa ma 8 bajtów dłużej!

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

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:

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

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.

lirtosiast
źródło
5

Umieść zmienne równania wyrażeń powtarzalnych.

DAWNY:

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

Może być:

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

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

użytkownik1812
źródło
W tym przykładzie można zapisać więcej, dodając ndo pierwszego wyrażenia wraz z Remainder(funkcją.
Conor O'Brien
5

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ę 0w TI-BASIC i Xminzaczynają 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 -10mniejszego bajtu, ta wskazówka może ci pomóc.

lirtosiast
źródło
Xmax wynosi 10, a Ymin i Ymax zachowują się podobnie, prawda? Są też inne parametry wykresu, które mają inne wartości, tak myślę.
Fabian Röling,
5

Mniejsze generowanie list

Jeśli potrzebujesz listy {1,2,...,N}, gdzie N to, powiedzmy, 42, oczywistym sposobem jej utworzenia jest

seq(X,X,1,42. 

Jednak jeden bajt mniejszy to czysty hack przy użyciu polecenia binomcdf((skumulowany rozkład dwumianowy).

cumSum(binomcdf(41,0

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ę L1wymiarów N:

cumSum(1 or L1

Jeśli nie zależy ci na zamówieniu:

randIntNoRep(1,N     ;random permutation of numbers from 1 to N
lirtosiast
źródło
2
Gwarantujemy, że jest o jeden bajt mniejszy (i głupio wolniejszy) niż seq(X,X,1,Nnawet wtedy, gdy Nnie jest stały cumSum(1 or rand(N.
Misha Lavrov
4

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.

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

Może być:

[code]
If A>5
Then
Output(1,1,Ans²+Ans+A
3ln(A
//end of program
lirtosiast
źródło
Należy zauważyć, że ta wskazówka nie działa w przypadku bloków pętli. +1 za dobrą wskazówkę
Tau
4

Poznaj swoje idiomy

Oto kilka fragmentów, których zwykle używam w golfie kodowym:

  • Konwertuj na wartość prawdy (0/1): not(not(Anslub Ans and 1. To, którego użyć, zależy od potrzebnych nawiasów.
  • Dodasz do prawdy wartości: int(e^(Ans. Oszczędza na otwartym miąższu 1+(Ans. Bardzo przydatne, ponieważ TI-BASIC ma tablice oparte na jednym.
  • Map {0,1}do {1,-1}: cos(πAns. Oszczędza jeden bajt 1-2Ans.

  • Funkcja znaku liczby: tanh(ᴇ9Ans
  • Zaokrąglanie w kierunku dodatniej nieskończoności: -int(-Ans
  • Liczba cyfr w dodatniej liczbie całkowitej: 1+int(log(Ans
  • Liczba zespolona do wyświetlenia {Re,Im}:imag(Ans{i,1

  • Konwertuj ciąg na listę: seq(inString("...",sub(Ans,X,1)),X,1,length(Ans(gdzie ...jest szukany ciąg)
  • Odetnij pierwszy element listy: ΔList(cumSum(Ans
  • Odetnij ostatni element listy: ΔList(cumSum(Ans)-Ans
  • Sprawdź, czy wszystkie elementy listy L1są unikalne:SortA(L1:min(ΔList(L1
  • Wyszukaj liczbę X na liście (zwraca pierwsze wystąpienie): 1+sum(not(cumSum(Ans=X
  • Tryb listy, gdy istnieje jeden tryb, a lista zawiera co najwyżej 10 elementów: (brzydkie, ale krótkie): median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans
lirtosiast
źródło
Naprawdę nie rozumiem, dlaczego to tanh(ᴇ9Ansdziała.
SuperJedi224,
1
@ SuperJedi224 Cóż, tanh (0 to zero, a granice nieskończoności po lewej i prawej stronie wynoszą -1 i 1. Zbliża się wykładniczo do tych wartości, więc po przekroczeniu +17 lub mniej więcej mieści się w błędzie zaokrąglenia + -1. Jeśli wartości bezwzględne są już większe niż 17ish, po prostu używamy tanh (sam.
lirtosiast
3

Jeśli okaże się, że używasz

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

Następnie możesz użyć (aby zapisać bajt):

DelVar G;other lines of code

Dzieje się tak, ponieważ po usunięciu zmiennej ( G) staje się ona wartością domyślną, w tym przypadku 0. Następnie możesz wstawić kolejny wiersz po DelVarinstrukcji, bez nowego wiersza . Zachowaj ostrożność, umieszczając kluczowe instrukcje sterujące bezpośrednio po DelVarinstrukcji.

(Testowane na TI-84)

Conor O'Brien
źródło
Jest to rzadko przydatne; zmienne są domyślnie inicjowane na 0 i można wyzerować Y, wykonując ZStandard.
lirtosiast
@ThomasKwa Przydało mi się to w wielu przypadkach, szczególnie. gdy wymagany jest reset w trakcie wykonywania.
Conor O'Brien,
2
W golfowym kodzie? Kiedy? Jeśli pokażesz mi program, myślę, że będę w stanie zoptymalizować DelVar.
lirtosiast,
@ThomasKwa Nie xode golf per se , a raczej programowanie na niskim przestrzeni dyskowej (TI-83). Nie mam teraz programu. Wrócę do ciebie w tej sprawie.
Conor O'Brien
1
Po kilku minutach namysłu mogę wymyślić kilka scenariuszy, w których DelVar może być najkrótszy, na przykład po wyrażeniach jednowierszowych If.
lirtosiast
3

Jakich zmiennych listy użyć?

W przypadku korzystania z list uniknąć listy domyślnych L₁poprzez L₆na rzecz wymienionych list z nazwiskami jedną literę: ᶫAprzez ᶫ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:

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

może być

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

Kalkulator sprawdza typ danych wyrażenia przy podejmowaniu decyzji, gdzie przechowywany jest wynik.

Podobnie Input Alub Prompt Abę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ład Matr►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(3nie można go zmienić na1→A(3 .

Oczywiście najlepszą zmienną listy do użycia jest zawsze Ans.

Misza Ławrow
źródło
Czekaj, co? „ Input A” zapamiętuje, ᶫAczy 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 wielu Inputprogramów, głównie mam małe narzędzia bez sprawdzania błędów lub kompletne gry, które używają GetKeyzamiast Input.
Fabian Röling,
1
Jeśli naprawdę zależy Ci na zabezpieczeniu programów przed tym, zawsze możesz zapisać losową wartość Ai sprawdzić, czy zmieniła się później Input A.
Misza Ławrow
2

Poznaj swoje zmienne koszty przydziału

Jeśli używasz czasów Bwyrażenia -bajt N, czy powinieneś przypisać go do zmiennej?

Anskosztuje 1+Nbajty 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 jeden Ansna linię, więc wypróbuj wszystkie wartości dlaAns które mogą być przydatne.

Zmienne rzeczywiste (np. X) Kosztują 3+Nbajty, więc używaj ich, kiedy(B-1)*(N-1)>4 .

Lista zmiennych kosztuje 3+2Nbajty, więc używaj ich, kiedy(B-2)*(N-1)>5 .

Zmienne równania są najmniej przydatne: potrzebują 4+2Nbajtów. Użyj ich, kiedy (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

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

lirtosiast
źródło
1

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:

AxesOff
84→Xmin
72→Ymax
ZInteger

Zacisk

min(U,max(L,N

Gdzie N jest liczbą lub algorytmem, a U i L to górna i dolna granica

Jest na liście

max(N={X,Y,Z

Więcej matematyki listy

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

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

TiKevin83
źródło