Shakespeare Programlama Dilinde golf oynamak için ipuçları


43

Shakespeare Programlama Dilinde golf oynamak için hangi genel ipuçlarınız var? Kod-golf sorunlarına uygulanabilecek ve en azından SPL'ye özgü olan fikirler arıyorum (örneğin, "yorumları kaldır" bir cevap değildir).

Lütfen cevap başına bir ipucu gönderin.


17
SPL'yi golf oynayabileceğinizden emin değilim . SPL o kadar ayrıntılı ki neredeyse bu sorunun kod trolling etiketine ihtiyacı olduğunu hissediyorum. : P
Alex A.

SPL'yi golf oynayamazsınız. En azından, Shakesperian lore'un zayıf bilgisine ...
Rodolfo Dias

@ RodolfoDias: Feeble? Bence PPCG'de yaşayan Shakespeare'in bilginisin.
Alex A.

8
@AlexA. Bu iyi bir şey olmayabilir: bu sadece SPL'yi denemek ve anlamak için yeterince endişeli olduğum anlamına geliyor :-)
Rodolfo Dias

@AlexA. Sp yapabilir ...
Conor O'Brien

Yanıtlar:


18

(Şey ... bu benim kabul ettiğim dil 1 olduğundan , buraya bir şeyler eklemek zorunda olduğumu hissediyorum)

Kısa değişken isimleri kullan

Evet, evet, evet, kod golfü için oldukça standart, sadece bir harf uzunluğundaki değişken isimleri kullanıyorsunuz, burada haber yok. Yoksa orada mı? Çünkü SPL tuhaf yeterince onların dilin değişkenler için herhangi bir isim izin değildi oluşturulan ahbap: onlar olmalıdır karakter uzunluğu açısından, kraliyet tush bir acıdır, Shakesperian oyunlarından gelen - Eğer SPL kodlama yapıyorsanız, ancak , sen bunu zaten biliyorsun. Bu yüzden benim tavsiyem , örneğin Canterbury Başpiskoposu yerine Ajax , Ford , Page veya Puck gibi kısa isimler içeren karakterler kullanmak olacaktır .

Tüm sahip olduğum bu, korkarım.


1 - Çünkü Java becerilerim yenidoğan ile eşdeğerdir.



13

(öncekini yaptıktan sonra birkaç şeyi hatırladım)

Kodunuzu dikkatlice seçin

Bunun ne anlama geldiğini açıklamaya çalışmak için bir örnek.

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

ve

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

tam aynı sonucu verir; bu, karakterin 64 değerini alması için konuşulmasını sağlar ( SPL ile olan uzun savaşımı okuduğunuzu varsayarsak , her iki çizginin de 2 * 2 * 2 * 2 * 2 * 2 * 'ye eşdeğer olduğunu biliyorsunuzdur. 1); ancak, birincisinde 59 bayt, ikincisinde 107 bayt vardır.

Yine de, hiç kimse SPL ile bir mücadelesine girebilecek kadar demode olmayacak , bu yüzden ...


10
Bir tanımda aynı sıfatı birden çok kez kullanabilir misiniz? Örn a big big big big big big cat, 4 bayt daha mı tasarruf ediyorsunuz? Sanatı bozuyor biliyorum ... ama bu kod golf. ;)
DLosc

@DLosc, gördüğüm kadarıyla, bunu yapmayı yasaklayan hiçbir şey yok. Yani ... sen benden daha iyi bir golfçüsün ^ _ ^
Rodolfo Dias

1
Ahem. Robert Fraser'i demode deme. codegolf.stackexchange.com/a/69360/43394
wizzwizz4

12

Herhangi bir Romen rakamı geçerli bir sahne numarasıdır

Bunun yerine, demek ki:

Scene I
Scene II
Scene III
Scene IV
Scene V

Yapabilirsin:

Scene L
Scene I
Scene C
Scene X
Scene V

olan Dgeçerli bir Romen rakamı? IIRC, 500’dür (ancak SPL’de geçerli olup olmadığından emin değilim)
Giuseppe

Sadece o bakmıyoruz anlamıyorum @Giuseppe ama resmi SPL tercüman M, C, D, X, L destekler, ben ve V.
NieDzejkob

10

Gereksiz kelimeleri kaldır

Şuna bakın (okunabilirlik için yeni satırlar ve boşluklar ekleyin):

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]

Oldukça golf görünüyor, ha? İşte daha da soyulmuş anlaşılmaz bir form:

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!

