Mẹo chơi gôn trong Ngôn ngữ lập trình Shakespeare


43

Bạn có lời khuyên chung nào cho việc chơi golf trong Ngôn ngữ lập trình Shakespeare? Tôi đang tìm kiếm những ý tưởng có thể được áp dụng cho các vấn đề về golf-code và ít nhất cũng hơi cụ thể đối với SPL (ví dụ: "xóa bình luận" không phải là một câu trả lời).

Xin vui lòng gửi một lời khuyên cho mỗi câu trả lời.


17
Tôi không chắc chắn rằng bạn có thể chơi golf SPL. SPL dài dòng đến nỗi tôi gần như cảm thấy câu hỏi này cần thẻ trolling mã. : P
Alex A.

Bạn không thể chơi golf SPL. Ít nhất, theo hiểu biết yếu ớt của tôi về truyền thuyết Shakesperian ...
Rodolfo Dias

@RodolfoDias: Feeble? Tôi nghĩ bạn là học giả Shakespeare thường trú trên PPCG.
Alex A.

8
@AlexA. Điều này có thể không phải là một điều tốt: nó chỉ có nghĩa là tôi đủ điên rồ để thử và hiểu SPL :-)
Rodolfo Dias

@AlexA. Sp có thể làm điều đó ...
Conor O'Brien

Câu trả lời:


18

(Chà ... vì đây là ngôn ngữ được chấp nhận của tôi 1 , tôi cảm thấy như mình bắt buộc phải thêm một cái gì đó vào đây)

Sử dụng tên biến ngắn

Yeah, yeah, yeah, đó là tiêu chuẩn khá để chơi golf, bạn chỉ cần sử dụng tên biến có độ dài một chữ cái, không có tin tức nào ở đây. Hay là có? Bởi vì các mánh khóe tạo ra SPL đủ kỳ quặc để không cho phép bất kỳ tên nào cho các biến ngôn ngữ của chúng: chúng phải đến từ các vở kịch của Shakesperian, về mặt độ dài ký tự, là một nỗi đau trong trò chơi hoàng gia - nhưng, nếu bạn đang viết mã trong SPL , Bạn đã biết điều đó. Vì vậy, lời khuyên của tôi sẽ là sử dụng các ký tự có tên ngắn, như Ajax , Ford , Page hoặc Puck , thay vì The Archbishop of Canterbury , ví dụ.

Đó là tất cả những gì tôi có, tôi sợ.


1 - vì các kỹ năng Java của tôi tương đương với các kỹ năng của trẻ sơ sinh.



13

(sau khi làm cái trước, tôi chỉ nhớ một vài điều)

Chọn mã của bạn một cách cẩn thận

Một ví dụ, để thử và giải thích điều này có nghĩa là gì.

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!

tạo ra kết quả chính xác giống nhau, làm cho nhân vật được nói là giả sử giá trị 64 (vì giả sử bạn đã đọc trận chiến dài của tôi với SPL , bạn biết rằng cả hai dòng đều tương đương với 2 * 2 * 2 * 2 * 2 * 2 * 1); tuy nhiên, cái đầu tiên có 59 byte, trong khi cái thứ hai có số byte là 107.

Tuy nhiên, không ai sẽ bị mất trí đủ để tham gia một thử thách với SPL, vì vậy ...


10
Bạn có thể sử dụng cùng một tính từ nhiều lần trong một mô tả? Ví dụ a big big big big big big cat, tiết kiệm thêm 4 byte? Tôi biết nó phá hỏng tính nghệ thuật ... nhưng đây là mã golf. ;)
DLosc

@DLosc, từ những gì tôi đã thấy, không có gì cấm bạn làm điều đó. Vậy ... bạn là người chơi golf giỏi hơn tôi ^ _ ^
Rodolfo Dias

1
À. Đừng gọi Robert Fraser mất trí. codegolf.stackexchange.com/a/69360/43394
wizzwizz4

