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.
Jawaban:
Kalkulator Anda cukup pintar dalam menyimpulkan akhir garis untuk Anda, dan dengan demikian Anda dapat menghilangkan beberapa karakter.
For(
loop memiliki sintaksis seperti ini -For(variable, start, end, increment)
, tetapi Anda dapat menghilangkan selisihnya dan itu akan menggunakan 1:dan Anda dapat menghilangkan tanda kurung berakhir (di ujung baris) di seluruh papan:
Diuji pada kalkulator TI-84 Silver Edition saya
Jika Anda pikir ini lebih dari satu ide (menyimpulkan akhir) maka saya akan membaginya
sumber
not(iPart(B))+(A=5
bisa jadi(A=5)+not(iPart(B
.{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.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:
dapat
menghemat dua byte.
sumber
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
Ans
atau 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,
konversikan ke bentuk yang bermanfaat
tulis di pangkalan yang Anda inginkan (pangkalan 11)
dan konversikan ke basis 10
Pendekatan array terpendek adalah 8 byte lebih lama!
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:Konstanta ajaib 576 ditemukan menggunakan Mathematica, tetapi jika Anda tidak memiliki salinannya, gunakan skrip dalam bahasa favorit Anda.
sumber
Masukkan variabel persamaan ekspresi berulang.
EX:
Dapat:
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
sumber
n
ekspresi pertama, bersama denganRemainder(
fungsinya.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
0
dalam TI-BASIC, danXmin
dimulai 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-10
dalam satu byte lebih sedikit, tip ini dapat membantu Anda.sumber
Pembuatan daftar yang lebih kecil
Jika Anda memerlukan daftar
{1,2,...,N}
, di mana N adalah, katakanlah, 42, cara yang jelas untuk membuatnya adalahNamun, satu byte lebih kecil dari itu adalah retas yang rapi menggunakan perintah
binomcdf(
(distribusi binomial kumulatif).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
L1
dimensi N:Jika Anda tidak peduli tentang pesanan:
sumber
seq(X,X,1,N
saatN
tidak konstancumSum(1 or rand(N
.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.
Dapat:
sumber
Kenali idiom Anda
Berikut beberapa cuplikan yang biasa saya gunakan dalam kode golf:
not(not(Ans
atauAns and 1
. Yang mana yang akan digunakan tergantung pada tanda kurung yang dibutuhkan.int(e^(Ans
. Menghemat paren terbuka1+(Ans
. Sangat berguna, karena TI-BASIC memiliki array berbasis satu.{0,1}
ke{1,-1}
:cos(πAns
. Menghemat satu byte lebih1-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
(di mana...
string pencarian)ΔList(cumSum(Ans
ΔList(cumSum(Ans)-Ans
L1
unik:SortA(L1:min(ΔList(L1
1+sum(not(cumSum(Ans=X
median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans
sumber
tanh(ᴇ9Ans
bekerja.Jika Anda menemukan diri Anda menggunakan
Kemudian, Anda dapat menggunakan (untuk menyimpan byte):
Ini karena ketika Anda menghapus variabel (
G
), itu menjadi nilai standarnya, dalam hal ini0
,. Lalu, Anda bisa meletakkan baris lain setelahDelVar
pernyataan, tanpa baris baru . Berhati-hatilah saat meletakkan pernyataan kontrol penting langsung setelahDelVar
pernyataan.(Diuji pada TI-84)
sumber
Variabel daftar mana yang digunakan?
Saat menggunakan daftar, hindari daftar default
L₁
melaluiL₆
mendukung daftar bernama dengan nama satu huruf:ᶫA
throughᶫ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:dapat
Kalkulator memeriksa tipe data ekspresi ketika memutuskan di mana hasil disimpan.
Demikian pula,
Input A
atauPrompt A
akan disimpanᶫA
jika 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(3
tidak dapat diubah menjadi1→A(3
.Tentu saja, variabel daftar terbaik untuk digunakan selalu
Ans
.sumber
Input A
" menyimpanᶫA
jika pengguna memasukkan daftar. "Itu berarti bahwa banyak dari program saya cukup mudah untuk dihancurkan. Maka ada baiknya saya tidak memiliki banyakInput
program, saya kebanyakan memiliki alat kecil tanpa pengecekan kesalahan atau selesaikan game yang digunakanGetKey
alih-alihInput
.A
dan memeriksa apakah itu telah berubah setelahnyaInput A
.Ketahui biaya penugasan variabel Anda
Jika Anda menggunakan waktu
B
ekspresi -byteN
, haruskah Anda menetapkannya ke variabel?Ans
biaya1+N
byte untuk digunakan (satu untuk linebreak dan satu untuk setiap kali digunakan, jadi gunakan waktu Ans(B-1)*(N-1)>2
. Hanya ada satuAns
per baris, jadi coba semua nilai untukAns
itu mungkin berguna.Variabel nyata (misalnya
X
) biaya3+N
byte, jadi gunakan kapan(B-1)*(N-1)>4
.Buat daftar
3+2N
byte biaya , jadi gunakan kapan(B-2)*(N-1)>5
.Variabel persamaan adalah yang paling tidak berguna: mereka membutuhkan
4+2N
byte. Gunakan kapan(B-2)*(N-1)>6
.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.
sumber
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:
Penjepit
Di mana N adalah angka atau algoritma dan U dan L adalah batas atas dan bawah
Apakah N dalam Daftar
Lebih banyak Daftar matematika
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
sumber