เคล็ดลับสำหรับการเล่นกอล์ฟใน INTERCAL


10

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

ฉันรู้ว่าภาษาแปลก ๆ มีประโยชน์จริง ๆ ในการชนะการแข่งขันกอล์ฟ แต่ฉันไม่เห็นรหัส INTERCAL รอบ ๆ ที่นี่ คุณมีคำแนะนำใดบ้างที่จะช่วยให้ผู้คนรับขนาดรหัสที่แข่งขันได้ด้วย INTERCAL? ภาษานี้สามารถแข่งขันได้หรือไม่?

INTERCAL ด้อยคุณภาพมากจนไม่มีแท็ก เศร้ามาก...


ภาษาส่วนใหญ่ไม่มีหรือต้องการแท็กของตนเองที่นี่เนื่องจากความท้าทายเฉพาะภาษานั้นไม่ได้รับการสนับสนุน
Alex A.

9
คำใบ้ว่านี่อาจไม่ใช่ภาษากอล์ฟที่ดีที่สุดจากหน้าวิกิพีเดีย:Despite the language's intentionally obtuse and wordy syntax,
isaacg

คำตอบ:


2

การกำจัดช่องว่าง / "สัญญาณรบกวน" สามารถไปได้ไกลกว่าที่คุณคาดไว้

INTERCAL เป็นภาษาที่ไวต่อการเว้นวรรค ซึ่งแตกต่างจากภาษาที่ไวต่อช่องว่างส่วนใหญ่แม้ว่าความไม่รู้สึกจะไปไกลเกินกว่าที่คุณคาดหวัง

ตัวอย่างเช่นDO NOTเป็นสองโทเค็น แต่สามารถเขียนได้DONOTโดยไม่มีการแยกวิเคราะห์บ่น (ในการใช้งานที่ใช้กันอย่างแพร่หลายมาก) (แน่นอนคุณสามารถเขียนDON'Tได้ แต่ไม่ใช่คนที่พยายามอ่านมันง่ายกว่า แต่PLEASEN'Tอาจจะอ่านยากกว่าPLEASE NOT) จริง ๆ แล้วมีการถกเถียงกันว่าช่องว่างทำอะไรเลยหรือไม่ ตัวแยก INTERCAL อย่างน้อยหนึ่งตัวอนุญาตให้ใช้แม้จะอยู่ในค่าคงที่ตัวเลข (ไม่ใช่ว่ามีประโยชน์มากเมื่อเล่นกอล์ฟ) สิ่งหนึ่งที่ควรคำนึงถึงคือการลบช่องว่างออกจากสิ่งที่DO READ OUTให้ซึ่งอาจสร้างความสับสนให้กับตัวแยกสัญญาณ INTERCAL บางอันเนื่องจากการฝังDOREADOUTDO(แม้ว่าผู้เขียนโดยทั่วไปจะพิจารณาข้อผิดพลาดนี้และทุกวันนี้มันใช้งานได้ในโปรแกรมที่ถูกต้อง แต่ก็ไม่แนะนำให้ใส่รหัสเช่นนี้ในบริเวณที่มีข้อผิดพลาดทางไวยากรณ์เนื่องจากอาจทำให้ยากต่อการเข้าใจผิดมากขึ้น)

นอกจากนี้โปรดจำไว้ว่าคุณสามารถ overpunch อักขระเพื่อประหยัดเนื้อที่ ใน ASCII คุณสามารถดึงสิ่งนี้ด้วย'.!เท่านั้น แต่นั่นเป็นกลอุบายที่มีประโยชน์อย่างมากในสิทธิของตนเอง (เมื่อคุณไม่ได้ใช้อาร์เรย์มีความเป็นไปได้ของความคลุมเครือ sparkears แม้ในขณะที่ตัวละครการจัดกลุ่มของคุณทั้งหมดจะเหมือนกันดังนั้นสำหรับการเล่นกอล์ฟรายการไม่มีก็แนะนำให้ติดเพียง'เว้นแต่จะมีการห้อยอาร์เรย์แท้จริงต้องมี".) หนอนหนังสือสามารถ แสดงในหนึ่งไบต์โดยใช้?ตัวย่อ (C-INTERCAL) หรือ Latin-1 สำหรับ¥(CLC-INTERCAL) มากกว่าสามที่ INTERCAL-72 ต้องการ


2

มุ่งเน้นไปที่การทำงานให้มากที่สุดเท่าที่จะทำได้ในหนึ่งประโยค