12

Bất kỳ số La Mã nào là số cảnh hợp lệ

Điều đó có nghĩa là, thay vì:

Scene I
Scene II
Scene III
Scene IV
Scene V

Bạn có thể làm:

Scene L
Scene I
Scene C
Scene X
Scene V

Dmột chữ số La Mã hợp lệ? IIRC, nó là 500 (nhưng tôi không chắc nó có hợp lệ trong SPL không)
Giuseppe

@Giuseppe Tôi không hiểu tại sao bạn không kiểm tra điều đó, nhưng trình thông dịch SPL chính thức hỗ trợ M, C, D, X, L, I và V.
NieDzejkob

10

Xóa những từ không cần thiết

Nhìn vào điều này (chèn dòng mới và khoảng trắng để dễ đọc):

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]

Trông golf khá nhỉ? Đây là một hình thức thậm chí còn khó hiểu hơn:

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!

Để tham khảo, đây là danh sách các từ dễ dàng tháo rời khỏi mã:

  • Nói lên suy nghĩ của bạn -> Nói với bạn
  • Mở lòng -> Mở lòng *
  • Lắng nghe trái tim của bạn -> Nghe tothy
  • Mở tâm trí của bạn -> Mở tâm trí *
  • Bạn là một con mèo -> Bạn mèo *
    • Chỉ áp dụng cho các hằng số như big cat, nếu không, bạn vẫn cần 'là'
  • Hãy để chúng tôi trở lại -> Hãy để chúng tôi
  • Được X [op] hơn Y? -> Được X [op] Y?
  • Bạn là [op] của X và Y -> Bạn là [op] ofX Y
  • [Exe] -> (đã xóa hoàn toàn)

Huyền thoại:

  • XYlà hằng số như cat, Ihoặcyou
  • [op]là các hoạt động như nicer,the sum of
  • * có nghĩa là bạn có thể xóa dấu câu nếu đó là câu cuối cùng của vở kịch

Nếu tôi gặp bất kỳ người nào khác, tôi sẽ thêm nó vào danh sách.

Để tham khảo thêm, đây là tiêu đề ngắn nhất để bắt đầu một chương trình:

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

Hãy thử trực tuyến!

Thêm Trang và Ford là ký tự phụ nếu cần.


1
Nếu bạn cần nhiều nhân vật hơn nữa, có một danh sách ở đây
NieDzejkob

: | sọc xuống
ASCII-chỉ

6

Sử dụng từ ngắn

