เคล็ดลับสำหรับการเล่นกอล์ฟในภาษาการเขียนโปรแกรมของเช็คสเปียร์


43

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

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


17
ฉันไม่แน่ใจว่าคุณสามารถเล่นกอล์ฟ SPL ได้ SPL มีความละเอียดมากจนฉันเกือบรู้สึกว่าคำถามนี้ต้องการแท็กการหมุนรหัส : P
Alex A.

คุณไม่สามารถตีกอล์ฟ SPL ได้ อย่างน้อยเพื่อความรู้อ่อนแอของฉันเกี่ยวกับตำนาน Shakesperian ...
Rodolfo Dias

@RodolfoDias: อ่อนแอหรือไม่ ฉันคิดว่าคุณเป็นนักวิชาการเชกสเปียร์ประจำใน PPCG
Alex A.

8
@AlexA ซึ่งอาจไม่ใช่สิ่งที่ดี: มันหมายถึงว่าฉันบ้าพอที่จะลองและเข้าใจ SPL :-)
Rodolfo Dias

@AlexA Sp สามารถทำได้ ...
Conor O'Brien

คำตอบ:


18

(ดี ... เนื่องจากนี่เป็นภาษาที่ฉันใช้1ฉันรู้สึกว่าฉันจำเป็นต้องเพิ่มบางสิ่งที่นี่)

ใช้ชื่อตัวแปรแบบสั้น

ใช่ใช่ใช่นั่นเป็นมาตรฐานที่ดีสำหรับโค้ดกอล์ฟคุณเพียงแค่ใช้ชื่อตัวแปรที่มีความยาวหนึ่งตัวอักษรไม่มีข่าวที่นี่ หรือว่ามี เนื่องจาก Chaps ที่สร้าง SPL นั้นแปลกประหลาดพอที่จะไม่อนุญาตให้มีชื่อตัวแปรภาษา: พวกเขาจะต้องมาจากบทละครของ Shakesperian ซึ่งในแง่ของความยาวของตัวละครนั้นเป็นความเจ็บปวดในราชวงค์ tush - แต่ถ้าคุณเข้ารหัสใน SPL คุณรู้อยู่แล้วว่า ดังนั้นคำแนะนำของฉันคือการใช้ตัวอักษรที่มีชื่อสั้น ๆ เช่นAjax , Ford , PageหรือPuckแทนที่จะเป็นThe Archbishop of Canterburyเป็นต้น

นั่นคือทั้งหมดที่ฉันได้รับฉันกลัว


1 - เนื่องจากทักษะ Java ของฉันเทียบเท่ากับของทารกแรกเกิด


1
รายชื่อตัวแปร
user202729

13

(หลังจากทำหน้าที่ก่อนหน้านี้ฉันเพิ่งจำบางสิ่ง)

เลือกรหัสของคุณอย่างระมัดระวัง

ตัวอย่างเพื่อลองและอธิบายความหมายนี้

Ajax:
 You are as warm as a big red rich fair cute bold cat!

และ

Ajax:
 Thou art as blossoming as an embroidered trustworthy bottomless peaceful charming handsome chihuahua!

สร้างผลลัพธ์ที่เหมือนกันแน่นอนซึ่งทำให้ตัวละครที่ถูกพูดเพื่อรับค่า 64 (เนื่องจากสมมติว่าคุณอ่านการต่อสู้ที่ยาวนานของฉันกับ SPLคุณจะรู้ว่าทั้งสองเส้นมีค่าเท่ากับ 2 * 2 * 2 * 2 * 2 * 2 * 2 1); อย่างไรก็ตามอันแรกมี 59 ไบต์ในขณะที่อันที่สองมีไบต์เท่ากับ 107

แต่ถึงกระนั้นก็ยังไม่มีใครที่จะได้รับความบ้าคลั่งพอที่จะเข้าสู่ความท้าทายกับ SPL ดังนั้น ...


10
คุณสามารถใช้คำคุณศัพท์ที่เหมือนกันหลายครั้งในคำอธิบายได้หรือไม่? เช่นกำลังa big big big big big big catบันทึกอีก 4 ไบต์? ฉันรู้ว่ามันทำลายงานศิลปะ ... แต่นี่คือรหัสกอล์ฟ ;)
DLosc

