Sự làm ngắn lại IF báo cáo
IF báo cáo là khá tốn kém, và chơi golf xuống có thể tiết kiệm rất nhiều byte.
Hãy xem xét những điều sau đây (được điều chỉnh từ câu trả lời của Erik the Outgolfer):
IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF
Điều đầu tiên chúng ta có thể làm là lưu lại ENDIFbằng cách sử dụng IFcâu lệnh một dòng :
IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0
Điều này hoạt động miễn là bạn không cố gắng đặt nó trên cùng một dòng như bất cứ điều gì khác. Đặc biệt, nếu bạn đã lồngIF câu lệnh , chỉ có một câu lệnh trong cùng có thể được xếp thành một dòng.
Nhưng trong trường hợp này, chúng ta có thể loại bỏ IFhoàn toàn bằng toán học. Hãy xem xét những gì chúng ta thực sự muốn:
- Nếu
RND<.5là true ( -1), chúng tôi muốn:
x giảm 1
y giữ nguyên
a(i) để trở thành 1
- Mặt khác, nếu
RND<.5là false ( 0), chúng tôi muốn:
x giữ nguyên
y giảm 1
a(i) trở thành 0
Bây giờ nếu chúng ta lưu kết quả của điều kiện trong một biến ( r=RND<.5), chúng ta có thể tính toán các giá trị mới của x, yvà a(i):
- Khi
rlà -1, x=x-1; khi rlà 0, x=x+0.
- Khi
rlà -1, y=y+0; khi rlà 0, y=y-1.
- Khi
rlà -1, a(i)=1; khi rlà 0, a(i)=0.
Vì vậy, mã cuối cùng của chúng tôi trông giống như:
r=RND<.5
x=x+r
y=y-1-r
a(i)=-r
tiết kiệm được 20 byte (40%) so với phiên bản gốc.
Phương pháp toán học có thể được áp dụng một cách đáng ngạc nhiên thường xuyên, nhưng khi có sự khác biệt về logic giữa hai trường hợp (ví dụ: khi bạn cần nhập một cái gì đó trong một trường hợp nhưng không phải trong trường hợp khác), bạn vẫn sẽ cần sử dụng IF.