Tips umum apa yang Anda miliki untuk bermain golf di Lua? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk Lua (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.
21
Jawaban:
Selain yang sudah diposting, berikut adalah beberapa trik yang telah saya kumpulkan dari waktu ke waktu, tanpa urutan tertentu ...
Untuk panggilan fungsi yang hanya memiliki satu parameter yang dibatasi oleh simbol (
"
untuk string,{
untuk tabel), parameter tidak perlu dililitkan di dalam tanda kurung.Misalnya, alih-alih melakukan
print("hello")
, Anda cukup melakukan:print"hello"
Hapus spasi sebanyak mungkin - ini terutama mudah dilakukan setelah simbol yang menutup string (atau sebelum satu pembukaan), pemanggilan fungsi, tabel ...
Alih-alih
print(42) a=1
bisa Anda lakukanprint(42)a=1
. Contoh lain:print(a and-1 or-2)
.Gunakan operator ternary saat Anda bisa! Alih-alih
if a>0 then print("hello") else print("goodbye") end
, lebih sukaprint(a>0 and "hello" or "goodbye")
. Info lebih lanjut di sini .(Ini benar-benar dapat menjadi lebih baik
print(a>0 and"hello"or"goodbye")
:)Gunakan gula sintaksis panggilan-kolon ketika Anda bisa: bukannya
string.rep(str,12)
, lakukanstr:rep(12)
. Itu juga berfungsi pada non-variabel dengan cara ini (dan hanya dengan cara ini):("a"):rep(5)
Alih-alih melakukan lakukan
tonumber(str)
sajastr+0
Untuk fungsi tanpa parameter, alih-alih mendefinisikannya dengan cara biasa (
function tick() blabla() end
), Anda dapat melakukanticks=loadstring"blabla()"
:, yang menyimpan 1 byte atau lebih, tergantung kontennya. Juga, jika Anda mendefinisikan beberapa fungsi, pelokalkanloadstring
ke variabel 1-char sebelumnya dan Anda akan menghemat banyak byte;). Penghargaan kepada Jim Bauwens untuk trik ini.Lua menganggap string kosong (dan
0
tidak seperti bahasa lain) sebagai true dalam tes bersyarat, jadi, misalnya, alih-alih melakukanwhile 1 do ... end
, simpan 1 byte dengan menuliswhile''do ... end
sumber
str+0
Setara lainnya adalah~~str
, dapat bermanfaat untuk didahulukanSaya sudah memikirkan satu. Saya tidak tahu apakah itu berfungsi dalam beberapa bahasa lain, tetapi Lua adalah satu-satunya yang saya tahu yang memungkinkan Anda untuk menyimpan fungsi dalam variabel. Jadi, jika eg
string.sub
digunakan beberapa kali dalam program Anda, gunakan miss=string.sub
.sumber
s=("").sub
ataus=a.sub
untuk variabel apa pun yanga
berisi nilai string.Ini adalah bahasa yang sangat cocok untuk bermain golf ... tetapi beberapa tips umum yang muncul di benak Anda adalah:
if
...then
...else
...end
adalah pemborosan besar.for i=1,5 do
.#
operator adalah cukup besar untuk bermain golf (dan secara umum).sumber
Persingkat loop tak terbatas Anda
Ketika Anda harus menggunakan infinite loop, Anda mungkin berpikir untuk menggunakan
while
, tetapi menggunakan label lebih pendek 2 byte:Gunakan ruang sesedikit mungkin
Ada hal sederhana yang dapat Anda (ab) gunakan untuk menghapus lebih banyak ruang dari kode Anda. Spesifikasi Lua jelas tentang nama yang Anda berikan ke variabel: Mereka harus mulai dengan huruf. Ini menyiratkan bahwa, kadang-kadang, Anda dapat melewati spasi antara angka dan fungsi / variabel
Kemungkinan untuk menghapus ruang tergantung pada huruf berikut nomornya, inilah surat yang tidak akan memungkinkan Anda untuk melakukan ini:
Dengan menggunakan ini, dan memperhatikan bagaimana Anda memanggil variabel Anda, Anda dapat membuat sebagian besar kode sumber Anda bebas-ruang.
Ambil contoh sudah ada di sini, dan menggunakan saran ini, berikut ini satu byte lagi yang bisa Anda hilangkan :).
Gunakan metode input yang benar
Jika kita melihat pelat dan biaya untuk setiap jenis input utama , inilah yang kami miliki:
Masing-masing dari metode ini memungkinkan kita untuk mengambil 1 input, dengan fungsi menjadi satu dengan biaya terberat (tetapi memungkinkan kita mengambil tabel sebagai input)
Kita sekarang dapat melihat bahwa menggunakan argumen baris perintah adalah cara yang harus dilakukan jika Anda ingin bermain golf, tetapi perlu diingat: ini bisa menjadi lebih singkat
Itu
...
agak istimewa di lua, itu adalah variabel yang berisi konten yang tidak dibongkararg
, atau parameter yang dibongkar jika ada fungsi variadic.Saat Anda harus mendapatkan lebih dari satu input, dan menggunakan masing-masing input, sebaiknya simpan dalam variabel. Berikut adalah beberapa cara untuk menyimpan 2 input dalam variabel
dan di sini adalah panggilan terpendek yang dapat Anda lakukan tanpa variabel:
Dari titik di mana Anda memiliki 3 argumen, atau ketika Anda menggunakan 2 argumen, dengan satu argumen digunakan dua kali, Anda sudah mendapatkan byte karena
a,b=...
! :)Hampir tidak pernah digunakan jika!
Hampir tidak ada kasus di mana menggunakan pernyataan if / elseif / if akan menelan biaya kurang dari satu ternary. pelat untuk pernyataan seperti itu benar-benar berat:
Dengan contoh sederhana, Anda sudah menyimpan 12 byte, ketika Anda harus melakukan beberapa hal lain, itu menjadi semakin penting, jadi waspadalah!
Juga, terner di lua adalah spesial , ada beberapa kondisi dalam cara kerjanya, bagi yang berminat, saya akan jelaskan di bawah ini:
Ternary di lua adalah bentuk
<condition> and <case true: have to be a true value> or <case false: can be anything>
Pertama - tama, mari kita lihat tabel kebenaran
or
. Aor
dapat dianggap sebagai fungsi: selalu mengembalikan nilai, inilah nilai yang dikembalikan:Itulah yang memungkinkan kita untuk membangun ternary kita.
Inilah
and
yang memungkinkan kita untuk mengevaluasi kondisi, itu akan selalu kembaliy
jikax and y
dievaluasi benar.Masalahnya adalah itu akan gagal jika kita ingin
nil
ataufalse
akan kembali ketika kondisinyafalse
. Misalnya, yang berikut ini akan selalu mengembalikan 5, meskipun kondisinya benar.Berikut ini adalah langkah demi langkah evaluasi terner untuk menjelaskan cara kerjanya (ini akan berguna ketika Anda harus membuat sarang mereka :))
sumber
Saya telah menyusun beberapa tips juga. Saya yakin sebagian dari saya akan tumpang tindih dengan yang sudah dinyatakan, tapi bagaimanapun saya akan memasukkan mereka dalam uraian menciptakan jawaban yang lebih lengkap.
Tetapkan fungsi berulang untuk variabel
Lua memungkinkan Anda untuk menetapkan fungsi ke variabel. Bahkan satu karakter variabel. Ini berarti jika Anda mengulangi fungsi
string.sub(x, y)
lebih dari dua kali, Anda akan mendapat manfaat dari menugaskannya ke variabel.Tanpa menetapkan ke variabel (69 karakter):
Menetapkan ke variabel (51 karakter):
Ada kasus di mana Anda dapat mengambil ini selangkah lebih maju. Lua memungkinkan OOP untuk memanipulasi string, seperti:
str:sub(x, y)
ataustr.sub(x, y)
Ini membuka opsi baru untuk kode kita. Anda dapat menetapkan variabel ke fungsi dengan referensi itu seperti yang ditunjukkan (46 karakter.)Gunakan cara paling efisien untuk mengurai string
Anda mungkin menemukan diri Anda menggunakan
for
loop danstring.sub
untuk mengulangi karakter demi karakter di Lua. Terkadang ini bekerja dengan baik, tergantung pada kebutuhan Anda, tetapi di lain waktu, string.gmatch akan bekerja dalam karakter yang lebih sedikit. Berikut ini contoh keduanya:Dan saat bermain golf, perbedaannya lebih menonjol:
Menata Ulang Tugas Untuk Mengoptimalkan Ruang Putih
Di Lua, Anda tidak harus meletakkan karakter spasi antara tanda kurung tertutup atau tanda kutip akhir dan karakter berikutnya. Sejauh ini, saya telah menemukan dua kasus di mana restrukturisasi dengan pemikiran ini akan memotong karakter.
Menetapkan variabel:
Jika Pernyataan:
Kembalikan karakter sesedikit mungkin
Jika Anda harus mengembalikan nilai benar atau salah, maka tampaknya Anda harus menggunakan setidaknya 5 karakter untuk nilai pengembalian. Pada kenyataannya, berikut ini juga berfungsi:
sumber
nil
danfalse
menilai false di lua, semua yang lain benar, jadi tips Anda tentang menggantix==0
,x==""
danx==''
olehx
itu salah. Saya sedang mengubahnya kenil
:).Ini hanya optimasi Lua (saya pikir):
String secara otomatis dikonversi menjadi angka ketika melakukan operasi aritmatika. Hanya hati-hati untuk pernyataan bersyarat, mereka tidak secara otomatis mengkonversi. Ini bagus untuk mengambil input pengguna sebagai angka sambil menghemat ruang.
Mengalihkan konten dari dua variabel tidak memerlukan variabel sementara.
a,b=b,a
akan menukar nilai a dan b.Juga, untuk memperluas apa yang dikatakan di atas, karakter alfanumerik apa pun dapat menyentuh karakter non alfanumerik. Begitu
a,b=io.read():match"(.+)/(.+)"u,v=a,b
juga skrip yang berfungsi dengan baik, bahkan dengan kekurangan spasi.sumber
Gabungkan Tugas Variabel Lokal
Dari pada:
Gunakan penugasan paralel:
6 byte disimpan untuk setiap variabel!
Deklarasikan Variabel Lokal melalui Parameter Fungsi yang Tidak Digunakan
Dari pada:
Menggunakan
6 byte disimpan (minus 1-2 byte untuk setiap variabel yang mungkin diduplikasi).
sumber
local
dibenarkan ketika bermain golf, karena Anda hanya perlu menggunakan nama yang berbeda. Kita bisa menggunakan SEMUA nama hingga 7 charachters DAN tabel dengan indeks string hingga 7 kombinasi charachters sebelum kita memukul sesuatu yang bisa mendapat manfaat dari menggunakan penduduk setempatFungsi Variadik
Fungsi variadic utama yang akan merepotkan Anda adalah
print()
. Misalnya, ketika Anda menggunakannya sepanjangString.gsub()
itu akan mencetak string yang Anda modifikasi DAN berapa kaligsub
dipicu.Untuk menekan output kedua, enkapsulasi
gsub
parens Anda untuk memaksanya mengembalikan hanya satu nilaisumber
Tahu cara output
Ada dua metode utama keluaran dalam lua
Ketika Anda harus menggabungkan beberapa kali, Anda dapat mempersingkatnya dengan menggunakan
io.write()
variabel satu huruf alih-alih operator gabungan standar...
Anda mendapatkan 2 byte pada setiap panggilan sambil membayar dimuka
Anda bahkan berada pada rangkaian ketiga, dan mulai mendapatkan byte pada keempat.
sumber
print
dan tidakprintf
!Banyak tips tanpa urutan tertentu:
string
adalah nama yang cukup panjang. Secara efisien,('').char
sama denganstring.char
. Bahkan hasil yang lebih baik dapat dicapai jika Anda menggunakannya bersama-sama dengan tanda titik koma pada variabel:,a=...; print(a:sub(1, 5))
tetapi beberapastring
fungsi tidak menggunakan string sebagai input.tonumber
dan+0
seringkali hanya menghabiskan byte.load'your function code here'
bukanfunction()your function code here end
. Akses argumen fungsi menggunakan...
di dalam.a:gsub('.',load'my function')
tampaknya merupakan cara terpendek untuk beralih pada karakter dalam stringa:find('.',1,1)
(untuk menguji masalah ini, coba sertakan%
di berbagai tempat di masukan Anda dan lihat hasilnya). Banyak ide yang pecah karena Lua mencoba mengurai input sebagai pola.nil
adalah tiga byte,_
adalah satu (itu hanya nama acak yang kemungkinan besar tidak ada). Juga, angka apa pun akan berfungsi sebagai nilai kebenaran.x and i or o
. Ini bukan hanya operator ternary - ini adalah ekspresi logis yang lengkap. Bahkan, ini berarti yang berikut: "jikax
itu benar, cobai
. Jika salah x atau saya salah, kembalikan o". Jadi jikai
tidak benar, hasilnya adalaho
. Juga, keduanyaand
atauor
bagian dapat dihilangkan (x and i
,x or o
).math.floor
:5.3//1==5.0
. Harap dicatat bahwa angka yang dihasilkan selalu mengikuti jenis input satu (integer / float).sumber