Suggerimenti per giocare a golf in The Shakespeare Programming Language


43

Quali consigli generali hai per giocare a golf in The Shakespeare Programming Language? Sto cercando idee che possano essere applicate a problemi di code-golf e che siano anche in qualche modo specifiche per SPL (es. "Rimuovere commenti" non è una risposta).

Si prega di inviare un suggerimento per risposta.


17
Non sono sicuro che tu possa giocare a golf SPL. SPL è così prolisso che quasi mi sembra che questa domanda abbia bisogno del tag di trolling del codice. : P
Alex A.

Non puoi giocare a golf SPL. Almeno, per mia debole conoscenza della tradizione shakesperiana ...
Rodolfo Dias,

@RodolfoDias: debole? Penso che tu sia lo studioso residente di Shakespeare su PPCG.
Alex A.

8
@AlexA. Il che potrebbe non essere una buona cosa: significa solo che sono abbastanza demente da provare a capire SPL :-)
Rodolfo Dias,

@AlexA. Sp può farlo ...
Conor O'Brien,

Risposte:


18

(Beh ... poiché questa è la mia lingua adottata 1 , mi sento come se fossi obbligato ad aggiungere qualcosa qui)

Usa nomi di variabili brevi

Sì, sì, sì, è abbastanza standard per il golf di codice, basta usare nomi di variabili di una lettera, nessuna notizia qui. O c'è? Perché i chap che hanno creato SPL erano abbastanza stravaganti da non consentire alcun nome per le variabili del loro linguaggio: devono provenire da commedie shakesperiane che, in termini di lunghezza dei personaggi, sono un dolore nella scala reale - ma, se stai programmando in SPL lo sai già. Quindi, il mio consiglio sarebbe di usare personaggi con nomi abbreviati, come Ajax , Ford , Page o Puck , al posto dell'Arcivescovo di Canterbury , per esempio.

Questo è tutto ciò che ho, temo.


1 - poiché le mie abilità Java sono equivalenti a quelle di un neonato.



13

(dopo aver fatto quello precedente, mi sono appena ricordato alcune cose)

Scegli il tuo codice con attenzione

Un esempio, per cercare di spiegare cosa significhi.

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

e

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

produce lo stesso risultato esatto, che fa sì che il personaggio che sta parlando assuma il valore 64 (poiché, supponendo che tu abbia letto la mia lunga battaglia con SPL , sai che entrambe le righe sono equivalenti a 2 * 2 * 2 * 2 * 2 * 2 * 1); tuttavia, il primo ha 59 byte, mentre il secondo ha un byte di 107.

Tuttavia, nessuno sarà demente abbastanza per partecipare a una sfida di con SPL, quindi ...


10
Potresti usare lo stesso aggettivo più volte in una descrizione? Ad esempio a big big big big big big cat, salvando altri 4 byte? So che rovina l'arte ... ma dopo tutto questo è codice golf. ;)
DLosc

@DLosc, da quello che ho visto, non c'è nulla che ti proibisca di farlo. Quindi ... sei un giocatore di golf migliore di me ^ _ ^
Rodolfo Dias,

1
Ahem. Non chiamare Robert Fraser demente. codegolf.stackexchange.com/a/69360/43394
wizzwizz4

12

Qualsiasi numero romano è un numero di scena valido

Ciò significa che invece di:

Scene I
Scene II
Scene III
Scene IV
Scene V

Tu puoi fare:

Scene L
Scene I
Scene C
Scene X
Scene V

è Dun numero romano valido? IIRC, è 500 (ma non sono sicuro che sia valido in SPL)
Giuseppe,

@Giuseppe Non capisco perché non lo controlli, ma l'interprete SPL ufficiale supporta M, C, D, X, L, I e V.
NieDzejkob

10

Rimuovi le parole non necessarie

Guarda questo (inserendo nuove righe e spazi bianchi per la leggibilità):

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]

Sembra piuttosto golfista eh? Ecco una forma ancora più incomprensibile:

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!

Per riferimento, ecco un elenco di parole facilmente rimovibili dal codice:

  • Parla la tua mente -> Parla la tua
  • Apri il tuo cuore -> Apri il cuore *
  • Ascolta il tuo cuore -> Ascolta tothy
  • Apri la tua mente -> Apri la mente *
  • Sei un gatto -> Sei un gatto *
    • Si applica solo a costanti come big cat, altrimenti è ancora necessario 'is'
  • Ritorniamo a -> Lasciaci
  • Essere X [op] di Y? -> Be X [op] Y?
  • Sei [op] di X e Y -> Sei [op] diX Y
  • [Exeunt] -> (rimosso interamente)

