ทำให้IF
ข้อความสั้นลง
IF
คำสั่งค่อนข้างแพงและการเล่นกอล์ฟลงสามารถบันทึกจำนวนมากไบต์
พิจารณาสิ่งต่อไปนี้ (ดัดแปลงมาจากคำตอบของ Erik the Outgolfer):
IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF
สิ่งแรกที่เราทำได้คือบันทึกENDIF
โดยใช้IF
คำสั่งแบบบรรทัดเดียว:
IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0
ใช้งานได้ตราบใดที่คุณไม่พยายามวางไว้ในบรรทัดเดียวกันกับสิ่งอื่นใด โดยเฉพาะอย่างยิ่งหากคุณมีIF
คำสั่งซ้อนกันเพียงหนึ่งในสุดเท่านั้นที่สามารถเป็นหนึ่งเดียว
แต่ในกรณีนี้เราสามารถกำจัดการIF
ใช้คณิตศาสตร์ได้ทั้งหมด พิจารณาสิ่งที่เราต้องการ:
- หาก
RND<.5
เป็นจริง ( -1
) เราต้องการ:
x
เพื่อลดลง 1
y
อยู่เหมือนกัน
a(i)
กลายเป็น 1
- มิฉะนั้นถ้า
RND<.5
เป็นเท็จ ( 0
) เราต้องการ:
x
อยู่เหมือนกัน
y
เพื่อลดลง 1
a(i)
เป็น 0
ตอนนี้ถ้าเราบันทึกผลของเงื่อนไขในตัวแปร ( r=RND<.5
) เราสามารถคำนวณค่าใหม่ของx
, y
และa(i)
:
- เมื่อ
r
เป็น-1
, x=x-1
; เมื่อr
เป็น,0
x=x+0
- เมื่อ
r
เป็น-1
, y=y+0
; เมื่อr
เป็น,0
y=y-1
- เมื่อ
r
เป็น-1
, a(i)=1
; เมื่อr
เป็น,0
a(i)=0
ดังนั้นรหัสสุดท้ายของเราดูเหมือนว่า:
r=RND<.5
x=x+r
y=y-1-r
a(i)=-r
ประหยัดพื้นที่เก็บมากถึง 20 ไบต์ (40%) จากเวอร์ชันดั้งเดิม
วิธีการทางคณิตศาสตร์ที่สามารถนำมาใช้น่าแปลกใจบ่อย แต่เมื่อมีความแตกต่างในตรรกะระหว่างสองกรณี (เช่นเมื่อคุณต้องการบางสิ่งบางอย่างในการป้อนข้อมูลกรณีหนึ่ง แต่ไม่ได้อยู่ในที่อื่น ๆ ) IF
คุณจะยังคงต้องใช้