เคล็ดลับการตีกอล์ฟในพื้นที่ว่าง


14

คุณมีเคล็ดลับอะไรสำหรับการเล่นกอล์ฟใน Whitespace? ฉันกำลังมองหาความคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟและอย่างน้อยก็ค่อนข้างเฉพาะเจาะจงกับช่องว่าง (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ)

กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ


82
ลบช่องว่างที่ไม่จำเป็นออก
KSFT

1
s / [^ [: space:]] // g
Digital Trauma

คำตอบ:


11

ฉันไม่แน่ใจว่านี่เป็นคำถามตลกหรือไม่ดังนั้นฉันหวังว่าฉันจะไม่ถูกเยาะเย้ยเพราะเอาจริงเอาจัง แต่ ...

เคล็ดลับที่ 1: อย่าจบโปรแกรมของคุณ

spec บอกว่าโปรแกรมควรจะจบลงด้วยสามบรรทัดฟีด[LF][LF][LF]ที่แรกคือการควบคุมการไหล IMP และสองต่อไปคือคำสั่งออก แต่ล่ามจำนวนมากจะเพียงแค่เรียกใช้รหัสของคุณโดยไม่ต้องสิ้นสุดที่เหมาะสม บันทึก 3 ตัวอักษรในโปรแกรมใด ๆ


6

เคล็ดลับที่ 2: ใช้กองอย่างน้อยที่สุด

ฉันเคยใช้กองมากสำหรับการนับลูปของฉันและเช่นนั้น แต่ตระหนักว่ามันไม่มีประสิทธิภาพอย่างแท้จริง; ขั้นแรกให้ผลักที่อยู่รับจำนวนครั้งปัจจุบันรับ / เพิ่มที่อยู่ใหม่ผลักที่อยู่ ฯลฯ

ตอนนี้ฉันแค่กดค่าบนสแต็กเพื่อทำหน้าที่เป็นตัวนับลูปจากนั้นใช้[Space][LF][Tab]คำสั่งสลับเพื่อกลับไปหามันเมื่อฉันต้องการ มันต้องใช้เวลามากในการทำงาน / รอบ ๆ แต่เมื่อคุณได้รับมันสามารถลดจำนวนถ่านของคุณ


5

ใช้ที่อยู่ฮีปโดยพลการ

ล่ามหลายตัวอนุญาตให้คุณอ่าน / เขียนไปยังที่อยู่ฮีปโดยพลการแทนการเริ่มต้นที่ 0 หรือ 1 และนับขึ้น คุณสามารถทำซ้ำค่าสแต็คที่มีอยู่ (3 ไบต์) เพื่อใช้เป็นที่อยู่แทนการกดค่าใหม่ (ขั้นต่ำ 4 ไบต์)


+1 โปรดทราบว่าสิ่งนี้ใช้ได้กับที่อยู่ที่ไม่ใช่เชิงลบเท่านั้น ดังนั้นถ้าส่วนบนสุดของสแต็กเป็นจำนวนเต็มลบคุณจะไม่สามารถใช้มันเป็นที่อยู่ฮีปได้
Kevin Cruijssen

5

ลำดับที่ว่างเปล่าเป็นป้ายกำกับที่ถูกต้อง

[LF][Space][Space][LF](การควบคุมการไหล - ทำเครื่องหมายด้วยป้ายกำกับ '') สร้างป้ายกำกับเปล่าที่เป็นเป้าหมายที่ถูกต้องสำหรับการข้ามหรือเรียกรูทีนย่อย สิ่งนี้จะช่วยประหยัดไบต์เมื่อประกาศฉลากและไบต์ทุกครั้งที่มีการเรียก

( สังเกตได้จากคำตอบของช่องว่างสำหรับการใช้งานเครื่องจริง )


5

ลดจำนวนอักขระทั้งหมดด้วยจำนวนเงินที่แน่นอนและเพิ่มลงไปทางขวาก่อนพิมพ์ในลูป

เครดิต@LukStormsที่ใช้วิธีการที่คล้ายกันในคำตอบของเขาสำหรับความท้าทาย Hello World

( STNใช้สำหรับ Space, Tab และ New-line ตามลำดับ)

การกดค่าสำหรับตัวอักษรจะเป็น 11 ไบต์เสมอ (เช่นการกดค่า 65 สำหรับอักขระ 'A' คือการSSSTSSSSSTNกดค่า 122 สำหรับอักขระ 'z' คือSSSTTTTSTSN) เมื่อคุณต้องการส่งออกข้อความจำนวนมากสิ่งนี้อาจมีราคาแพง แต่คุณสามารถลดค่าของตัวละครทั้งหมดที่คุณต้องการพิมพ์ด้วยจำนวนคงที่และจากนั้นในการวนรอบเพื่อพิมพ์เพิ่มจำนวนคงที่นี้

