Wskazówki dotyczące gry w golfa w języku programowania Szekspira


43

Jakie masz ogólne wskazówki na temat gry w golfa w The Shakespeare Programming Language? Szukam pomysłów, które można by zastosować do problemów z golfem i które są co najmniej nieco specyficzne dla SPL (np. „Usuń komentarze” nie jest odpowiedzią).

Proszę zamieścić jedną wskazówkę na odpowiedź.


17
Nie jestem pewien, że można SPL golfowe. SPL jest tak gadatliwy, że prawie czuję, że to pytanie wymaga znacznika trollowania kodu. : P
Alex A.

Po prostu nie możesz grać w golfa SPL. Przynajmniej o mojej słabej znajomości wiedzy Shakesperian ...
Rodolfo Dias

@RodolfoDias: Feeble? Myślę, że jesteś rezydentem Szekspira w PPCG.
Alex A.

8
@AlexA. Co może nie być dobrą rzeczą: oznacza to po prostu, że jestem wystarczająco szalony, aby spróbować zrozumieć SPL :-)
Rodolfo Dias

@AlexA. Sp może to zrobić ...
Conor O'Brien

Odpowiedzi:


18

(Cóż ... skoro to jest mój adoptowany język 1 , czuję się, jakbym musiał tutaj coś dodać)

Używaj krótkich nazw zmiennych

Tak, tak, tak, to dość standardowe w golfie kodowym, po prostu używasz nazw zmiennych o długości jednej litery, bez wiadomości tutaj. Czy jest tam Ponieważ faceci, którzy stworzyli SPL, byli na tyle głupi, aby nie nadać żadnej nazwy zmiennym ich języka: muszą pochodzić ze sztuk Shakesperian, które pod względem długości znaków są uciążliwe dla królewskiej gry - ale jeśli piszesz w SPL , już to wiesz. Radzę więc używać postaci o krótkich nazwach, takich jak Ajax , Ford , Page lub Puck , zamiast na przykład Arcybiskupa Canterbury .

Obawiam się, że tylko tyle mam.


1 - ponieważ moje umiejętności Java są równoważne z umiejętnościami noworodka.



13

(po wykonaniu poprzedniego przypomniałem sobie kilka rzeczy)

Wybierz kod ostrożnie

Przykład, aby spróbować wyjaśnić, co to znaczy.

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

i

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

dają dokładnie ten sam wynik, co sprawia, że postać mówi się, aby przyjąć wartość 64 (ponieważ zakładając, że przeczytałeś moją długą bitwę z SPL , wiesz, że obie linie są równoważne 2 * 2 * 2 * 2 * 2 * 2 * 1); jednak pierwszy ma 59 bajtów, podczas gdy drugi ma 107 bajtów.

Mimo to nikt nie będzie wystarczająco szalony, aby wziąć udział w z SPL, więc ...


10
Czy możesz użyć tego samego przymiotnika wiele razy w opisie? Np. a big big big big big big catOszczędzasz 4 bajty więcej? Wiem, że to niszczy artyzm ... ale to w końcu jest golf golfowy. ;)
DLosc

@DLosc, z tego, co widziałem, nic nie zabrania ci tego robić. Więc ... jesteś lepszym golfistą ode mnie ^ _ ^
Rodolfo Dias

1
Ahem. Nie nazywaj szalonego Roberta Frasera. codegolf.stackexchange.com/a/69360/43394
wizzwizz4

12

Każda cyfra rzymska jest prawidłowym numerem sceny

Oznacza to, że zamiast:

Scene I
Scene II
Scene III
Scene IV
Scene V

Możesz to zrobić:

Scene L
Scene I
Scene C
Scene X
Scene V

jest Dprawidłową cyfrą rzymską? IIRC, to 500 (ale nie jestem pewien, czy jest ważny w SPL)
Giuseppe,

@Giuseppe Nie rozumiem, dlaczego tego nie sprawdzasz, ale oficjalny interpreter SPL obsługuje M, C, D, X, L, I i V.
NieDzejkob,

10

Usuń niepotrzebne słowa

Spójrz na to (wstawianie znaków nowej linii i białych znaków dla czytelności):

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]

Wygląda całkiem golfowo, co? Oto jeszcze bardziej uproszczona, niezrozumiała forma:

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!