Vì vậy, đây là:

  • Sử dụng athay vì anhoặc the, ngoại trừ các biểu thức the sum ofvà tương tự, vì chúng sẽ không hoạt động với a.
  • Sử dụng am, behoặc isthay vì arehoặc art.
  • Sử dụng Ithay vì mehoặc myself.
  • Sử dụng youthay vì thee, thou, thyselfhoặc yourself.
  • Sử dụng bigcho tính từ.
  • Sử dụng catcho số dương.
  • Sử dụng pigcho số âm.
  • Sử dụng zerocho số không.
  • Sử dụng worsecho A < B(thay vì smallerhoặc punier).
  • Sử dụng nicercho A > B(thay vì better, bigger, fresher, friendlierhoặc jollier).
  • Tên nhân vật:
    • 4 chữ cái: Ajax, Ford, Trang, Puck
    • 5 chữ cái: Egeus, Helen, Julia, Lucio, Mopsa, Paris, Pinch, Priam, Regan, Robin, Romeo, Timon, Titus, Venus, Viola
    • 6 chữ cái: Adonis, Aegeon, Alonso, Angelo, Arthur, Banquo, Bianca, Brutus, Cicero, Dorcas, Duncan, Emilia, Fenton, Hamlet, Hecate, Hector, Helena, Hermia, Imogen, Juliet, Lennox, Oberon , Portia, Thaisa, Thurio, Tybalt
    • 7 chữ cái: Adriana, Aemilia, Agrippa, Antonio, Capulet, Cassius, Claudio, Dionyza, Escalus, Goneril, Horatio, Leonato, Luciana, Macbeth, Macduff, Malcolm, Mariana, Miranda, Octavia, Ophelia, Orlando , Publius, Nông, Shylock, mảnh mai, Solinus, Theseus, Titania, Troilus, Ulysses
    • 8 chữ cái: Achilles, Beatrice, Benedick, Benvolio, Claudius, Cordelia, Cressida, Dogberry, Don John, Falstaff, Gertrude, Hermonie, Isabella, Lysander, Mercutio, Montague, Pericles, Polonius, Pompeius
    • 9 chữ cái: Agamemnon, Antiochus, Autolycus, Balthazar, Brabantio, Cassandra, Cleopatra, Cornelius, Demetrius, Desdemona, Donalbain, Don Pedro, Ferdinand, Francisca, Hippolyta, King John, King Lear
    • 10 chữ cái: Andromache, Cymberline, Fortinbras, Friar John, King Henry
    • 11 chữ cái: Mark Antony
    • 12 chữ cái: Bác sĩ Caius, Vua Richard, Phu nhân Capulet, Phu nhân Macbeth, Phu nhân Macduff, Hoàng tử Henry, Nữ hoàng Elinor
    • 13 chữ cái: John of Gaunt, Julius Caesar, Lady Montague, Mistress Ford, Trang Mistress
    • 14 chữ cái: Friar Laurence, The Apothecary
    • 15 chữ cái: Christopher Sly, Octavius ​​Caesar
    • 17 bức thư: John of Lancaster, Mistress Overdone, Công tước Milan
    • 18 chữ cái: Công tước Venice
    • 24 chữ cái: Trụ trì Westminster
    • 28 chữ cái: Tổng Giám mục Canterbury
    • Nếu bạn thực sự cần nhiều hơn, bạn chắc chắn nên xem xét sử dụng ngăn xếp của mỗi nhân vật.

Lưu ý rằng các ký tự nhiều từ có thể bỏ qua bất kỳ khoảng trắng nào sau tên của chúng (từ mẹo của người dùng202729 ), vì vậy chúng thích hợp hơn các ký tự chỉ có một từ
Jo King

5

Có thể sử dụng "cho phép chúng tôi quay lại cảnh X" ngay cả khi nhân vật được nói chuyện ở ngoài sân khấu. Vì vậy, thay vì:

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.

Bạn có thể làm:

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

Loại bỏ không gian dư thừa

Ngoài các khoảng cách nhỏ (hai khoảng trắng liền kề, liền kề với dấu chấm câu, liền kề với một dòng mới, ở cuối) (với một số ngoại lệ), có thể xóa khoảng trắng sau các mã thông báo sau:

  • the sum of
  • let us
  • the ghost( như thế này ) (nhưng ai sẽ sử dụng nhân vật này)
  • if soif not(xóa phần ,sau này và không cần thêm bất kỳ khoảng trắng nào. Ví dụ if solet usact I:)
  • listen to(vì vậy listen tothyhoạt động, như thế này )
  • và về cơ bản bất kỳ mã thông báo nhiều từ .

Lưu ý: Điều này không hoạt động với trình thông dịch Perl . Đây có lẽ chỉ là một hiệu ứng ngoài ý muốn gây ra bởi hành vi phân tích cú pháp của Flex. Các "tiêu chuẩn ngôn ngữ" là không rõ ràng về điều đó.


Đã đến lúc quay lại và chỉnh sửa một số câu trả lời của tôi ... Tìm rất hay!
Jo King

Đó có phải là lỗi trong mã thông báo hay hành vi đó được xác định trong ngôn ngữ không?
Cœur

2
@ Cœur Xem cập nhật.
dùng202729

5