@DLosc จากสิ่งที่ฉันได้เห็นไม่มีอะไรที่ห้ามให้คุณทำ ดังนั้น ... คุณเป็นนักกอล์ฟที่ดีกว่าฉัน ^ _ ^
Rodolfo Dias

1
เสียงกระแอม อย่าเรียกว่า Robert Fraser วิกลจริต codegolf.stackexchange.com/a/69360/43394
wizzwizz4

12

ตัวเลขโรมันใด ๆ คือหมายเลขฉากที่ถูกต้อง

หมายความว่าแทนที่จะเป็น:

Scene I
Scene II
Scene III
Scene IV
Scene V

คุณทำได้:

Scene L
Scene I
Scene C
Scene X
Scene V

เป็นDที่ถูกต้องตัวเลขโรมัน? IIRC มันคือ 500 (แต่ฉันไม่แน่ใจว่ามันใช้ได้ใน SPL)
Giuseppe

@Giuseppe ฉันไม่เข้าใจว่าทำไมคุณไม่ตรวจสอบ แต่ล่าม SPL อย่างเป็นทางการรองรับ M, C, D, X, L, I และ V
NieDzejkob

10

ลบคำที่ไม่ต้องการ

ดูที่นี่ (การแทรกบรรทัดใหม่และช่องว่างสำหรับการอ่าน):

Puck:You is a big big cat!
     Open your heart!
Ajax:Be you worse than I?
     If so, let us return to Scene V!
     If not, you is a cat.
     You is the sum of I and the sum of a cat and you
     Speak thy mind!
     [Exeunt]

ดูน่ารักใช่มั้ย นี่คือรูปแบบที่ไม่สามารถเข้าใจได้มากยิ่งขึ้น:

Puck:You big big cat!
     Open heart!
Ajax:Be you worse I?
     If so, let us Scene V!
     If not, you cat.
     You is the sum of I the sum of a cat you
     Speak mind!

สำหรับการอ้างอิงต่อไปนี้เป็นรายการของคำที่ถอดออกได้ง่ายจากรหัส:

  • พูดถึงความคิดของคุณ -> พูดกับเจ้า
  • เปิดหัวใจของคุณ -> เปิดหัวใจ *
  • ฟังหัวใจของเจ้า -> ฟัง tothy
  • เปิดใจของคุณ -> เปิดใจ *
  • คุณเป็นแมว -> คุณเป็นแมว *
    • ใช้กับค่าคงที่เช่นbig catเท่านั้นมิฉะนั้นคุณยังคงต้องการ 'เป็น'
  • ให้เรากลับไปที่ -> ให้เรา
  • เป็น X [op] มากกว่า Y หรือไม่ -> Be X [op] Y หรือไม่
  • คุณคือ [op] ของ X และ Y -> คุณคือ [op] ของ X Y
  • [Exeunt] -> (ลบออกทั้งหมด)

ตำนาน:

  • XและYมีค่าคงที่เช่นcat, Iหรือyou
  • [op]มีการดำเนินงานชอบnicer,the sum of
  • *หมายถึงคุณสามารถลบเครื่องหมายวรรคตอนออกได้หากเป็นประโยคสุดท้ายของการเล่น

ถ้าฉันเจอคนอื่นฉันจะเพิ่มเข้าไปในรายการ

สำหรับการอ้างอิงเพิ่มเติมต่อไปนี้เป็นส่วนหัวที่สั้นที่สุดเพื่อเริ่มโปรแกรม:

,.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]

ลองออนไลน์!

เพิ่มเพจและฟอร์ดเป็นอักขระพิเศษตามความจำเป็น


1
หากคุณต้องการตัวละครมากขึ้นมีรายการที่นี่
NieDzejkob

: | striped down
ASCII เท่านั้น

6

ใช้คำสั้น ๆ

