Kiat untuk bermain golf di Bahasa Pemrograman Shakespeare

43

Apa tips umum yang Anda miliki untuk bermain golf di The Shakespeare Programming Language? Saya mencari ide yang dapat diterapkan untuk masalah kode-golf dan yang juga setidaknya agak spesifik untuk SPL (mis. "Hapus komentar" bukan jawaban).

Silakan kirim satu tip per jawaban.

Loovjo
sumber
17
Saya tidak yakin Anda bisa bermain golf SPL. SPL sangat verbose sehingga saya hampir merasa pertanyaan ini membutuhkan tag trolling kode. : P
Alex A.
Anda tidak bisa bermain golf SPL. Setidaknya, setahu saya tentang pengetahuan Shakesperian yang lemah ...
Rodolfo Dias
@RodolfoDias: Feeble? Saya pikir Anda adalah sarjana Shakespeare penduduk di PPCG.
Alex A.
8
@AlexA. Yang mungkin bukan hal yang baik: itu hanya berarti saya cukup gila untuk mencoba dan memahami SPL :-)
Rodolfo Dias
@AlexA. Sp dapat melakukannya ...
Conor O'Brien

Jawaban:

18

(Yah ... karena ini adalah bahasa adopsi saya 1 , saya merasa seperti saya wajib menambahkan sesuatu di sini)

Gunakan nama variabel pendek

Ya, ya, ya, itu cukup standar untuk kode-golf, Anda hanya menggunakan nama variabel panjang satu huruf, tidak ada berita di sini. Atau ada? Karena bab yang menciptakan SPL cukup aneh untuk tidak mengizinkan nama apa pun untuk variabel bahasa mereka: mereka harus berasal dari drama Shakesperian yang, dalam hal panjang karakter, adalah masalah di royal tush - tetapi, jika Anda menulis dalam SPL , kamu sudah tahu itu. Jadi, saran saya adalah menggunakan karakter dengan nama pendek, seperti Ajax , Ford , Page atau Puck , bukan The Archbishop of Canterbury , misalnya.

Hanya itu yang saya dapatkan, saya khawatir.


1 - karena keterampilan Java saya sama dengan keterampilan bayi yang baru lahir.

Rodolfo Dias
sumber
1
Daftar nama variabel .
user202729
13

(setelah melakukan yang sebelumnya, saya baru ingat beberapa hal)

Pilih kode Anda dengan hati-hati

Contoh, untuk mencoba dan menjelaskan apa artinya ini.

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

dan

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

menghasilkan hasil yang sama persis, yang membuat karakter diucapkan untuk mengasumsikan nilai 64 (karena, dengan asumsi Anda membaca pertarungan panjang saya dengan SPL , Anda tahu bahwa kedua baris setara dengan 2 * 2 * 2 * 2 * 2 * 2 * 2 * 1); namun, yang pertama memiliki 59 byte, sedangkan yang kedua memiliki bytecount sebesar 107.

Namun, tidak ada yang akan cukup gila untuk memasuki tantangan dengan SPL, jadi ...

Rodolfo Dias
sumber
10
Bisakah Anda menggunakan kata sifat yang sama beberapa kali dalam deskripsi? Misalnya a big big big big big big cat, menghemat 4 byte lagi? Saya tahu itu merusak kesenian ... tapi ini kode golf. ;)
DLosc
@Dosc, dari apa yang saya lihat, tidak ada yang melarang Anda untuk melakukan itu. Jadi ... kamu pegolf yang lebih baik dariku ^ _ ^
Rodolfo Dias
1
Ahem. Jangan panggil Robert Fraser gila. codegolf.stackexchange.com/a/69360/43394
wizzwizz4
12

Setiap angka Romawi adalah nomor adegan yang valid

Itu berarti, bahwa alih-alih:

Scene I
Scene II
Scene III
Scene IV
Scene V

Anda dapat melakukan:

Scene L
Scene I
Scene C
Scene X
Scene V
NieDzejkob
sumber
Apakah Dangka Romawi yang valid? IIRC, ini 500 (tapi saya tidak yakin apakah itu valid di SPL)
Giuseppe
@ Giuseppe Saya tidak mengerti mengapa Anda tidak hanya memeriksanya, tetapi penerjemah SPL resmi mendukung M, C, D, X, L, I dan V.
NieDzejkob
10

Hapus kata-kata yang tidak dibutuhkan

Lihat ini (menyisipkan baris baru dan spasi putih untuk dibaca):

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]

Terlihat cukup golf ya? Berikut ini adalah bentuk yang lebih tidak terpahami:

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!

Untuk referensi, berikut adalah daftar kata-kata yang mudah dilepas dari kode:

  • Katakan pikiranmu -> Bicaralah
  • Buka hatimu -> Buka hati *
  • Dengarkan hatimu -> Dengarkan tothy
  • Buka pikiran Anda -> Buka pikiran *
  • Anda adalah kucing -> Anda kucing *
    • Hanya berlaku untuk konstanta seperti big cat, jika tidak, Anda masih perlu 'adalah'
  • Mari kita kembali ke -> Biarkan kami
  • Menjadi X [op] dari Y? -> Be X [op] Y?
  • Anda adalah [op] dari X dan Y -> Anda adalah [op] ofX Y
  • [Exeunt] -> (dihapus seluruhnya)