ตัวระบุคำสั่งของ INTERCAL ค่อนข้างละเอียด DOเป็นตัวละครที่มีเสียงรบกวนสองตัวในทุกประโยคชื่อของประโยคนั้นมีแนวโน้มที่จะยาวและคุณจะต้องขว้างPLEASEทุก ๆ ตอนเพื่อให้ตัวแยกวิเคราะห์มีความสุข (วิธีที่ดีที่สุดที่คุณสามารถทำได้คืออัตราส่วนสี่DOต่อหนึ่งPLEASEซึ่งหมายความว่าคุณใช้อักขระ 14 ตัวในตัวระบุสำหรับทุก 5 คำสั่ง) ในทางกลับกันไวยากรณ์ของนิพจน์นั้นค่อนข้างสั้น (ไร้สาระ แต่สั้น) ซึ่งหมายความว่ามันมักจะเหมาะสมส่วนหนึ่งของโปรแกรมของคุณในการแสดงออกเดียวแม้เมื่อใช้หลายงบจะเป็นวิธีที่ "เป็นธรรมชาติ" มากขึ้นในการทำสิ่งต่าง ๆ

ตัวอย่างเช่นหากคุณต้องการกำหนด#1ให้.1และ#2ไปที่.2แทนที่จะทำตามวิธีที่ชัดเจนของ INTERCAL-72:

DO.1<-#1DO.2<-#2

มันคุ้มค่าอย่างยิ่งที่ต้องพิจารณาการใช้ตัวแปรสุ่มมากเกินไปเพื่อให้คุณสามารถกำหนดทั้งสองได้พร้อมกัน:

DO:1<-#1$#2

