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 ENDIF
bằng cách sử dụng IF
câ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ỏ IF
hoà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<.5
là 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<.5
là 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
, y
và a(i)
:
- Khi
r
là -1
, x=x-1
; khi r
là 0
, x=x+0
.
- Khi
r
là -1
, y=y+0
; khi r
là 0
, y=y-1
.
- Khi
r
là -1
, a(i)=1
; khi r
là 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
.