Başvuru için, koddan kolayca çıkarılabilir kelimelerin bir listesi:

  • Zihnini söyle -> Seninkile konuş
  • Kalbini aç -> Kalbini aç *
  • Senin kalbin dinle -> Dinle
  • Zihnini aç -> Zihni aç *
  • Sen bir kedisin -> Seni kedi *
    • Sadece gibi sabitler için geçerlidir big cat, aksi halde hala 'is' gerekir
  • Geri dönelim -> Bize izin ver
  • Y'den X X olmak? -> X olun [op] Y?
  • X ve Y'nin [op] 'ı -> X Y'nin [op]' ı
  • [Exeunt] -> (tamamen kaldırıldı)

Açıklama:

  • Xve Ybenzeri sabitlerdir cat, Iyayou
  • [op]operasyonlar sever vardır nicer,the sum of
  • * Oyunun son cümlesiyse, noktalama işaretlerini kaldırabileceğiniz anlamına gelir.

Diğerleriyle karşılaşırsam listeye eklerim.

Ekstra referans olarak, işte bir program başlatan en kısa başlık:

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

Çevrimiçi deneyin!

Sayfa ve Ford'u gerektiği kadar ekstra karakter olarak ekleyin.


1
Daha fazla karaktere ihtiyacınız varsa, burada bir liste var
NieDzejkob

: | çizgili
ASCII-sadece

6

Kısa kelimeler kullan

Yani buradalar:

  • Çalışmayacakları için ifadeler ve benzerleri dışında veya ayerine kullanın .anthethe sum ofa
  • Kullanım am, beya isyerine areya art.
  • Veya Iyerine kullanın .memyself
  • Kullanım youyerine thee, thou, thyselfveya yourself.
  • bigSıfatlar için kullanın .
  • catPozitif sayılar için kullanın .
  • pigNegatif sayılar için kullanın .
  • zeroSıfır için kullanın .
  • Kullanım worseiçin A < B(yerine smallerya da punier).
  • Kullanım niceriçin A > B(yerine better, bigger, fresher, friendlierveya jollier).
  • Karakter isimleri:
    • 4 harf: Ajax, Ford, Sayfa, Disk
    • 5 mektup: Egeus, Helen, Julia, Lucio, Mopsa, Paris, Tutam, Priam, Regan, Robin, Romeo, Timon, Titus, Venüs, Viyola
    • 6 mektup: Adonis, Aegeon, Alonso, Angelo, Arthur, Banquo, Bianca, Brutus, Cicero, Dorcas, Duncan, Emilia, Fenton, Hamlet, Hekate, Hector, Helena, Hermia, Imogen, Juliet, Lennox, Oberon, Olivia, Orsino , Portia, Thaisa, Thurio, Tybalt
    • 7 harf: 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, Sığ, Shylock, İnce, Solinus, Theseus, Titania, Troilus, Ulysses
    • 8 harf: Aşil, Beatrice, Benedick, Benvolio, Claudius, Cordelia, Cressida, Dogberry, Don John, Falstaff, Gertrude, Hermonie, Isabella, Lysander, Mercutio, Montague, Perikles, Polonius, Pompeius, Prospero, Rosalind, Stephano
    • 9 mektup: Agamemnon, Antiochus, Autolycus, Balthazar, Brabantio, Cassandra, Kleopatra, Cornelius, Demetrius, Desdemona, Donalbain, Don Pedro, Ferdinand, Francisca, Hippolyta, Kral John, King Lear, Lychorida, Sebastian, Hayalet, Valentine, Vincentio
    • 10 harf: Andromache, Cymberline, Fortinbras, Friar John, Kral Henry
    • 11 mektup: Mark Antony
    • 12 mektup: Doktor Caius, Kral Richard, Bayan Capulet, Bayan Macbeth, Bayan Macduff, Prens Henry, Kraliçe Elinor
    • 13 mektup: Gaunt John'u, Julius Caesar, Bayan Montague, Mistress Ford, Mistress Page
    • 14 mektup: Friar Laurence, Eczacı
    • 15 harf: Christopher Sly, Octavius ​​Sezar
    • 17 mektup: Lancaster'lı John, Metresi abartılı, Milan Dükü
    • 18 harf: Venedik Dükü
    • 24 mektup: Westminster'in Başraşı
    • 28 mektup: Canterbury Başpiskoposu
    • Gerçekten daha fazlasına ihtiyacınız varsa, kesinlikle her karakterin yığınını kullanmayı düşünmelisiniz.