Leggenda:

  • Xe Ysono costanti come cat, Ioyou
  • [op]sono operazioni come nicer,the sum of
  • * significa che puoi rimuovere la punteggiatura se è l'ultima frase del gioco

Se ne trovo altri, lo aggiungo all'elenco.

Per ulteriori riferimenti, ecco l'intestazione più breve per iniziare un programma:

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

Provalo online!

Aggiungi Page e Ford come personaggi extra se necessario.


1
Se hai bisogno di ancora più personaggi, c'è un elenco qui
NieDzejkob,

: | barrato
ASCII-only

6

Usa parole brevi

Quindi eccoli qui:

  • Utilizzare ainvece di ano the, tranne le espressioni the sum ofe simili, poiché non funzionano a.
  • Utilizzare am, beo isinvece di areo art.
  • Utilizzare Iinvece di meo myself.
  • Utilizzare youinvece thee, thou, thyselfo yourself.
  • Utilizzare bigper aggettivi.
  • Utilizzare catper numeri positivi.
  • Utilizzare pigper numeri negativi.
  • Utilizzare zeroper zero.
  • Utilizzare worseper A < B(invece di smallero punier).
  • Utilizzare nicerper A > B(invece di better, bigger, fresher, friendliero jollier).
  • Nomi dei personaggi:
    • 4 lettere: Ajax, Ford, Page, Puck
    • 5 lettere: Egeus, Helen, Julia, Lucio, Mopsa, Parigi, Pizzico, Priamo, Regan, Robin, Romeo, Timon, Tito, Venere, Viola
    • 6 lettere: Adone, Aegeon, Alonso, Angelo, Arthur, Banquo, Bianca, Bruto, Cicerone, Dorcas, Duncan, Emilia, Fenton, Amleto, Ecate, Ettore, Helena, Hermia, Imogen, Giulietta, Lennox, Oberon, Olivia, Orsino , Portia, Thaisa, Thurio, Tybalt
    • 7 lettere: Adriana, Emilia, Agrippa, Antonio, Capuleto, Cassio, Claudio, Dionyza, Escalo, Goneril, Orazio, Leonato, Luciana, Macbeth, Macduff, Malcolm, Mariana, Miranda, Octavia, Ofelia, Orlando, Otello, Pantino, Proteo , Publio, Superficiale, Timido, Esile, Solino, Teseo, Titania, Troilo, Ulisse
    • 8 lettere: Achille, Beatrice, Benedetto, Benvolio, Claudio, Cordelia, Cressida, Dogberry, Don Giovanni, Falstaff, Gertrude, Hermonie, Isabella, Lisandro, Mercutio, Montague, Pericle, Polonio, Pompei, Prospero, Rosalind, Stephano
    • 9 lettere: Agamennone, Antioco, Autolico, Balthazar, Brabantio, Cassandra, Cleopatra, Cornelio, Demetrio, Desdemona, Donalbain, Don Pedro, Ferdinando, Francisca, Ippolita, Re Giovanni, Re Lear, Lychorida, Sebastian, The Ghost, Valentine, Vincentio
    • 10 lettere: Andromache, Cymberline, Fortinbras, Frate John, King Henry
    • 11 lettere: Mark Antony
    • 12 lettere: Doctor Caius, King Richard, Lady Capulet, Lady Macbeth, Lady Macduff, Prince Henry, Queen Elinor
    • 13 lettere: Giovanni di Gaunt, Giulio Cesare, Lady Montague, Padrona Ford, Padrona
    • 14 lettere: Fra Laurence, The Apothecary
    • 15 lettere: Christopher Sly, Ottaviano Cesare
    • 17 lettere: Giovanni di Lancaster, padrona Overdone, il duca di Milano
    • 18 lettere: il duca di Venezia
    • 24 lettere: l'abate di Westminster
    • 28 lettere: l'arcivescovo di Canterbury
    • Se hai davvero bisogno di più, dovresti assolutamente considerare di usare la pila di ogni personaggio.