ดังนั้นที่นี่พวกเขาคือ:

  • ใช้aแทนanหรือtheยกเว้นการแสดงออกและที่คล้ายกันเพราะพวกเขาจะไม่ทำงานกับthe sum ofa
  • การใช้งานam, beหรือisแทนหรือareart
  • ใช้Iแทนหรือmemyself
  • ใช้youแทนthee, thou, หรือthyselfyourself
  • ใช้bigสำหรับคำคุณศัพท์
  • ใช้catสำหรับตัวเลขบวก
  • ใช้pigสำหรับจำนวนลบ
  • ใช้zeroสำหรับศูนย์
  • ใช้worseสำหรับA < B(แทนsmallerหรือpunier)
  • ใช้nicerสำหรับA > B(แทนbetter, bigger, fresher, friendlierหรือjollier)
  • ชื่อตัวละคร:
    • 4 ตัวอักษร: Ajax, Ford, Page, Puck
    • 5 ตัวอักษร: Egeus, Helen, Julia, Lucio, Mopsa, ปารีส, หยิก, Priam, Regan, Robin, Romeo, Timon, Titus, Venus, Viola
    • 6 ตัวอักษร: Adonis, Aegeon, Alonso, Angelo, Arthur, Banquo, Bianca, Brutus, Cicero, Dorcas, Duncan, Emilia, Fenton, หมู่บ้านเล็ก ๆ แห่ง Hecate, Hector, Helena, Hermia, Imogen, Juliet, Oberon, Olivon, Orsino , Portia, Thaisa, Thurio, Tybalt
    • 7 ตัวอักษร: Adriana, Aemilia, Agrippa, อันโตนิโอ, Capulet, Cassius, Claudio, Dionyza, Escalus, Goneril, Horatio, Leonato, ลูเซียน่า, Macbeth, Macduff, Malcolm, Mariana, Miranda, Octavia, Ophelia, ออร์เทลโล, โปรตีน , Publius, ตื้น, Shylock, เรียว, Solinus, เธเซอุส, Titania, Troilus, Ulysses
    • 8 ตัวอักษร: Achilles, เบียทริซ, เบเนดิก, Benvolio, Claudius, Cordelia, Cressida, Dogberry, Don John, Falstaff, เกอร์ทรูด, เฮอร์โมนี, อิสซาเบลลา, ไลซันเดอร์, Mercutio, Perague, Polonius, Pompeius, Rosalind, Stephano
    • 9 ตัวอักษร: Agamemnon, Antiochus, Autolycus, Balthazar, Brabantio, คาสซานดรา, คลีโอพัตรา, คอร์เนเลีย, คอร์เนเลีย, เดเมตริอุส, เดสเดโมนา, Donalbain, ดอนเปโดร, เฟอร์ดินานด์, ฟรานซิสโก, ฮิปโปลิตา
    • 10 ตัวอักษร: Andromache, Cymberline, Fortinbras, Friar John, King Henry
    • 11 ตัวอักษร: มาร์คแอนโทนี
    • 12 ตัวอักษร: หมอ Caius, King Richard, Lady Capulet, Lady Macbeth, Lady Macduff, Prince Henry, Queen Elinor
    • 13 ตัวอักษร: John of Gaunt, Julius Caesar, Lady Montague, Mistress Ford, Mistress Page
    • 14 ตัวอักษร: Friar Laurence, Apothecary
    • 15 ตัวอักษร: Christopher Sly, Octavius ​​Caesar
    • ตัวอักษร 17 ตัว: John of Lancaster, Mistress Overdone, The Duke of Milan
    • ตัวอักษร 18 ตัว: ดยุคแห่งเวนิส
    • 24 ตัวอักษร: เจ้าอาวาสแห่งเวสต์มินสเตอร์
    • 28 ตัวอักษร: อาร์คบิชอปแห่งแคนเทอร์เบอรี
    • หากคุณต้องการมากขึ้นคุณควรพิจารณาใช้สแต็คของแต่ละอักขระอย่างแน่นอน

โปรดทราบว่าตัวละครที่มีหลายคำสามารถเว้นช่องว่างใด ๆ หลังจากชื่อของพวกเขา (จากส่วนปลายของ user202729 ) ดังนั้นพวกเขาจึงเหมาะสำหรับตัวอักษรที่มีเพียงหนึ่งคำ
Jo King

5

สามารถใช้ "ให้เรากลับไปยังฉาก X" แม้ว่าตัวละครที่กำลังพูดอยู่จะอยู่นอกเวที ดังนั้นแทนที่จะ:

Puck:Am I as fat as the sum of a big big big big big big cat and a cat?
Ajax:If not,let us return to scene III.
[Exit Puck]
[Enter Page]
Ajax:You is a big big big big big big cat.