Dla odniesienia, oto lista łatwo usuwalnych słów z kodu:

  • Mów swoim umysłem -> Mów swoim
  • Otwórz swoje serce -> Otwórz serce *
  • Słuchaj swego serca -> Słuchaj tego
  • Otwórz swój umysł -> Otwórz umysł *
  • Jesteś kotem -> Jesteś kotem *
    • Dotyczy tylko stałych, takich jak big cat, w przeciwnym razie nadal potrzebujesz „jest”
  • Wróćmy do -> Pozwól nam
  • Być X [op] niż Y? -> Be X [op] Y?
  • Jesteś [op] z X i Y -> Jesteś [op] z X Y
  • [Exeunt] -> (całkowicie usunięte)

Legenda:

  • Xi Ysą stałymi, takimi jak cat, Ilubyou
  • [op]są operacje, takie jak nicer,the sum of
  • * oznacza, że ​​możesz usunąć interpunkcję, jeśli jest to ostatnie zdanie gry

Jeśli napotkam jakieś inne, dodam je do listy.

Aby uzyskać dodatkowe informacje, oto najkrótszy nagłówek umożliwiający uruchomienie programu:

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

Wypróbuj online!

Dodaj Page i Forda dodatkowe znaki, jeśli to konieczne.


1
Jeśli potrzebujesz jeszcze więcej znaków, znajdziesz tutaj
NieDzejkob,

: | rozłożony w dół
tylko ASCII

6

Używaj krótkich słów

Oto one:

  • Użyj azamiast anlub the, z wyjątkiem wyrażeń the sum ofi tym podobnych, ponieważ nie będą one działać a.
  • Stosowanie am, belub iszamiast arelub art.
  • Użyj Izamiast melub myself.
  • Użyj youzamiast thee, thou, thyselflub yourself.
  • Użyj bigprzymiotników.
  • Użyj catdla liczb dodatnich.
  • Użyj pigdla liczb ujemnych.
  • Użyj zerodla zera.
  • Użyj worsedla A < B(zamiast smallerlub punier).
  • Używać nicerdo A > B(zamiast better, bigger, fresher, friendlieri jollier).
  • Nazwy postaci:
    • 4 litery: Ajax, Ford, Page, Puck
    • 5 liter: Egeus, Helen, Julia, Lucio, Mopsa, Paris, Pinch, Priam, Regan, Robin, Romeo, Timon, Titus, Venus, Viola
    • 6 liter: 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 liter: Adriana, Aemilia, Agrippa, Antonio, Capulet, Cassius, Claudio, Dionyza, Escalus, Goneril, Horatio, Leonato, Luciana, Macbeth, Macduff, Malcolm, Mariana, Miranda, Octavia, Ofelia, Orlando, Othello, Pantino, Proteus , Publius, Płytki, Shylock, Smukły, Solinus, Theseus, Titania, Troilus, Ulisses
    • 8 liter: Achilles, Beatrice, Benedick, Benvolio, Claudius, Cordelia, Cressida, Dogberry, Don John, Falstaff, Gertrude, Hermonie, Isabella, Lysander, Mercutio, Montague, Pericles, Polonius, Pompeius, Prospero, Rosalind, Stephano
    • 9 liter: Agamemnon, Antiochus, Autolycus, Balthazar, Brabantio, Cassandra, Cleopatra, Cornelius, Demetrius, Desdemona, Donalbain, Don Pedro, Ferdinand, Francisca, Hippolyta, King John, King Lear, Lychorida, Sebastian, The Ghost, Valentine, Vincentio
    • 10 liter: Andromacha, Cymberline, Fortinbras, Brat Jan, Król Henryk
    • 11 liter: Mark Antony
    • 12 liter: Doktor Kajusz, Król Richard, Lady Capulet, Lady Macbeth, Lady Macduff, Prince Henry, Queen Elinor
    • 13 liter: Jan Gaunt, Juliusz Cezar, Lady Montague, Mistress Ford, Mistress Page
    • 14 liter: Friar Laurence, Apteka
    • 15 liter: Christopher Sly, Octavius ​​Caesar
    • 17 liter: Jan z Lancaster, Mistress Overdone, książę Mediolanu
    • 18 liter: Książę Wenecji
    • 24 litery: Opat z Westminster
    • 28 liter: arcybiskup Canterbury
    • Jeśli naprawdę potrzebujesz więcej, zdecydowanie powinieneś rozważyć użycie stosu każdej postaci.

Zauważ, że znaki złożone z wielu słów mogą pomijać wszelkie spacje po nazwie ( wskazówka użytkownika 202729 ), dlatego są one lepsze niż znaki zawierające tylko jedno słowo
Jo King

5

„Wróćmy do sceny X” może być użyte, nawet jeśli postać, z którą mówi się, znajduje się poza sceną. Więc zamiast:

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.

Możesz to zrobić:

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

Usuń zbędne spacje