Nota che i caratteri composti da più parole possono omettere qualsiasi spazio dopo il loro nome (dal suggerimento dell'utente 202729 ), quindi sono preferibili ai caratteri con una sola parola
Jo King,

5

Il "torniamo alla scena X" può essere usato anche se il personaggio con cui viene parlato è fuori scena. Quindi invece di:

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.

Tu puoi fare:

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

Rimuovere gli spazi ridondanti

A parte quelli banali (due spazi adiacenti, adiacenti a una punteggiatura, adiacente a una nuova riga, alla fine) (con alcune eccezioni), lo spazio dopo i seguenti token può essere rimosso:

  • the sum of
  • let us
  • the ghost( come questo ) (ma chi userebbe questo personaggio comunque)
  • if soe if not(rimuovere il ,dopo questo, e non hanno bisogno di aggiungere qualsiasi spazio Esempio:. if solet usact I)
  • listen to(quindi listen tothyfunziona così )
  • e praticamente qualsiasi token multi-word .

Nota: questo non funziona con l' interprete Perl . Probabilmente è solo un effetto indesiderato causato dal comportamento di analisi di Flex. Lo "standard linguistico" non è chiaro al riguardo.


È ora di tornare indietro e modificare alcune delle mie risposte ... Molto bella scoperta!
Jo King,

È un bug nel tokenizer o quel comportamento è definito nella lingua?
Cœur

2
@ Cœur Vedi aggiornamento.
user202729

5

Non devi cambiare le persone in condizioni.

Per esempio,

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.

è più lungo di

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. fissaggio.
Oliver Ni,

4

Invece di sottrarre, aggiungere costanti

You is the difference between I and a big cat.

è più lungo di

You is the sum of I and a big pig.

4

I salti possono essere più brevi

Puoi usare return toanche se la scena è avanti e viceversa. In realtà, all'interprete non importa nemmeno se lo ometti del tutto. Ciò significa che queste tre affermazioni sono equivalenti al 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 ) ha scoperto che "Let us Scene X" è sufficiente.
Ed Wynn,

@EdWynn buono a sapersi. Ho riscritto la risposta per includerlo.
NieDzejkob,


4

Usa solo una scena

Normalmente, non è possibile riutilizzare la prima scena di un atto, poiché ha sempre la [Enter Ajax and Puck]prima cosa. Tuttavia, puoi prefigurarlo [Exeunt]per poter riutilizzare la prima scena di un'opera teatrale. [Exeunt]è un byte più corto rispetto alla dichiarazione di una nuova scena e saltare a un Act è di due byte in meno rispetto al saltare a una scena.

Ad esempio: un semplice programma per gatti

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

Provalo online!

A:

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

Provalo online!


3

Usa parole più brevi

Esempi:

Thye thyselfsono più brevi di youre yourself.

Isè più corto di are.

e altro ancora ...


3

Usa condizionali intelligenti

Ad esempio, non usare

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

Ma piuttosto,

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

3

If (so|not) non deve seguire immediatamente il confronto.

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
In effetti, i risultati di un confronto sono memorizzati come una bandiera e possono essere utilizzati ripetutamente attraverso le transizioni delle scene o tra più If sos. Questo può essere utile per evitare ripetuti confronti!
Jo King,

2

Utilizzare le costanti per memorizzare numeri grandi

Ad esempio, se hai

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!

Puoi semplicemente dichiarare un'altra persona in alto

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

e cambia il tuo codice in

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
L'interprete ufficiale non supporta la dichiarazione di costanti del genere.
NieDzejkob,

2

Le goto non sono gli unici comandi utilizzabili con 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

Tutte le nuove righe vengono ignorate

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

2

Utilizzare <o >invece di==

Non applicabile ad ogni situazione, ma è un po 'più breve:

Disco == Ajax

Puck:Is I as bad as you?

Disco <Ajax o Disco> Ajax

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

4 byte in meno per entrambi!


2

Non hai bisogno del finale .o !.

Provalo online!

Questo può essere usato anche prima di a [. (grazie jimmy23013)

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

Esempi:

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

Non funziona in:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](subito dopo Scene {number}:) (comunque questo funziona, non so perché)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (e varianti più brevi)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (e varianti più brevi)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(solo dopo vuoto Recall, Recall xo Recall@ecc opere)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(senza mind)

Questo non funziona in alcune situazioni in cui hai già rimosso una parola, come Speak thyoLet us Scene I
Jo King,

2

Usa 'due volte' e la proprietà distributiva

Invece di:

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

Uso:

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

Ciò consente di risparmiare 2 byte per twicepoiché 2 utilizzi di bigè 8 byte (con uno spazio) ed twiceè solo 6 byte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.