คุณทำได้:

Puck:Am I as fat as the sum of a big big big big big big cat and a cat?
[Exit Puck]
[Enter Page]
Ajax:If not,let us return to scene III.You is a big big big big big big cat.

5

ลบช่องว่างที่ซ้ำซ้อน

นอกเหนือจากสิ่งเล็กน้อย (ช่องว่างที่อยู่ติดกันสองช่องซึ่งอยู่ติดกับเครื่องหมายวรรคตอนติดกับบรรทัดใหม่ตอนท้าย) (มีข้อยกเว้นบางประการ) พื้นที่หลังจากโทเค็นต่อไปนี้สามารถลบได้:

  • the sum of
  • let us
  • the ghost( เช่นนี้ ) (แต่ใครจะใช้ตัวละครนี้อยู่ดี)
  • if soและif not(ลบ,หลังจากนี้และไม่จำเป็นต้องเพิ่มพื้นที่ใดตัวอย่าง:. if solet usact I)
  • listen to( listen tothyทำงานได้เช่นนี้ )
  • และพื้นใด ๆ หลายคำราชสกุล

หมายเหตุ: นี่ไม่ได้ทำงานกับล่าม Perl อาจเป็นเพียงผลที่ไม่ได้ตั้งใจซึ่งเกิดจากพฤติกรรมการแยกวิเคราะห์ของ Flex "มาตรฐานภาษา"ไม่ชัดเจนเกี่ยวกับว่า


ได้เวลาย้อนกลับและแก้ไขคำตอบของฉัน ... หาดีมาก!
Jo King

นั่นเป็นข้อบกพร่องใน tokenizer หรือพฤติกรรมนั้นถูกกำหนดในภาษาหรือไม่?
Cœur

2
@Cœurดูการอัปเดต
user202729

5

คุณไม่จำเป็นต้องสลับผู้คนแบบมีเงื่อนไข

ตัวอย่างเช่น,

Ajax:Is you better than the sum of a fat fat fat fat cat and a fat cat?
Puck:If so,let us return to Scene I.

นานกว่า

Ajax:Is you better than the sum of a fat fat fat fat cat and a fat cat?If so,let us return to Scene I.

1
ขออภัย แก้ไข
Oliver Ni

4

แทนที่จะตั้งค่าย่อยให้เพิ่มค่าคงที่

You is the difference between I and a big cat.

นานกว่า

You is the sum of I and a big pig.

4

การกระโดดอาจสั้น

คุณสามารถใช้งานreturn toได้แม้ว่าฉากนั้นจะอยู่ข้างหน้าและในทางกลับกัน ในความเป็นจริงล่ามไม่ได้สนใจว่าคุณจะไม่สนใจมันเลย ซึ่งหมายความว่าทั้งสามข้อความนี้เทียบเท่า 100%:

Let us proceed to Scene X.
Let us return to Scene X.
Let us Scene X.

Jo King ( codegolf.stackexchange.com/a/164394/76162 ) พบว่า "ให้เราได้เห็นฉาก X" ก็เพียงพอแล้ว
Ed Wynn

@EdWynn ดีที่จะรู้ ฉันเขียนคำตอบใหม่เพื่อรวมสิ่งนี้
NieDzejkob


4

ใช้ฉากเดียวเท่านั้น

โดยปกติแล้วคุณไม่สามารถใช้ฉากแรกของการแสดงซ้ำได้เนื่องจากมันมี[Enter Ajax and Puck]สิ่งแรกเสมอ อย่างไรก็ตามคุณสามารถใช้คำนำหน้านี้[Exeunt]เพื่อให้สามารถนำฉากแรกของการเล่นมาใช้ซ้ำได้ [Exeunt]สั้นกว่าการประกาศฉากใหม่หนึ่งไบต์และการกระโดดไปที่การกระทำนั้นน้อยกว่าการกระโดดไปยังฉากหนึ่งไบต์

เช่นโปรแกรมแมวอย่างง่าย

,.Ajax,.Page,.Act I:.Scene I:.[Enter Page and Ajax]Scene V:.Ajax:Open mind!Speak thy!Let usScene V!

ลองออนไลน์!

ไปที่:

