Rút ngắn vòng lặp vô hạn của bạn
Khi bạn phải sử dụng một vòng lặp vô hạn, bạn có thể nghĩ đến việc sử dụng một while
, nhưng sử dụng nhãn thay vì ngắn hơn 2 byte:
while''do end
::a::goto a
Sử dụng ít không gian nhất có thể
Có một điều đơn giản mà bạn có thể (ab) sử dụng để xóa nhiều khoảng trống hơn khỏi mã của mình. Thông số kỹ thuật của Lua rất rõ ràng về tên bạn đặt cho các biến: Chúng phải bắt đầu bằng một chữ cái. Nó ngụ ý rằng, đôi khi, bạn có thể bỏ qua khoảng trắng giữa các số và hàm / biến
x=0>1 and 0or 1print(x)
Khả năng xóa khoảng trắng phụ thuộc vào chữ cái theo số, đây là chữ cái không cho phép bạn làm điều này:
a,b,c,d,e,f -- They would be interpreted as hexadecimal
x -- only fail when after a 0, other number are fine
-- (0x indicates the following is an hexadecimal number)
Bằng cách sử dụng điều này và chú ý đến cách bạn gọi các biến của mình, bạn có thể làm cho hầu hết các mã nguồn của mình không có chỗ trống.
Chọn một ví dụ đã có ở đây và sử dụng lời khuyên này, đây là một byte nữa bạn có thể xóa đi :).
print(a and-1 or-2)
print(a and-1or-2)
Sử dụng đúng phương thức nhập
Nếu chúng ta nhìn vào bản mẫu và chi phí cho mỗi lớn loại đầu vào, đây là những gì chúng ta có:
function f(x)x end
io.read()
arg[1]
Mỗi một phương thức này cho phép chúng tôi lấy 1 đầu vào, với chức năng là một đầu vào có chi phí nặng nhất (nhưng cho phép chúng tôi lấy một bảng làm đầu vào)
Bây giờ chúng ta có thể thấy rằng sử dụng đối số dòng lệnh là cách dễ dàng nếu bạn muốn chơi gôn, nhưng lưu ý: nó có thể còn ngắn hơn
arg[1]
...
Có ...
một chút đặc biệt trong lua, đó là một biến chứa nội dung được giải nén arg
hoặc các tham số đã giải nén trong trường hợp hàm matrixdic.
Khi bạn sẽ phải nhận được nhiều hơn một đầu vào và sử dụng từng đầu vào, việc lưu chúng vào một biến là điều tốt. Dưới đây là một số cách để lưu 2 đầu vào trong các biến
a=arg[1]b=arg[2] -- highly un-efficient, costs 8 bytes by variable
a,b=unpack(arg) -- costs 15, but at least doesn't depends on the number of argument
a,b=... -- only costs 7
và đây là cuộc gọi ngắn nhất bạn có thể thực hiện mà không có các biến:
... -- using a allow a gain of 1-2 bytes at each use
arg[2] -- using b allow a gain of 4-5 bytes at each use
Từ điểm bạn có 3 đối số hoặc khi bạn sử dụng 2 đối số, với một đối số được sử dụng hai lần, bạn đã đạt được byte do a,b=...
! :)
Hầu như không bao giờ sử dụng nếu!
Gần như không có trường hợp nào sử dụng câu lệnh if / otherif / if sẽ có giá thấp hơn một câu ba. cái nồi hơi cho một tuyên bố như vậy là rất nặng:
-- exemple with dumb values
if 1>0then v=1 else v=0 end
v=1>0 and 1or 0
Với một ví dụ đơn giản, bạn đã lưu 12 byte, khi bạn phải thực hiện một số thao tác khác, nó sẽ ngày càng trở nên quan trọng hơn, vì vậy hãy lưu ý điều đó!
Ngoài ra, chim nhạn ở lua rất đặc biệt , có một số điều kiện trong cách chúng hoạt động, đối với những người quan tâm, tôi sẽ giải thích nó dưới đây:
Chim nhạn ở lua có dạng <condition> and <case true: have to be a true value> or <case false: can be anything>
Trước hết, hãy xem bảng chân lý của or
. A or
có thể được coi là một hàm: nó luôn trả về một giá trị, đây là giá trị mà nó trả về:
x | y ||x or y
------||-------
0 | 0 || y
0 | 1 || y
1 | 0 || x
1 | 1 || x
Đó là những gì cho phép chúng tôi xây dựng chim nhạn của chúng tôi.
Các and
là những gì cho phép chúng tôi đánh giá điều kiện, nó sẽ luôn luôn trở lại y
nếu x and y
đánh giá lại là true.
Vấn đề với nó là nó sẽ thất bại nếu chúng ta muốn một nil
hoặc false
được trả lại khi có điều kiện false
. Chẳng hạn, những điều sau đây sẽ luôn trả về 5, mặc dù điều kiện là đúng.
v = true and false or 5
Dưới đây là từng bước đánh giá của một con chim nhạn để giải thích cách thức hoạt động của nó (nó sẽ hữu ích khi bạn phải lồng chúng :))
-- let's use our dumb ternary
= true and false or 5
-- and statement will be evaluated first, leading to
= false or 5
-- and we saw how the or works
= 5