Bạn không phải chuyển người trong điều kiện.

Ví dụ,

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.

dài hơn

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
GÌ sửa chữa
Oliver Ni

4

Thay vì trừ, thêm hằng số

You is the difference between I and a big cat.

dài hơn

You is the sum of I and a big pig.

4

Nhảy có thể ngắn hơn

Bạn có thể sử dụng return tongay cả khi cảnh phía trước và ngược lại. Trong thực tế, trình thông dịch thậm chí không quan tâm nếu bạn bỏ qua nó hoàn toàn. Điều này có nghĩa là ba tuyên bố này tương đương 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 ) đã thấy rằng "Hãy để chúng tôi Cảnh X" là đủ.
Ed Wynn

@EdWynn tốt để biết. Tôi viết lại câu trả lời để bao gồm điều này.
NieDzejkob


4

Chỉ sử dụng một cảnh

Thông thường, bạn không thể sử dụng lại cảnh đầu tiên của một hành động, vì nó luôn có [Enter Ajax and Puck]điều đầu tiên. Tuy nhiên, bạn có thể mở đầu điều này [Exeunt]để có thể sử dụng lại cảnh đầu tiên của vở kịch. [Exeunt]ngắn hơn một byte so với khai báo một cảnh mới và nhảy tới Act ít hơn hai byte so với nhảy tới Cảnh.

Vd: Một chương trình mèo đơn giản

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

Hãy thử trực tuyến!

Đến:

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

Hãy thử trực tuyến!


3

Sử dụng các từ ngắn hơn

Ví dụ:

Thythyselfngắn hơn youryourself.

Isngắn hơn are.

và nhiều hơn nữa...


3

Sử dụng điều kiện thông minh

Ví dụ: không sử dụng

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

Nhưng đúng hơn là

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

3

If (so|not) không phải ngay lập tức làm theo so sánh.

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
Trong thực tế, kết quả so sánh được lưu trữ dưới dạng cờ và có thể được sử dụng nhiều lần trong các chuyển cảnh hoặc qua một vài If sogiây. Điều này có thể hữu ích trong việc tránh lặp lại so sánh!
Jo King

2

Sử dụng hằng số để lưu trữ số lượng lớn

Ví dụ, nếu bạn có

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!

Bạn chỉ có thể tuyên bố một người khác ở đầu

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

và thay đổi mã của bạn thành

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
Thông dịch viên chính thức không hỗ trợ khai báo hằng như thế.
NieDzejkob

2

Gotos không phải là lệnh duy nhất có thể sử dụng với 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

Tất cả các dòng mới được bỏ qua

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

2

Sử dụng <hoặc >thay vì==

Không áp dụng cho mọi tình huống, nhưng nó ngắn hơn một chút:

Puck == Ajax

Puck:Is I as bad as you?

Puck <Ajax hoặc Puck> Ajax

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

4 byte ngắn hơn cho cả hai!


2

Bạn không cần kết thúc .hay !.

Hãy thử trực tuyến!

Điều này cũng có thể được sử dụng trước khi a [. (cảm ơn tháng sáu năm 2013)

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

Ví dụ:

  • ,.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]

Không hoạt động trong:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](ngay sau đó Scene {number}:) (tuy nhiên điều này hoạt động, tôi không biết tại sao)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (và các biến thể ngắn hơn)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (và các biến thể ngắn hơn)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(chỉ sau khi trống Recall, Recall xhoặc Recall@vv hoạt động)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(không có mind)

Điều này không hoạt động trong một số trường hợp bạn đã xóa một từ, chẳng hạn như Speak thyhoặcLet us Scene I
Jo King

2

Sử dụng 'hai lần' và tài sản phân phối

Thay vì:

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

Sử dụng:

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

Điều này tiết kiệm 2 byte cho mỗi lần twicesử dụng biglà 8 byte (có khoảng trắng) và twicechỉ có 6 byte.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.