Çok kelimeli karakterlerin adlarından sonra herhangi bir boşluk bırakabileceğini unutmayın ( user202729'un ipucundan ), bu nedenle tek kelimeli karakterlere tercih edilirler
Jo King

5

“X sahnesine geri dönelim” adı verilen karakter sahnedeyken bile kullanılabilir. Yani yerine:

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.

Yapabilirsin:

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

Gereksiz boşlukları kaldırın

Önemsiz olanların dışında (sonunda bir yeni satıra bitişik, noktalama işaretine bitişik iki bitişik boşluk) (bazı istisnalar dışında), aşağıdaki belirteçlerden sonraki boşluk kaldırılabilir:

  • the sum of
  • let us
  • the ghost(bunun gibi ) (ama yine de bu karakteri kim kullanırdı)
  • if sove if not(kaldırmak ,bundan sonra ve herhangi bir boşluk eklemek gerekmez Örnek:. if solet usact I)
  • listen to(böylece listen tothy, çalışır böyle )
  • ve temelde herhangi bir çok kelimeli belirteçler .

Not: Bu, Perl tercüman ile çalışmaz . Muhtemelen Flex'in ayrıştırma davranışından kaynaklanan sadece istenmeyen bir etki. "Dil standardı" bu konuda net değildir.


Cevaplarımdan bazılarını geri alma ve düzenleme zamanı ... Çok güzel bul!
Jo King

Bu belirteçteki bir hata mı, yoksa bu davranış dilde tanımlanmış mı?
Coeur

2
@ Cœur Güncellemeye bakın.
user202729 29:18

5

İnsanları şart koşullarında değiştirmek zorunda değilsin.

Örneğin,

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.

daha uzun

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
Whoops. sabitleme.
Oliver Ni

4

Çıkarma yerine sabitler ekleyin

You is the difference between I and a big cat.

daha uzun

You is the sum of I and a big pig.

4

Atlar daha kısa olabilir

return toSahne ileride olsa bile kullanabilirsiniz , bunun tersi de geçerlidir. Aslında, tercüman, tamamen ihmal etmeniz bile umrunda değil. Bu, bu üç ifadenin% 100 eşdeğeri olduğu anlamına gelir:

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

Jo King ( codegolf.stackexchange.com/a/164394/76162 ) "Let X Scene X" in yeterli olduğunu buldu.
Ed Wynn

@EdWynn bilmek iyi. Buna dahil etmek için cevabı yeniden yazdım.
NieDzejkob


4

Sadece bir sahne kullan

Normalde, bir eylemin ilk sahnesini tekrar kullanamazsınız, çünkü her zaman [Enter Ajax and Puck]ilk şey vardır. Bununla birlikte, [Exeunt]bir oyunun ilk sahnesini tekrar kullanabilmek için bunun önüne geçebilirsiniz . [Exeunt]yeni bir sahne tanımlamaktan bir bayt daha kısadır ve bir kanuna atlamak bir sahneye atlamaktan iki bayt daha azdır.

Örn: Basit bir kedi programı

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

Çevrimiçi deneyin!

Kime:

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

Çevrimiçi deneyin!


3

Daha kısa kelimeler kullan

Örnekler:

Thyve thyselfdaha kısadır yourve yourself.

Isdaha kısa are.

ve dahası...


3

Akıllı koşul kullan

Örneğin, kullanma

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

Daha ziyade,

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

3

If (so|not) hemen karşılaştırmayı takip etmek zorunda değildir.

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
Aslında, bir karşılaştırmanın sonuçları bir bayrak olarak depolanır ve sahne geçişleri boyunca veya birkaç If sosaniye boyunca tekrar tekrar kullanılabilir . Bu, yinelenen karşılaştırmalardan kaçınmakta yardımcı olabilir!
Jo King,

2

Büyük sayıları saklamak için sabitleri kullanın

Örneğin, varsa

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!

En tepedeki başka bir kişiyi ilan edebilirsiniz.

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

kodunuzu değiştirin ve

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
Resmi tercüman böyle sabit bildirmeyi desteklememektedir.
NieDzejkob

2

Gotos, kullanılabilecek tek komut değil 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üm yeni satırlar dikkate alınmaz

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

2

Kullanın <veya >yerine==

Her durum için geçerli değildir, ancak oldukça kısadır:

Puck == Ajax

Puck:Is I as bad as you?

Pak <Ajax veya Pak> Ajax

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

Her ikisi için de 4 bayt daha kısa!


2

Sonuna ihtiyacın yok .veya !.

Çevrimiçi deneyin!

Bu, ayrıca daha önce de kullanılabilir [. (teşekkürler jimmy23013)

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

Örnekler:

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

Çalışmıyor:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](hemen sonra Scene {number}:) (ancak bu işe yarıyor, nedenini bilmiyorum)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (ve daha kısa varyantlar)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (ve daha kısa varyantlar)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(sadece boş sonra Recall, Recall xya Recall@vb işler)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(olmadan mind)

Bu, Speak thyya da gibi bir sözcüğü daha önce kaldırdığınız bazı durumlarda çalışmaz,Let us Scene I
Jo King

2

'İki kez' ve dağıtım özelliğini kullanın

Onun yerine:

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

kullanın:

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

Bu, 2 twicekullanımın big8 baytlık (boşluklu) ve twiceyalnızca 6 bayt olduğundan , 2 bayttan tasarruf sağlar .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.