(ด้วยการ:1/!1$.2'โยนที่ใดที่หนึ่งในโปรแกรมก่อนหน้านี้โปรดทราบว่าเอกสารนี้โพสต์วันที่ INTERCAL-72 โดยวิธีดังนั้นคุณจะต้องใช้ INTERCAL ที่ทันสมัยเพื่อให้การทำงาน) สิ่งนี้จะใช้เวลานานกว่าเล็กน้อยแม้ว่าคุณจะพิจารณาการตั้งค่าและจะสั้นลงหากคุณต้องการหรือสามารถจัดการมอบหมายพร้อมกัน.1และ.2มากกว่าหนึ่งครั้งพร้อมกัน

มันไม่ใช่แค่คำนวณคำสั่งที่ใช้เคล็ดลับนี้ได้ หากคุณต้องการซ่อนตัวแปรสองครั้งอย่าทำอย่างนี้:

DOSTASH.1DOSTASH.1

แต่เช่นนี้

DOSTASH.1+.1

( +สัญกรณ์ใช้งานได้กับคำสั่งส่วนใหญ่ที่สามารถทำให้เกิดความคิดรวบยอดได้)


2

ใช้ RESUME เดียวสำหรับ INTERCAL-72 ทุกรูปแบบหากมีการวางโครงสร้าง

หากคุณต้องการที่จะเขียนเทียบเท่าของ "ถ้า" คำสั่งวิธีการปกติใช้ INTERCAL-72 รหัสคือการสองครั้งแล้วทำคำนวณNEXT RESUME(ในรหัสที่ทันสมัยมักจะคำนวณได้COME FROMจะดีกว่า แต่เคล็ดลับนี้ถือว่ารหัสของคุณชอบNEXT) คุณเกือบจะต้องจ่ายไบต์เป็นครั้งแรกNEXTในขณะที่มันกระโดดจากสาขาหนึ่งของ "ถ้า" ไปที่อื่น การแบ่งปันที่สองNEXTยังเป็นขี้ปะติ๋วเว้นแต่คุณจะมีจำนวนมาก "ถ้า" #1งบที่ไปที่สถานที่เดียวกันเมื่อเห็นเป็น อย่างไรก็ตามRESUMEสามารถอยู่ที่ใดก็ได้ในโปรแกรม (เนื่องจากการควบคุมกำลังจะออกจากที่ใดก็ได้)

มีสองวิธีในการจัดการกับสิ่งนี้ หากคุณมีคำสั่ง "if" จำนวนมากดังนั้นผู้ที่RESUMEอาจรับรองหมายเลขบรรทัดหลักเดียวเพื่อให้NEXTคำสั่งที่สองของคุณสั้นที่สุดเท่าที่จะทำได้ หากเป็นไปได้พยายามทำให้มันคำนวณRESUMEที่จะเกิดขึ้นตามธรรมชาติในโค้ดของคุณ (เป็นที่ยอมรับว่าเป็นเรื่องยากเนื่องจากเป็นเรื่องยากที่จะปรากฏในโค้ด "โฟลว์ปกติ" แทนที่จะเป็นNEXTed) ดังนั้นราคาเพียงอย่างเดียวคือหมายเลขบรรทัด คุณจะต้องใช้ตัวแปรบูลเดียวสำหรับทุกเหล่าNEXTs; ฉันทามติสากลที่นี่คือการใช้.5ส่วนใหญ่เพราะมันเป็นตัวแปรที่ห้องสมุดมาตรฐานใช้สำหรับค่าตอบแทนบูลีน

อีกวิธีหนึ่งก็เป็นไปได้ที่จะใช้ประโยชน์จากเอกสารที่ไม่มีเอกสาร (underdocumented ทางเทคนิคเพราะฉันเล็ดลอดลงในเอกสาร INTERCAL เมื่อฉันสังเกตเห็น) ของห้องสมุดมาตรฐาน เนื่องจากตำแหน่งศูนย์กลางสำหรับ a RESUMEมีประโยชน์ดังนั้นไลบรารีมาตรฐานจึงใช้หนึ่งภายใน หมายเลขบรรทัดใน INTERCAL อยู่ทั่วโลก (กับ namespacing ประชุม แต่ที่สามารถหักถ้าคุณรู้ว่าสิ่งที่คุณทำ) เพื่อให้คุณสามารถNEXTขวาเข้า internals ห้องสมุดมาตรฐานถ้าคุณต้องการและโดยเฉพาะอย่างยิ่งความสามารถNEXTในการของสถานที่ตั้งที่อยู่ใจกลางเมือง RESUME . สิ่งนี้ได้รับความนิยมอย่างมากในรหัส INTERCAL ที่มีอยู่ซึ่งการแทนที่ไลบรารีมาตรฐานมักจะต้องนำไปใช้เพื่อหลีกเลี่ยงการทำลายโปรแกรมที่มีอยู่

บรรทัดคำถามคือ (อย่างแท้จริงหรือมีประสิทธิภาพขึ้นอยู่กับการใช้งาน):

(1001) DO RESUME .5

เหตุผลหลักที่จะไม่ใช้นี่คือหมายเลขบรรทัดที่ยาว ถ้าคุณต้องการทำ INTERCAL-72 สไตล์จำนวนมากถ้าสร้างมันจะเป็นการดีกว่าถ้าคุณใช้ของคุณเองเพื่อให้ตัวเลขนั้นสั้นลง

แน่นอนคุณสามารถรวมเทคนิคการเขียนบางอย่างเช่น

(9)DO(1001)NEXT

ซึ่งมีความยาวเพียงเล็กน้อยเท่านั้น

(9)DORESUME.5

และมีประโยชน์ที่บูลีนจะกลายเป็น#2และ#3(ซึ่งยากต่อการอ่าน แต่โดยทั่วไปจะสร้างได้ง่ายกว่า) ที่จริงแล้วมันอาจจะคุ้มค่าที่จะใส่รหัสพิเศษในการจัดการ#0และ#1ถ้าคุณจะต้องใช้จำนวนมาก (แต่การคำนวณCOME FROMอาจจะทำงานได้ดีขึ้นในกรณีนี้เว้นแต่ความต้องการของคุณจะแปลกมาก)


2

INTERCAL ไม่ได้ระบุลำดับความสำคัญ แต่ก็ไม่ได้มีข้อผิดพลาดในความสำคัญที่ไม่ชัดเจน

การแสดงออกเช่น

#1$#2~#3

คลุมเครือและอาจหมายถึง

'#1$#2'~#3

หรือ

#1$'#2~#3'

ข้อมูลจำเพาะของ INTERCAL ทำให้ไม่ชัดเจนซึ่งตั้งใจและโดยทั่วไปไม่มีมาตรฐาน (แม้ว่า C-INTERCAL และ CLC-INTERCAL พยายามที่จะจับคู่กันในกรณีที่ง่ายกว่า) ที่กล่าวว่าต้นฉบับไม่ถูกต้อง ; มันคลุมเครือและฉันจะไม่แนะนำให้ใช้ในรหัสการผลิต (แต่จากนั้นฉันจะไม่แนะนำให้ใช้ INTERCAL ในรหัสการผลิต) แต่มันจะมีความหมายบางอย่างในคอมไพเลอร์ส่วนใหญ่

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


2

ใน C-INTERCAL ให้พิจารณาใช้ตัวย่อของรหัสย่อ CREATE

CREATEคำสั่งช่วยให้คุณสร้างไวยากรณ์ใหม่ สิ่งนี้มีประโยชน์อย่างยิ่งในการเล่นกอล์ฟเพราะจะทำให้คุณสามารถบอกชื่อสั้น นอกจากนี้คุณยังสามารถใช้เพื่อ "กำหนดฟังก์ชั่น" ได้อย่างมีประสิทธิภาพผ่านการสร้างโอเปอเรเตอร์ใหม่ (ซึ่งมีข้อได้เปรียบอย่างมากที่ช่วยให้คุณสามารถเรียกใช้ฟังก์ชั่นนี้ในระหว่างการแสดงออก)

ค่าติดตั้งที่นี่ค่อนข้างสูง แต่ถ้ามีสิ่งก่อสร้างที่คุณใช้บ่อยการประดิษฐ์ไวยากรณ์ให้สั้นลงอาจเป็นความคิดที่ดี

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