,.Ajax,.Page,.Act I:.Scene I:.[Exeunt][Enter Page and Ajax]Ajax:Open mind!Speak thy!Let usAct I!

ลองออนไลน์!



3

ใช้สมาร์ทเงื่อนไข

ตัวอย่างเช่นอย่าใช้

Ajax:Are you as good as or better than me?If so,let us return to Scene I.

แต่,

Ajax:Are you worse than me?If not,let us return to Scene I.

3

If (so|not) ไม่จำเป็นต้องทำตามการเปรียบเทียบทันที

Am I as big as you?You big big big big big cat.If so, you is the sum of you and a big big cat.

4
ในความเป็นจริงผลลัพธ์ของการเปรียบเทียบจะถูกเก็บเป็นธงและสามารถใช้ซ้ำ ๆ ในการเปลี่ยนฉากหรือข้ามหลาย ๆIf soภาพ สิ่งนี้มีประโยชน์ในการหลีกเลี่ยงการเปรียบเทียบซ้ำ!
Jo King

2

ใช้ค่าคงที่เพื่อเก็บจำนวนมาก

ตัวอย่างเช่นถ้าคุณมี

Ajax:You is a fat fat fat fat fat fat fat fat fat fat cat!
Puck:You is the sum of thyself and a fat fat fat fat fat fat fat fat fat fat cat
Ajax:You is the sum of the difference of me and thyself and a fat fat fat fat fat fat fat fat fat fat cat!

คุณสามารถประกาศบุคคลอื่นที่ด้านบนสุด

Ford,a fat fat fat fat fat fat fat fat fat fat cat.

และเปลี่ยนรหัสของคุณเป็น

Ajax:You is Ford.
Puck:You is the sum of thyself and Ford.
Ajax:You is the sum of the difference of me and thyself and Ford.

8
ล่ามอย่างเป็นทางการไม่สนับสนุนการประกาศค่าคงที่เช่นนั้น
NieDzejkob

2

Gotos ไม่ได้เป็นคำสั่งเดียวที่ใช้งานได้ If (so|not)

Am I as big as you?If so,you is the sum of you and a big big cat.If not,you is the sum of you and twice I.

2

ขึ้นบรรทัดใหม่ทั้งหมดจะถูกละเว้น

,.Ajax,.Puck,.Page,.Act:.Scene:.[Enter Ajax and Puck]Ajax:You Puck.[Exeunt]

2

ใช้<หรือ>แทน==

ไม่สามารถใช้ได้กับทุกสถานการณ์ แต่ค่อนข้างสั้นกว่าเล็กน้อย:

Puck == Ajax

Puck:Is I as bad as you?

Puck <Ajax หรือ Puck> Ajax

Puck:Is I worse you?
Puck:Is I nicer you?

สั้นลง 4 ไบต์สำหรับทั้งสอง!


2

คุณไม่จำเป็นต้องสิ้นสุดหรือ.!

ลองออนไลน์!

[นอกจากนี้ยังสามารถนำมาใช้ก่อน (ขอบคุณ jimmy23013)

,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:You cat[Exeunt]

ตัวอย่าง:

  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:You cat
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Open mind[Exeunt]

ไม่ทำงานใน:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](หลังจากนี้Scene {number}:) (อย่างไรก็ตามสิ่งนี้ใช้ได้ผลฉันไม่ทราบสาเหตุ)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (และรุ่นที่สั้นกว่า)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (และรุ่นที่สั้นกว่า)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(เฉพาะหลังจากที่ว่างเปล่าRecall, Recall xหรือRecall@ฯลฯ ผลงาน)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(ไม่รวมmind)

สิ่งนี้ไม่สามารถใช้งานได้ในบางสถานการณ์ที่คุณได้ลบคำแล้วเช่นSpeak thyหรือLet us Scene I
โจคิง

2

ใช้ 'สองครั้ง' และคุณสมบัติการกระจาย

แทน:

You is the sum of a big big big big cat a big big big cat.

ใช้:

You is twice twice twice the sum of a big cat a cat.

วิธีนี้ช่วยประหยัด 2 ไบต์ต่อtwiceเนื่องจากการใช้ 2 ครั้งbigคือ 8 ไบต์ (มีช่องว่าง) และtwiceมีเพียง 6 ไบต์

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