คุณมีเคล็ดลับอะไรสำหรับการเล่นกอล์ฟใน Whitespace? ฉันกำลังมองหาความคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟและอย่างน้อยก็ค่อนข้างเฉพาะเจาะจงกับช่องว่าง (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ)
กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คุณมีเคล็ดลับอะไรสำหรับการเล่นกอล์ฟใน Whitespace? ฉันกำลังมองหาความคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟและอย่างน้อยก็ค่อนข้างเฉพาะเจาะจงกับช่องว่าง (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ)
กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คำตอบ:
ฉันไม่แน่ใจว่านี่เป็นคำถามตลกหรือไม่ดังนั้นฉันหวังว่าฉันจะไม่ถูกเยาะเย้ยเพราะเอาจริงเอาจัง แต่ ...
spec บอกว่าโปรแกรมควรจะจบลงด้วยสามบรรทัดฟีด[LF][LF][LF]
ที่แรกคือการควบคุมการไหล IMP และสองต่อไปคือคำสั่งออก แต่ล่ามจำนวนมากจะเพียงแค่เรียกใช้รหัสของคุณโดยไม่ต้องสิ้นสุดที่เหมาะสม บันทึก 3 ตัวอักษรในโปรแกรมใด ๆ
ฉันเคยใช้กองมากสำหรับการนับลูปของฉันและเช่นนั้น แต่ตระหนักว่ามันไม่มีประสิทธิภาพอย่างแท้จริง; ขั้นแรกให้ผลักที่อยู่รับจำนวนครั้งปัจจุบันรับ / เพิ่มที่อยู่ใหม่ผลักที่อยู่ ฯลฯ
ตอนนี้ฉันแค่กดค่าบนสแต็กเพื่อทำหน้าที่เป็นตัวนับลูปจากนั้นใช้[Space][LF][Tab]
คำสั่งสลับเพื่อกลับไปหามันเมื่อฉันต้องการ มันต้องใช้เวลามากในการทำงาน / รอบ ๆ แต่เมื่อคุณได้รับมันสามารถลดจำนวนถ่านของคุณ
ล่ามหลายตัวอนุญาตให้คุณอ่าน / เขียนไปยังที่อยู่ฮีปโดยพลการแทนการเริ่มต้นที่ 0 หรือ 1 และนับขึ้น คุณสามารถทำซ้ำค่าสแต็คที่มีอยู่ (3 ไบต์) เพื่อใช้เป็นที่อยู่แทนการกดค่าใหม่ (ขั้นต่ำ 4 ไบต์)
[LF][Space][Space][LF]
(การควบคุมการไหล - ทำเครื่องหมายด้วยป้ายกำกับ '') สร้างป้ายกำกับเปล่าที่เป็นเป้าหมายที่ถูกต้องสำหรับการข้ามหรือเรียกรูทีนย่อย สิ่งนี้จะช่วยประหยัดไบต์เมื่อประกาศฉลากและไบต์ทุกครั้งที่มีการเรียก
เครดิต@LukStormsที่ใช้วิธีการที่คล้ายกันในคำตอบของเขาสำหรับความท้าทาย Hello World
( STN
ใช้สำหรับ Space, Tab และ New-line ตามลำดับ)
การกดค่าสำหรับตัวอักษรจะเป็น 11 ไบต์เสมอ (เช่นการกดค่า 65 สำหรับอักขระ 'A' คือการSSSTSSSSSTN
กดค่า 122 สำหรับอักขระ 'z' คือSSSTTTTSTSN
) เมื่อคุณต้องการส่งออกข้อความจำนวนมากสิ่งนี้อาจมีราคาแพง แต่คุณสามารถลดค่าของตัวละครทั้งหมดที่คุณต้องการพิมพ์ด้วยจำนวนคงที่และจากนั้นในการวนรอบเพื่อพิมพ์เพิ่มจำนวนคงที่นี้
ซึ่งสามารถทำได้ด้วยรหัสต่อไปนี้ (สมมติว่าค่าคงที่คือ 100 ในกรณีนี้):
NSSN
(สร้าง Label_0 โดยเริ่มจากลูป)
SSSTTSSTSSN
(กดจำนวนคงที่ 100)TSSS
(เพิ่มสองค่าสูงสุดของสแต็กเข้าด้วยกัน)TNSS
(ปรากฏขึ้นและพิมพ์ค่าที่ถูกต้องในขณะนี้เป็นตัวละคร)NSNN
(ข้ามไปที่ Label_0 ไปที่การวนซ้ำครั้งถัดไป)สิ่งนี้จะหยุดโปรแกรมด้วยข้อผิดพลาด (ซึ่งได้รับอนุญาตตามเมตาดาต้า ) ทันทีที่มันพยายามที่จะเพิ่ม ( TSSS
) โดยไม่มีอะไรเพิ่มเติมในสแต็ก ฉันใช้สิ่งนี้เพื่อตีกอล์ฟคำตอบของฉัน (ดูรายการ 5 และ 6 ของสิ่งที่ฉันทำเพื่อลดจำนวนไบต์ )
การกำหนดจำนวนคงที่ 100 เป็นวิธีที่สั้นที่สุดหรือไม่นั้นขึ้นอยู่กับสิ่งที่คุณกำลังพิมพ์ @LukStormเช่นใช้ 107 ในคำตอบ Hello World ของเขา
โปรดทราบว่าการคัดลอกค่าบนสุด ( SNS
) สำหรับอักขระสองตัวที่อยู่ติดกันเหมือนกัน (เช่นl
ในHello
) หรือคัดลอกค่าจากตำแหน่งอื่นยังคงสามารถใช้งานได้นอกจากนี้เพื่อเพิ่มจำนวนไบต์ให้มากขึ้น
สิ่งนี้เริ่มเข้าสู่พฤติกรรมการใช้งานเฉพาะ แต่ฉันเชื่อว่าสิ่งนี้ได้รับอนุญาตเรื่องนี้จะได้รับอนุญาต
TIO (และอาจเป็นล่ามอื่น ๆ ไม่ทำงานบน ideone อย่างน้อย) จะหยุดการทำงานเมื่อมีความพยายามในการข้ามไปยังป้ายกำกับที่ไม่มีอยู่ หากคุณต้องการทำการเปรียบเทียบเพื่อแยกออกจากลูปสิ่งนี้จะช่วยให้คุณสามารถบันทึกไบต์โดยไม่ต้องประกาศเลเบลการแบ่ง (ดูความคิดเห็นของฉันเกี่ยวกับพิมพ์ข้อความที่มองไม่เห็นเป็นตัวอย่าง)
บทช่วยสอนช่องว่างระบุว่าตัวเลขอาจเป็นจำนวนบิต / หลักไบนารีใด ๆ ก็ได้ นี่หมายความว่าตัวเลขที่ไม่มีบิต (เกินกว่าเครื่องหมายบิตที่ต้องการ) คือการแสดงค่า 0 ที่ถูกต้อง[Space][Space][Space][LF]
และ[Space][Space][Space][Space][LF]
ทั้งคู่ผลักดันค่า 0 ไปยังสแต็ก แต่ตัวเก่านั้นสั้นกว่าหนึ่งไบต์
( STN
ใช้สำหรับ Space, Tab และ New-line ตามลำดับ)
STS
+ อาร์กิวเมนต์ Number สามารถใช้เพื่อคัดลอกรายการที่ n บนสแต็ก (กำหนดโดยอาร์กิวเมนต์) ไปที่ด้านบนของสแต็กก ในบางกรณีสามารถใช้เพื่อบันทึกไบต์
ตัวอย่างเช่นในคำตอบของฉันฉันอธิบายในรายการที่ 4 ของสิ่งที่ฉันทำเพื่อลดจำนวนไบต์วิธีการคัดลอกค่าที่ 1 (0 ดัชนี) ดัชนี ( STSSTN
) สั้นกว่าการกด 12 เพื่อสร้างอักขระ 'p' ( SSSTTSSN
) ในส่วน"pop"
ของการส่งออก (หมายเหตุ: ฉันใช้ค่า 12 แทน 112 สำหรับตัวอักษร 'p' เพราะฉันใช้เคล็ดลับอื่น ๆ ของการลดค่าทั้งหมดด้วยจำนวนคงที่ซึ่งเราเพิ่มก่อนที่จะพิมพ์อักขระในลูป )