Oprócz trywialnych (dwie przyległe spacje, przylegające do interpunkcji, przylegające do nowej linii, na końcu) (z pewnymi wyjątkami), przestrzeń po następujących żetonach można usunąć:

  • the sum of
  • let us
  • the ghost( jak ten ) (ale kto i tak użyłby tej postaci)
  • if soi if not(usunąć ,po tym, i nie trzeba dodawać żadnego miejsca Przykład:. if solet usact I)
  • listen to(tak listen tothydziała, tak )
  • i w zasadzie dowolne tokeny złożone z wielu słów .

Uwaga: Nie działa to z interpretatorem Perla . Prawdopodobnie jest to tylko niezamierzony efekt spowodowany zachowaniem podczas analizowania przez Flex. „Standardowym językiem” nie jest jasne, o tym.


Czas cofnąć i edytować niektóre z moich odpowiedzi ... Bardzo fajne znalezisko!
Jo King

Czy to błąd w tokenizerze, czy to zachowanie jest zdefiniowane w języku?
Cœur

2
@ Cœur Zobacz aktualizację.
user202729,

5

Nie musisz zmieniać ludzi na warunkowe.

Na przykład,

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.

jest dłuższy niż

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. ustalenie.
Oliver Ni

4

Zamiast odejmowania dodaj stałe

You is the difference between I and a big cat.

jest dłuższy niż

You is the sum of I and a big pig.

4

Skoki mogą być krótsze

Możesz użyć, return tonawet jeśli scena jest przed nami, i odwrotnie. W rzeczywistości tłumacz nie dba nawet o to, że całkowicie go pominiesz. Oznacza to, że te trzy stwierdzenia są w 100% równoważne:

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

Jo King ( codegolf.stackexchange.com/a/164394/76162 ) stwierdził, że „Let Us Scene X” wystarczy.
Ed Wynn,

@EdWynn dobrze wiedzieć. Przepisałem odpowiedź, aby to uwzględnić.
NieDzejkob


4

Użyj tylko jednej sceny

Zwykle nie można ponownie wykorzystać pierwszej sceny aktu, ponieważ zawsze ma ona [Enter Ajax and Puck]pierwszą rzecz. Możesz to jednak poprzedzić, [Exeunt]aby móc ponownie wykorzystać pierwszą scenę sztuki. [Exeunt]jest o jeden bajt krótszy niż zadeklarowanie nowej sceny, a przeskok do aktu jest o dwa bajty mniejszy niż przeskok do sceny.

Np .: Prosty program dla kotów

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

Wypróbuj online!

Do:

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

Wypróbuj online!


3

Używaj krótszych słów

Przykłady:

Thyi thyselfsą krótsze niż youri yourself.

Isjest krótszy niż are.

i więcej...


3

Używaj inteligentnych programów warunkowych

Na przykład nie używaj

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

Ale raczej,

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

3

If (so|not) nie musi natychmiast śledzić porównania.

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
W rzeczywistości wyniki porównania są przechowywane jako flaga i mogą być używane wielokrotnie w przejściach scen lub w ciągu kilku If sosekund. Może to być pomocne w unikaniu powtarzania porównań!
Jo King

2

Używaj stałych do przechowywania dużych liczb

Na przykład jeśli masz

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!

Możesz po prostu zadeklarować inną osobę na górze

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

i zmień kod na

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
Oficjalny tłumacz nie obsługuje deklarowania stałych w ten sposób.
NieDzejkob,

2

Gotos to nie jedyne polecenia, których można używać 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

Wszystkie nowe linie są ignorowane

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

2

Użyj <lub >zamiast==

Nie dotyczy każdej sytuacji, ale jest nieco krótszy:

Krążek == Ajax

Puck:Is I as bad as you?

Krążek <Ajax lub Krążek> Ajax

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

4 bajty krótsze dla obu!


2

Nie potrzebujesz zakończenia .ani !.

Wypróbuj online!

Można tego również użyć przed [. (dzięki jimmy23013)

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

Przykłady:

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

Nie działa w:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](zaraz po Scene {number}:) (jakkolwiek to działa, nie wiem dlaczego)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (i krótsze warianty)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (i krótsze warianty)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(tylko po pusta Recall, Recall xlub Recall@itp robót)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(bez mind)

To nie działa w niektórych sytuacjach, w których już usunąłeś słowo, np. Speak thyLubLet us Scene I
Jo King

2

Użyj „dwa razy” i własności dystrybucyjnej

Zamiast:

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

Posługiwać się:

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

To oszczędza 2 bajty na raz, twiceponieważ 2 użycie bigto 8 bajtów (ze spacją) i twicetylko 6 bajtów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.