Legenda:

  • Xdan Yapakah konstanta suka cat, Iatauyou
  • [op]adalah operasi seperti nicer,the sum of
  • * berarti Anda dapat menghapus tanda baca jika itu adalah kalimat terakhir dari drama tersebut

Jika saya menemukan orang lain saya akan menambahkannya ke daftar.

Untuk referensi tambahan, inilah tajuk terpendek untuk memulai program:

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

Cobalah online!

Tambahkan Page dan Ford sebagai karakter tambahan yang diperlukan.

Jo King
sumber
1
Jika Anda membutuhkan lebih banyak karakter, ada daftar di sini
NieDzejkob
: | ditelanjangi
ASCII-hanya
6

Gunakan kata-kata pendek

Jadi inilah mereka:

  • Gunakan asebagai ganti anatau the, kecuali ekspresi the sum ofdan sejenisnya, karena mereka tidak akan bekerja dengan a.
  • Gunakan am, beatau isbukannya areatau art.
  • Gunakan Isebagai ganti meatau myself.
  • Gunakan youbukan thee, thou, thyselfatau yourself.
  • Gunakan biguntuk kata sifat.
  • Gunakan catuntuk angka positif.
  • Gunakan piguntuk angka negatif.
  • Gunakan zerountuk nol.
  • Gunakan worseuntuk A < B(bukan smalleratau punier).
  • Gunakan niceruntuk A > B(bukan better, bigger, fresher, friendlieratau jollier).
  • Nama karakter:
    • 4 huruf: Ajax, Ford, Page, Puck
    • 5 surat: Egeus, Helen, Julia, Lucio, Mopsa, Paris, Pinch, Priam, Regan, Robin, Romeo, Timon, Titus, Venus, Viola
    • 6 surat: Adonis, Aegeon, Alonso, Angelo, Arthur, Banquo, Bianca, Brutus, Cicero, Dorcas, Duncan, Emilia, Fenton, Hamlet, Hecate, Hector, Helena, Hermia, Imogen, Juliet, Lennox, Oberon, Olivia, Orsino , Portia, Thaisa, Thurio, Tybalt
    • 7 surat: Adriana, Aemilia, Agrippa, Antonio, Capulet, Cassius, Claudio, Dionyza, Escalus, Goneril, Horatio, Leonato, Luciana, Macbeth, Macduff, Malcolm, Mariana, Miranda, Octavia, Ophelia, Orlando, Othello, Pantino, Proteus , Publius, Dangkal, Shylock, Ramping, Solinus, Theseus, Titania, Troilus, Ulysses
    • 8 surat: Achilles, Beatrice, Benedick, Benvolio, Claudius, Cordelia, Cressida, Dogberry, Don John, Falstaff, Gertrude, Hermonie, Isabella, Lysander, Mercutio, Montague, Pericles, Polonius, Pompeius, Prospero, Rosalind, Stephano
    • 9 surat: Agamemnon, Antiokhus, Autolycus, Balthazar, Brabantio, Cassandra, Cleopatra, Cornelius, Demetrius, Desdemona, Donalbain, Don Pedro, Ferdinand, Francisca, Hippolyta, Raja John, King Lear, Lychorida, Sebastian, The Ghost, Valentine, Vincentio
    • 10 surat: Andromache, Cymberline, Fortinbras, Friar John, King Henry
    • 11 surat: Mark Antony
    • 12 surat: Dokter Caius, Raja Richard, Lady Capulet, Lady Macbeth, Lady Macduff, Pangeran Henry, Queen Elinor
    • 13 surat: John dari Gaunt, Julius Caesar, Lady Montague, Nyonya Ford, Nyonya Halaman
    • 14 surat: Friar Laurence, The Apothecary
    • 15 surat: Christopher Sly, Octavius ​​Caesar
    • 17 surat: John dari Lancaster, Overdone Nyonya, Adipati Milan
    • 18 surat: Duke of Venice
    • 24 surat: Kepala Biara Westminster
    • 28 surat: Uskup Agung Canterbury
    • Jika Anda benar-benar membutuhkan lebih banyak, Anda harus mempertimbangkan untuk menggunakan tumpukan setiap karakter.
NieDzejkob
sumber
Perhatikan bahwa karakter multi-kata dapat menghilangkan spasi apa pun setelah namanya (dari tip pengguna202729 ), jadi mereka lebih disukai karakter dengan hanya satu kata
Jo King
5

"Mari kita kembali ke adegan X" dapat digunakan bahkan jika karakter yang diajak bicara berada di luar panggung. Jadi alih-alih:

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.

Anda dapat melakukan:

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.
Robert Fraser
sumber
5

Hapus ruang yang berlebihan

