Kiat untuk bermain golf di TI-BASIC

26

Apa tips umum yang Anda miliki untuk bermain golf di TI-BASIC untuk kalkulator TI-83/84 + series? Saya mencari ide yang dapat diterapkan untuk masalah kode-golf dan yang juga setidaknya agak spesifik untuk TI-BASIC (mis. "Hapus komentar" bukan jawaban).

Silakan kirim satu tip per jawaban.

lirtosiast
sumber
6
Harap selalu sertakan versi yang Anda maksud!
flawr

Jawaban:

22

Kalkulator Anda cukup pintar dalam menyimpulkan akhir garis untuk Anda, dan dengan demikian Anda dapat menghilangkan beberapa karakter.

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

For(loop memiliki sintaksis seperti ini - For(variable, start, end, increment), tetapi Anda dapat menghilangkan selisihnya dan itu akan menggunakan 1:

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

dan Anda dapat menghilangkan tanda kurung berakhir (di ujung baris) di seluruh papan:

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

Diuji pada kalkulator TI-84 Silver Edition saya

Jika Anda pikir ini lebih dari satu ide (menyimpulkan akhir) maka saya akan membaginya

Regangkan Maniac
sumber
5
.... ini salah 😭
Beta Decay
2
Juga, cobalah menulis ulang kode sehingga Anda menggunakan kurung tutup paling sedikit. Hanya pada ekspresi terakhir dari setiap baris, Anda mendapatkan tanda kurung gratis, jadi pindahkan pernyataan yang paling bersarang sampai akhir. Artinya, not(iPart(B))+(A=5bisa jadi (A=5)+not(iPart(B.
lirtosiast
4
Ini berlaku untuk semua yang perlu ditutup, bukan hanya tanda kurung (yaitu {lists}, "strings"dan [[matrices]]). Ekspresi akan ditutup secara otomatis ketika Anda mencapai baris baru, titik dua (titik-berdiri untuk baris baru; meskipun, tidak berlaku untuk string, karena dapat berisi titik dua) atau panah penetapan variabel ( , diketik dengan tombol STO ▶ ` ). Fitur bahasa yang aneh.
MI Wright
14

Menggunakan Ans

Jika Anda hanya akan menggunakan ekspresi di baris berikutnya, jangan menyimpannya ke variabel! Variabel Ans khusus adalah token satu byte yang menyimpan nilai ekspresi terakhir yang dievaluasi. Demikian:

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

dapat

Xsin(A)
Disp Ans+tanh(Ans

menghemat dua byte.

lirtosiast
sumber
9

Gunakan tabel pencarian yang dikodekan dalam angka floating-point

Kiat yang agak canggih:

Tabel pencarian kecil berguna untuk kode golf: sangat sering bahwa kita memerlukan fungsi yang memetakan, misalnya 0 hingga 1, 1 hingga 2, 2 hingga 1, dan segala sesuatu yang lain ke 0. Namun, array TI-BASIC tidak cocok untuk tujuan ini: untuk satu hal, mereka berbasis satu, dan untuk yang lain, nilai tidak dapat diekstraksi sampai array disimpan dalam Ansatau variabel daftar.

Dalam jawaban saya di sini , saya menyimpan tabel pencarian kecil di konstanta ajaib di basis 11. Cukup daftarkan nilai yang ingin Anda gunakan,

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

konversikan ke bentuk yang bermanfaat

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

tulis di pangkalan yang Anda inginkan (pangkalan 11)

.106003A097

dan konversikan ke basis 10

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

Pendekatan array terpendek adalah 8 byte lebih lama!

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

TI-BASIC hanya menyimpan float hingga 14 digit desimal, sehingga Anda dapat menyimpan hingga 44ish bits tetapi hanya 14 digit desimal.

Teknik ini sering dapat ditingkatkan lebih lanjut dengan menggunakan pencarian brute-force untuk menemukan konstanta ajaib daripada pengkodean basis-N. Saya masih dalam proses golf jawaban di atas, tetapi pegolf TI-BASIC Weregoose menggunakan metode ini untuk menghasilkan perbedaan antara angka coprime dengan 30 (yaitu, daftar berulang 6, 4, 2, 4, 2, 4, 6, 2) pada wiki / forum TI-BASIC Pengembang dengan cuplikan ini:

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

Konstanta ajaib 576 ditemukan menggunakan Mathematica, tetapi jika Anda tidak memiliki salinannya, gunakan skrip dalam bahasa favorit Anda.

lirtosiast
sumber
5

Masukkan variabel persamaan ekspresi berulang.

EX:

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

Dapat:

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

Catatan: sulit untuk menemukan penggunaan yang baik untuk ini, tetapi itu tidak berarti Anda harus melupakan variabel persamaan: P

Sumber: http://tibasicdev.wikidot.com/selfmodify

-c4ooo dari Omnimaga

pengguna1812
sumber
Dalam contoh ini, Anda bisa menyimpan lebih banyak dengan menambahkan nekspresi pertama, bersama dengan Remainder(fungsinya.
Conor O'Brien
5

Lewati inisialisasi variabel yang tidak perlu

Konsensus saat ini adalah untuk memungkinkan semua kode dijalankan pada penerjemah baru. Kita dapat mengambil keuntungan dari ini — semua variabel nyata yang tidak diinisialisasi mulai dari 0dalam TI-BASIC, dan Xmindimulai sebagai nilai yang mungkin berguna -10. Jadi, jika Anda perlu mengambil total yang berjalan dalam program yang tidak mengambil input dari Ans, atau Anda benar-benar membutuhkan -10dalam satu byte lebih sedikit, tip ini dapat membantu Anda.

lirtosiast
sumber
Xmax adalah 10 dan Ymin dan Ymax berperilaku sama, kan? Juga ada beberapa parameter grafik lain yang memiliki beberapa nilai lain, saya pikir.
Fabian Röling
5

Pembuatan daftar yang lebih kecil

Jika Anda memerlukan daftar {1,2,...,N}, di mana N adalah, katakanlah, 42, cara yang jelas untuk membuatnya adalah

seq(X,X,1,42. 

Namun, satu byte lebih kecil dari itu adalah retas yang rapi menggunakan perintah binomcdf((distribusi binomial kumulatif).

cumSum(binomcdf(41,0

Ini hanya berfungsi ketika N adalah konstanta, karena penghematan berasal dari penggantian N-1 dengan nilainya dalam kode.

Ada dua kasus yang memungkinkan kode lebih pendek.

Jika Anda sudah memiliki daftar L1dimensi N:

cumSum(1 or L1

Jika Anda tidak peduli tentang pesanan:

randIntNoRep(1,N     ;random permutation of numbers from 1 to N
lirtosiast
sumber
2
Dijamin satu byte lebih kecil (dan lebih lambat lebih bodoh) daripada seq(X,X,1,Nsaat Ntidak konstan cumSum(1 or rand(N.
Misha Lavrov
4

Hilangkan pernyataan Akhir untuk Jika blok di akhir program

Menghemat dua byte: satu untuk Akhir dan satu untuk linebreak. Ini juga memungkinkan Anda untuk menggunakan Disp tersirat pada baris terakhir, sering menyimpan byte tambahan.

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

Dapat:

[code]
If A>5
Then
Output(1,1,Ans²+Ans+A
3ln(A
//end of program
lirtosiast
sumber
Perlu dicatat bahwa tip ini tidak berfungsi untuk blok loop. +1 untuk tip yang baik
Tau
4

Kenali idiom Anda

Berikut beberapa cuplikan yang biasa saya gunakan dalam kode golf:

  • Konversikan ke nilai kebenaran (0/1):, not(not(Ansatau Ans and 1. Yang mana yang akan digunakan tergantung pada tanda kurung yang dibutuhkan.
  • Tambahkan satu untuk kebenaran-nilai: int(e^(Ans. Menghemat paren terbuka 1+(Ans. Sangat berguna, karena TI-BASIC memiliki array berbasis satu.
  • Peta {0,1}ke {1,-1}: cos(πAns. Menghemat satu byte lebih 1-2Ans.

  • Fungsi tanda nomor: tanh(ᴇ9Ans
  • Putaran menuju infinity positif: -int(-Ans
  • Jumlah digit dalam bilangan bulat positif: 1+int(log(Ans
  • Nomor kompleks untuk dicantumkan {Re,Im}:imag(Ans{i,1

  • Konversi string ke daftar: seq(inString("...",sub(Ans,X,1)),X,1,length(Ans(di mana ...string pencarian)
  • Potong elemen pertama dari daftar: ΔList(cumSum(Ans
  • Potong elemen terakhir dari daftar: ΔList(cumSum(Ans)-Ans
  • Periksa apakah semua elemen daftar L1unik:SortA(L1:min(ΔList(L1
  • Cari nomor X dalam daftar (mengembalikan kejadian pertama): 1+sum(not(cumSum(Ans=X
  • Mode daftar ketika ada mode tunggal, dan daftar memiliki paling banyak 10 elemen: (jelek, tapi pendek): median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans
lirtosiast
sumber
Saya benar-benar tidak mengerti mengapa yang ini tanh(ᴇ9Ansbekerja.
SuperJedi224
1
@ SuperJedi224 Nah, tanh (0 adalah nol, dan batas hingga tak terbatas di kiri dan kanan adalah -1 dan 1. Semakin dekat secara eksponensial dengan nilai-nilai itu, maka melewati + -17 atau lebih dalam kesalahan pembulatan dari + -1. Jika nilai absolut sudah lebih besar dari 17ish, kami hanya menggunakan tanh (sendirian.
lirtosiast
3

Jika Anda menemukan diri Anda menggunakan

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

Kemudian, Anda dapat menggunakan (untuk menyimpan byte):

DelVar G;other lines of code

Ini karena ketika Anda menghapus variabel ( G), itu menjadi nilai standarnya, dalam hal ini 0,. Lalu, Anda bisa meletakkan baris lain setelah DelVarpernyataan, tanpa baris baru . Berhati-hatilah saat meletakkan pernyataan kontrol penting langsung setelah DelVarpernyataan.

(Diuji pada TI-84)

Conor O'Brien
sumber
Ini jarang bermanfaat; variabel diinisialisasi ke 0 secara default, dan Anda dapat nol Y dengan melakukan ZStandard.
lirtosiast
@ThomasKwa Sudah bermanfaat bagi saya dalam banyak hal, esp. ketika reset diperlukan di tengah jalan melalui eksekusi.
Conor O'Brien
2
Dalam kode golf? Kapan? Jika Anda menunjukkan kepada saya programnya, saya pikir saya akan dapat mengoptimalkan DelVar.
lirtosiast
@ThomasKwa Bukan xode golf semata , melainkan pemrograman pada ruang disk rendah (TI-83). Saya tidak punya program sekarang. Saya akan menghubungi Anda untuk itu.
Conor O'Brien
1
Setelah beberapa menit berpikir, saya dapat memikirkan beberapa skenario ketika DelVar mungkin terpendek, seperti setelah pernyataan If-line tunggal.
lirtosiast
3

Variabel daftar mana yang digunakan?

Saat menggunakan daftar, hindari daftar default L₁melalui L₆mendukung daftar bernama dengan nama satu huruf: ᶫAthrough ᶫZ(di mana L kecil).

Salah satu biaya dua byte untuk referensi (meskipun L₁adalah token tunggal, itu adalah token dua-byte) tetapi ketika menyimpan nilai dalam daftar, Anda dapat menjatuhkan simbol, menyimpan byte:

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

dapat

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

Kalkulator memeriksa tipe data ekspresi ketika memutuskan di mana hasil disimpan.

Demikian pula, Input Aatau Prompt Aakan disimpan ᶫAjika pengguna memasukkan daftar bukan nomor.

Beberapa perintah lain dapat digunakan tanpa , meskipun sebagian besar jarang digunakan dalam bermain golf. Misalnya, Matr►list(memungkinkan untuk dihapus dalam argumen ketiga, keempat, dan yang lebih tinggi.

Aturan umum adalah bahwa, jika perintah mengambil nama variabel daftar dan bukan ekspresi daftar , dan jika tidak ada sintaks alternatif yang dapat menempatkan jenis variabel yang berbeda di sana, maka perintah mungkin bekerja dengan kiri.

Ini tidak berfungsi dengan memodifikasi satu entri daftar: 1→ᶫA(3tidak dapat diubah menjadi 1→A(3.

Tentu saja, variabel daftar terbaik untuk digunakan selalu Ans.

Misha Lavrov
sumber
Tunggu apa? " Input A" menyimpan ᶫAjika pengguna memasukkan daftar. "Itu berarti bahwa banyak dari program saya cukup mudah untuk dihancurkan. Maka ada baiknya saya tidak memiliki banyak Inputprogram, saya kebanyakan memiliki alat kecil tanpa pengecekan kesalahan atau selesaikan game yang digunakan GetKeyalih-alih Input.
Fabian Röling
1
Jika Anda benar-benar tertarik untuk membuktikan program Anda terhadap hal ini oleh pengguna, Anda selalu dapat menyimpan nilai acak untuk Adan memeriksa apakah itu telah berubah setelahnya Input A.
Misha Lavrov
2

Ketahui biaya penugasan variabel Anda

Jika Anda menggunakan waktu Bekspresi -byte N, haruskah Anda menetapkannya ke variabel?

Ansbiaya 1+Nbyte untuk digunakan (satu untuk linebreak dan satu untuk setiap kali digunakan, jadi gunakan waktu Ans (B-1)*(N-1)>2. Hanya ada satu Ansper baris, jadi coba semua nilai untuk Ansitu mungkin berguna.

Variabel nyata (misalnya X) biaya 3+Nbyte, jadi gunakan kapan (B-1)*(N-1)>4.

Buat daftar 3+2Nbyte biaya , jadi gunakan kapan (B-2)*(N-1)>5.

Variabel persamaan adalah yang paling tidak berguna: mereka membutuhkan 4+2Nbyte. Gunakan kapan (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

Ketika fungsi mengevaluasi ke daftar, simpan ke daftar daripada variabel persamaan seperti u; ini menghemat satu byte.

Perlu diingat bahwa ada atau tidaknya tanda kurung dekat sering dapat menyebabkan menyimpan ekspresi menjadi menguntungkan jika disusun ulang.

Sekarang saya akan menentang diri saya sendiri dan mengatakan bahwa orang harus menulis kode pada satu baris sebanyak mungkin. Mengapa? Biasanya ketika ada ekspresi berulang yang panjang pada sebuah garis, itu bisa disederhanakan.

lirtosiast
sumber
1

int (rand over randInt (

X + int (Yrand sama dengan atau lebih sedikit byte daripada randInt (X, Y sebagai randInt adalah token 2 byte. Beberapa manfaat potensial:

X + dapat ditinggalkan ketika batas bawah adalah 0, menghemat dua byte

X + diperlukan sebelum randInt (tetap dalam situasi tertentu, misalnya acak dari fungsi langkah seperti {2,5,8,11}

X + int (Yrand (N dapat digunakan seperti randInt (X, Y, N untuk menghasilkan daftar angka acak N

Inisialisasi layar grafik

Untuk menggunakan fungsi seperti Line (mudah dengan koordinat piksel, perlu menginisialisasi sumbu layar grafik menjadi piksel persegi dan menghapus sumbu:

AxesOff
84→Xmin
72→Ymax
ZInteger

Penjepit

min(U,max(L,N

Di mana N adalah angka atau algoritma dan U dan L adalah batas atas dan bawah

Apakah N dalam Daftar

max(N={X,Y,Z

Lebih banyak Daftar matematika

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

Keluaran

Disp dan Teks (keduanya dapat dirantai, jadi Disp A, B akan Menampilkan A lalu B pada baris dan Teks yang terpisah (28,40, A, B akan mencetak A di sebelah B pada satu baris)

Tek dari loop gerakan optimal

Banyak dari optimasi ini adalah bagian dari teknologi yang digunakan untuk memindahkan karakter di sekitar layar dalam byte paling sedikit

http://tibasicdev.wikidot.com/movement

Daftar Ukuran Token

http://tibasicdev.wikidot.com/tokens

Untuk bantuan mencetak gol

TiKevin83
sumber