ซึ่งสามารถทำได้ด้วยรหัสต่อไปนี้ (สมมติว่าค่าคงที่คือ 100 ในกรณีนี้):

  1. ผลักดันค่าทั้งหมดสำหรับตัวละคร (ลบด้วยจำนวนคงที่ 100) ในลำดับย้อนกลับ
  2. NSSN (สร้าง Label_0 โดยเริ่มจากลูป)
    1. SSSTTSSTSSN (กดจำนวนคงที่ 100)
    2. TSSS (เพิ่มสองค่าสูงสุดของสแต็กเข้าด้วยกัน)
    3. TNSS (ปรากฏขึ้นและพิมพ์ค่าที่ถูกต้องในขณะนี้เป็นตัวละคร)
    4. NSNN (ข้ามไปที่ Label_0 ไปที่การวนซ้ำครั้งถัดไป)

สิ่งนี้จะหยุดโปรแกรมด้วยข้อผิดพลาด (ซึ่งได้รับอนุญาตตามเมตาดาต้า ) ทันทีที่มันพยายามที่จะเพิ่ม ( TSSS) โดยไม่มีอะไรเพิ่มเติมในสแต็ก ฉันใช้สิ่งนี้เพื่อตีกอล์ฟคำตอบของฉัน (ดูรายการ 5 และ 6 ของสิ่งที่ฉันทำเพื่อลดจำนวนไบต์ )

การกำหนดจำนวนคงที่ 100 เป็นวิธีที่สั้นที่สุดหรือไม่นั้นขึ้นอยู่กับสิ่งที่คุณกำลังพิมพ์ @LukStormเช่นใช้ 107 ในคำตอบ Hello World ของเขา

โปรดทราบว่าการคัดลอกค่าบนสุด ( SNS) สำหรับอักขระสองตัวที่อยู่ติดกันเหมือนกัน (เช่นlในHello) หรือคัดลอกค่าจากตำแหน่งอื่นยังคงสามารถใช้งานได้นอกจากนี้เพื่อเพิ่มจำนวนไบต์ให้มากขึ้น


4

การข้ามไปยังป้ายกำกับที่ไม่ได้กำหนดจะสิ้นสุดลงโปรแกรม (ในล่ามบางตัว)

สิ่งนี้เริ่มเข้าสู่พฤติกรรมการใช้งานเฉพาะ แต่ฉันเชื่อว่าสิ่งนี้ได้รับอนุญาตเรื่องนี้จะได้รับอนุญาต

TIO (และอาจเป็นล่ามอื่น ๆ ไม่ทำงานบน ideone อย่างน้อย) จะหยุดการทำงานเมื่อมีความพยายามในการข้ามไปยังป้ายกำกับที่ไม่มีอยู่ หากคุณต้องการทำการเปรียบเทียบเพื่อแยกออกจากลูปสิ่งนี้จะช่วยให้คุณสามารถบันทึกไบต์โดยไม่ต้องประกาศเลเบลการแบ่ง (ดูความคิดเห็นของฉันเกี่ยวกับพิมพ์ข้อความที่มองไม่เห็นเป็นตัวอย่าง)


4

ค่า 0 สามารถประกาศเป็นตัวเลขโดยไม่มีเลขฐานสอง

บทช่วยสอนช่องว่างระบุว่าตัวเลขอาจเป็นจำนวนบิต / หลักไบนารีใด ๆ ก็ได้ นี่หมายความว่าตัวเลขที่ไม่มีบิต (เกินกว่าเครื่องหมายบิตที่ต้องการ) คือการแสดงค่า 0 ที่ถูกต้อง[Space][Space][Space][LF]และ[Space][Space][Space][Space][LF]ทั้งคู่ผลักดันค่า 0 ไปยังสแต็ก แต่ตัวเก่านั้นสั้นกว่าหนึ่งไบต์


0

การคัดลอกจำนวนเต็มก่อนหน้านี้อาจสั้นกว่าการสร้างใหม่

( STNใช้สำหรับ Space, Tab และ New-line ตามลำดับ)

STS+ อาร์กิวเมนต์ Number สามารถใช้เพื่อคัดลอกรายการที่ n บนสแต็ก (กำหนดโดยอาร์กิวเมนต์) ไปที่ด้านบนของสแต็กก ในบางกรณีสามารถใช้เพื่อบันทึกไบต์

ตัวอย่างเช่นในคำตอบของฉันฉันอธิบายในรายการที่ 4 ของสิ่งที่ฉันทำเพื่อลดจำนวนไบต์วิธีการคัดลอกค่าที่ 1 (0 ดัชนี) ดัชนี ( STSSTN) สั้นกว่าการกด 12 เพื่อสร้างอักขระ 'p' ( SSSTTSSN) ในส่วน"pop"ของการส่งออก (หมายเหตุ: ฉันใช้ค่า 12 แทน 112 สำหรับตัวอักษร 'p' เพราะฉันใช้เคล็ดลับอื่น ๆ ของการลดค่าทั้งหมดด้วยจำนวนคงที่ซึ่งเราเพิ่มก่อนที่จะพิมพ์อักขระในลูป )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.