Terlepas dari yang sepele (dua ruang yang berdekatan, berdekatan dengan tanda baca, berdekatan dengan baris baru, di akhir) (dengan beberapa pengecualian), ruang setelah token berikut dapat dihapus:

  • the sum of
  • let us
  • the ghost( seperti ini ) (tapi siapa yang akan menggunakan karakter ini)
  • if sodan if not(menghapus ,setelah ini, dan tidak perlu menambah ruang apapun Contoh:. if solet usact I)
  • listen to(begitu listen tothyberhasil, seperti ini )
  • dan pada dasarnya token multi-kata .

Catatan: Ini tidak bekerja dengan penerjemah Perl . Ini mungkin hanya efek yang tidak diinginkan yang disebabkan oleh perilaku parsing Flex. The "bahasa baku" tidak jelas tentang itu.

pengguna202729
sumber
Saatnya untuk kembali dan mengedit beberapa jawaban saya ... Sangat bagus temukan!
Jo King
Apakah itu bug di tokenizer, atau apakah perilaku itu didefinisikan dalam bahasa?
Cœur
2
@ Cœur Lihat pembaruan.
user202729
5

Anda tidak perlu mengubah orang dalam kondisi.

Sebagai contoh,

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.

lebih panjang dari

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.
Oliver Ni
sumber
1
SIAPA. pemasangan.
Oliver Ni
4

Alih-alih mengurangi, tambahkan konstanta

You is the difference between I and a big cat.

lebih panjang dari

You is the sum of I and a big pig.
NieDzejkob
sumber
4

Lompatan bisa lebih pendek

Anda dapat menggunakan return tobahkan jika adegan di depan, dan sebaliknya. Bahkan, penerjemah bahkan tidak peduli jika Anda menghilangkannya sepenuhnya. Ini berarti ketiga pernyataan ini setara 100%:

Let us proceed to Scene X.
Let us return to Scene X.
Let us Scene X.
NieDzejkob
sumber
Jo King ( codegolf.stackexchange.com/a/164394/76162 ) telah menemukan bahwa "Mari kita Scene X" sudah cukup.
Ed Wynn
@ Edwinynn ingin tahu. Saya menulis ulang jawaban untuk memasukkan ini.
NieDzejkob
6
Let usscene Xsudah cukup .
user202729
4

Gunakan hanya satu adegan

Biasanya, Anda tidak dapat menggunakan kembali adegan pertama suatu tindakan, karena selalu ada [Enter Ajax and Puck]hal pertama. Namun, Anda dapat mengawali dengan ini [Exeunt]agar dapat menggunakan kembali adegan pertama dari sebuah drama. [Exeunt]adalah satu byte lebih pendek dari mendeklarasikan adegan baru, dan melompat ke Act adalah dua byte kurang dari melompat ke Scene.

Contoh: Program kucing sederhana

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

Cobalah online!

Untuk:

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

Cobalah online!

Jo King
sumber
3

Gunakan kata-kata yang lebih pendek

Contoh:

Thydan thyselflebih pendek dari yourdan yourself.

Islebih pendek dari are.

dan banyak lagi ...

Oliver Ni
sumber
3

Gunakan persyaratan cerdas

Misalnya, jangan gunakan

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

Melainkan,

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

If (so|not) tidak harus segera mengikuti perbandingan.

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.
NieDzejkob
sumber
4
Bahkan, hasil perbandingan disimpan sebagai bendera dan dapat digunakan berulang kali di seluruh transisi adegan atau lintas beberapa If sos. Ini bisa membantu dalam menghindari perbandingan berulang!
Jo King
2

Gunakan konstanta untuk menyimpan jumlah besar

Misalnya, jika sudah

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!

Anda bisa mendeklarasikan orang lain di atas

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

dan ubah kode Anda menjadi

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.
Oliver Ni
sumber
8
Penerjemah resmi tidak mendukung pernyataan konstanta seperti itu.
NieDzejkob
2

Gotos bukan satu-satunya perintah yang dapat digunakan 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.
NieDzejkob
sumber
2

Semua baris baru diabaikan

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

Gunakan <atau >bukan==

Tidak berlaku untuk setiap situasi, tetapi ini sedikit lebih pendek:

Keping == Ajax

Puck:Is I as bad as you?

Puck <Ajax atau Puck> Ajax

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

4 byte lebih pendek untuk keduanya!

Jo King
sumber
2

Anda tidak perlu bagian akhir .atau !.

Cobalah online!

Ini juga dapat digunakan sebelum a [. (terima kasih jimmy23013)

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

Contoh:

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

Tidak berfungsi di:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](tepat setelah Scene {number}:) (namun ini berhasil, saya tidak tahu mengapa)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (dan varian yang lebih pendek)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (dan varian yang lebih pendek)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(hanya setelah kosong Recall, Recall xatau Recall@lain - lain berfungsi)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(tanpa mind)
pengguna202729
sumber
Ini tidak berfungsi dalam beberapa situasi di mana Anda telah menghapus sebuah kata, seperti Speak thyatauLet us Scene I
Jo King
2

Gunakan 'dua kali' dan properti distributif

Dari pada:

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

Menggunakan:

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

Ini menghemat 2 byte per twicekarena 2 penggunaan bigadalah 8 byte (dengan spasi) dan twicehanya 6 byte.

Halo selamat tinggal
sumber