99 (เด่นชัด "เก้าสิบเก้า") เป็นภาษาการเขียนโปรแกรมลึกลับใหม่ล่าสุด(เพื่อไม่ให้สับสนกับ99โน้ตตัวเอียง) งานของคุณในการท้าทายนี้คือการเขียนล่ามให้กับ99ที่สั้นที่สุด การส่งที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ Tiebreaker จะไปยังการส่งที่โพสต์ก่อน
เนื่องจากคำถามนี้มีความลึกมากกว่าปกติเล็กน้อยและฉันอยากเห็นคำตอบที่ดีฉันจะมอบรางวัล 250 ตัวแทนให้กับคำตอบที่ฉันโปรดปราน (ไม่จำเป็นต้องเป็นผู้ชนะ)
99 Spec
99เป็นภาษาที่จำเป็น แต่ละบรรทัดในโปรแกรม99 คำสั่งเดียวและในระหว่างการดำเนินการตัวชี้คำสั่งเริ่มต้นที่บรรทัดบนสุดและจะผ่านแต่ละบรรทัดถัดไปตามลำดับดำเนินการพวกเขาไปพร้อมกัน โปรแกรมจะสิ้นสุดลงเมื่อบรรทัดสุดท้ายถูกดำเนินการ คำสั่งไปที่อาจเปลี่ยนเส้นทางของตัวชี้คำสั่ง
ขึ้นบรรทัดใหม่พื้นที่และ 9
เป็นอักขระสามตัวเท่านั้นที่มีความสำคัญในโปรแกรม99 อักขระอื่น ๆ ทั้งหมดจะถูกละเว้นอย่างสมบูรณ์ นอกจากนี้ช่องว่างต่อท้ายในแต่ละบรรทัดจะถูกละเว้นและช่องว่างหลายช่องในแถวจะถูกอ่านเป็นหนึ่งช่องว่าง ("Newline" หมายถึงการเข้ารหัสตัวแบ่งบรรทัดทั่วไปไม่สำคัญว่าล่ามของคุณใช้ภาษาใด)
ดังนั้นโปรแกรมนี้:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
เหมือนกับโปรแกรมนี้:
9 99 9999
9 9
ตัวแปร
ตัวแปรใน99ทั้งหมดมีชื่อที่ถูก9
โยงอย่างน้อยหนึ่งรายการเข้าด้วยกัน ( 9+
ใน regex) ตัวอย่างเช่น9
,99
และ9999999999
เป็นตัวแปรที่แตกต่างกัน โดยธรรมชาติแล้วมีจำนวน จำกัด (ยกเว้นข้อ จำกัด ของหน่วยความจำ)
ค่าของตัวแปรแต่ละตัวเป็นจำนวนเต็มความแม่นยำที่ลงนามแล้ว โดยค่าเริ่มต้นแต่ละตัวแปรจะถูกกำหนดให้เป็นตัวแทนตัวเลขของตัวเอง ดังนั้นถ้ามันถูกกำหนดใหม่ค่าของตัวแปร9
คือหมายเลข 9 และค่าของตัวแปร99
คือหมายเลข 99 และอื่น ๆ คุณอาจคิดว่ามันเป็นการรักษาตัวแปรเป็นตัวเลขธรรมดาจนกว่าพวกมันจะถูกกำหนดอย่างชัดเจน
ฉันจะใช้V
เพื่ออ้างถึงชื่อตัวแปรโดยพลการด้านล่าง
ตัวอย่างของแต่ละคนV
จะถูกแทนที่ด้วย9
, 99
, 999
, 9999
ฯลฯ
งบ
มีห้าประเภทคำสั่งแตกต่างกันในมี99 แต่ละบรรทัดในโปรแกรม99มีคำสั่งเดียวทั้งหมด
ไวยากรณ์ที่อธิบายไว้ที่นี่ถือว่าอักขระที่ไม่เกี่ยวข้องทั้งหมดได้ถูกลบออกช่องว่างต่อท้ายทั้งหมดได้ถูกลบออกและลำดับทั้งหมดของช่องว่างหลายรายการถูกแทนที่ด้วยช่องว่างเดียว
1. ไม่มีการดำเนินงาน
บรรทัดว่างเป็นไม่-op มันไม่ทำอะไรเลย (นอกเหนือจากการเพิ่มตัวชี้คำสั่ง)
2. เอาท์พุท
V
ตัวแปรเดี่ยวV
บนบรรทัดพิมพ์ตัวแปรนั้นไปที่ stdout
หากV
มีจำนวนคี่9
's ( 9
, 999
ฯลฯ ) ดังนั้นค่าจำนวนเต็มV
หารด้วย 9 จะถูกพิมพ์ (ทศนิยม)
หากV
มีจำนวนเป็น9
's ( 99
, 9999
ฯลฯ ) อักขระ ASCII ที่มีรหัสV
หารด้วย 9 จะมีการพิมพ์ mod 128 (นั่นคือ(V / 9) % 128
ค่าตั้งแต่ 0 ถึง 127)
ตัวอย่าง : โปรแกรม
9
9999
1W
จะพิมพ์ บรรทัดแรกพิมพ์1
เพราะ 9/9 คือ 1. พิมพ์บรรทัดที่สองW
เพราะ 9999/9 คือ 1111 และ 1111 mod 128 เป็น 87 และ 87 W
เป็นรหัสอักขระสำหรับ
โปรดทราบว่าตัวแบ่งบรรทัดจะไม่ถูกพิมพ์ระหว่างโทเค็นเอาท์พุท \n
จะต้องพิมพ์อย่างชัดเจนเพื่อการขึ้นบรรทัด
3. อินพุต
V
ตัวแปรเดียวV
บนบรรทัดที่มีช่องว่างนำข้อมูลจาก stdin และเก็บไว้ในตัวแปรนั้น
หากV
มีจำนวนคี่จาก9
นั้นผู้ใช้อาจพิมพ์จำนวนเต็มใด ๆ ที่ลงนามและV
จะถูกตั้งค่าเป็น 9 เท่าของค่านั้น
หากV
มีจำนวนเท่า9
กันผู้ใช้อาจพิมพ์ด้วยอักขระ ASCII ใดก็ได้และV
จะถูกตั้งค่าเป็น 9 เท่าของรหัสอักขระ
ตัวอย่าง : กำหนด-57
และA
เป็นอินพุตโปรแกรมนี้
9
9
99
99
-57A
จะเอาท์พุท ภายในตัวแปร9
จะมีค่า -513 และ99
จะมีค่า 585
ล่ามของคุณอาจสันนิษฐานว่าอินพุตมีความถูกต้องทางไวยากรณ์เสมอ
4. การมอบหมาย
ข้อความนี้อาจยาวโดยพลการ มันเป็นตัวแปรสองตัวหรือมากกว่าในบรรทัดคั่นด้วยช่องว่าง:
V1 V2 V3 V4 V5 ...
สิ่งนี้กำหนดให้กับผลรวมของดัชนีที่มีค่าเท่ากันลบด้วยผลรวมของดัชนีที่มีคี่ (ไม่รวม) การบ้านเป็นค่าไม่ใช่การอ้างอิงV1
V
V
V1
มันสามารถแปลเป็นภาษาส่วนใหญ่เป็น V1 = V2 - V3 + V4 - V5 + ...
มันอาจจะแปลในภาษามากที่สุด
ดังนั้นหากมีเพียงสองตัวแปรนั่นคือการกำหนดปกติ:
V1 V2
→ V1 = V2
หากมีสามข้อก็เป็นการลบ:
V1 V2 V3
→ V1 = V2 - V3
และเครื่องหมาย+
/ -
ยังคงสลับไปมาด้วยตัวแปรเพิ่มเติมแต่ละตัว:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
ตัวอย่าง : โปรแกรมนี้จะแสดงผล1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. ไปที่ (กระโดดถ้าศูนย์ทั้งหมด)
ข้อความนี้อาจยาวโดยพลการ มันเป็นตัวแปรสองตัวหรือมากกว่าในบรรทัดคั่นด้วยช่องว่างโดยมีช่องว่างนำหน้า :
V1 V2 V3 V4 V5 ...
หากค่าบางอย่างนอกเหนือจากนั้นไม่ใช่ค่าศูนย์ฟังก์ชันจะทำงานเหมือนกับไม่มีค่า ตัวชี้คำสั่งถูกย้ายไปยังบรรทัดถัดไปตามปกติV1
หากทั้งหมดของค่าที่นอกเหนือจากการเป็นศูนย์แล้วชี้คำสั่งถูกย้ายไปยังเส้นจำนวน เส้นถูกทำดัชนีเป็นศูนย์ดังนั้นถ้าเป็นศูนย์ตัวชี้จะย้ายไปที่บรรทัดบนสุด โปรแกรมจะยุติ (ปกติไม่มีข้อผิดพลาด) หากเป็นลบหรือใหญ่กว่าดัชนีที่เป็นไปได้สูงสุด (จำนวนบรรทัดลบหนึ่ง)V1
V1
V1
V1
โปรดทราบว่าไม่หารด้วย 9 ที่นี่ และเนื่องจากมันเป็นไปไม่ได้ที่จะมีตัวแปรเป็นค่าที่ไม่ใช่ตัวคูณของ 9 เพียงแค่หมายเลขบรรทัดที่เป็นทวีคูณของ 9 เท่านั้นที่สามารถข้ามไปได้V1
ตัวอย่าง:
โปรแกรมนี้จะพิมพ์1
ตลอดไป:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
โปรแกรมนี้
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
จะส่งออกตัวเลข 11 ถึง 1 ตามลำดับการลดลงล้อมรอบด้วยG
's:
G11G10G9G8G7G6G5G4G3G2G1G
รายละเอียดเพิ่มเติม
ล่ามในอุดมคติจะเรียกใช้จากบรรทัดคำสั่งด้วยชื่อไฟล์โปรแกรม99เป็นอาร์กิวเมนต์ I / O จะทำทันทีในบรรทัดคำสั่ง
อย่างไรก็ตามคุณอาจเพียงแค่เขียนฟังก์ชั่นล่ามที่ใช้ในโปรแกรมเป็นสตริงเช่นเดียวกับรายการโทเค็นอินพุต (เช่น["-57", "A"]
) ฟังก์ชั่นควรพิมพ์หรือคืนค่าสตริงออก
วิธีที่แตกต่างกันเล็กน้อยในการใช้ล่ามและการจัดการ I / O นั้นใช้ได้ถ้าตัวเลือกเหล่านี้เป็นไปไม่ได้ในภาษาของคุณ
โบนัส:เขียนอะไรเจ๋ง ๆ ใน99และฉันยินดีที่จะใส่ไว้ในโพสต์นี้เป็นตัวอย่าง
- นี่เป็น Pastebinของเรียบร้อย "99 ขวดเบียร์" โปรแกรมจากคำตอบของ Mac
หวังว่าคุณจะสนุกกับการท้าทายที่99 ของฉัน ! : D