Conseils pour jouer au golf dans le langage de programmation Shakespeare

43

Quels conseils généraux avez-vous pour jouer au golf dans le langage de programmation Shakespeare? Je cherche des idées qui peuvent être appliquées aux problèmes de code-golf et qui sont aussi au moins quelque peu spécifiques à SPL (par exemple, "supprimer les commentaires" n'est pas une réponse).

Merci de poster un pourboire par réponse.

Loovjo
la source
17
Je ne suis pas sûr que vous puissiez jouer au golf SPL. SPL est si bavard que j'ai presque l'impression que cette question a besoin de la balise de contrôle du code. : P
Alex A.
Vous ne pouvez tout simplement pas jouer au golf SPL. Du moins, à ma faible connaissance de la tradition shakesperienne ...
Rodolfo Dias
@RodolfoDias: Feeble? Je pense que vous êtes l'érudit Shakespeare en résidence du PPCG.
Alex A.
8
@Alexa. Ce qui peut ne pas être une bonne chose: cela signifie simplement que je suis assez fou pour essayer de comprendre SPL :-)
Rodolfo Dias
@Alexa. Sp peut le faire ...
Conor O'Brien

Réponses:

18

(Eh bien ... puisque c'est la langue que j'ai adoptée 1 , je me sens obligé d'ajouter quelque chose ici)

Utilisez des noms de variables courts

Ouais, ouais, ouais, c'est assez standard en code-golf, vous utilisez simplement des noms de variables d'une longueur de lettre, pas de nouvelles ici. Ou est-il? Parce que les gars qui ont créé SPL étaient assez farfelus pour ne laisser aucun nom pour les variables de leur langue: ils doivent provenir de jeux Shakesperian qui, en termes de longueur de caractère, sont pénibles pour le tush royal - mais si vous codez en SPL , vous le savez déjà. Donc, mon conseil serait d'utiliser des personnages avec des noms courts, comme Ajax , Ford , Page ou Puck , au lieu de l'archevêque de Cantorbéry , par exemple.

C'est tout ce que j'ai, j'ai peur.


1 - puisque mes compétences en Java sont équivalentes à celles d'un nouveau-né.

Rodolfo Dias
la source
13

(après avoir fait la précédente, je viens de me souvenir de quelques choses)

Choisissez votre code avec soin

Un exemple, pour essayer d'expliquer ce que cela signifie.

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

et

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

produit exactement le même résultat, c'est-à-dire que le personnage parlé prend la valeur 64 (puisque, en supposant que vous lisiez ma longue bataille avec SPL , vous savez que les deux lignes équivalent à 2 * 2 * 2 * 2 * 2 * 2 * 1); cependant, le premier a 59 octets, tandis que le second compte 107 octets.

Pourtant, personne ne sera assez dément pour entrer dans un défi avec SPL, alors ...

Rodolfo Dias
la source
10
Pourriez-vous utiliser le même adjectif plusieurs fois dans une description? Par exemple a big big big big big big cat, économiser 4 octets de plus? Je sais que ça gâche l'art… mais c'est du code golf après tout. ;)
DLosc
@DLosc, d'après ce que j'ai vu, rien ne vous empêche de le faire. Alors ... tu es un meilleur golfeur que moi ^ _ ^
Rodolfo Dias
1
Ahem. N'appelez pas Robert Fraser dément. codegolf.stackexchange.com/a/69360/43394
wizzwizz4
12

Tout chiffre romain est un numéro de scène valide

Cela signifie qu'au lieu de:

Scene I
Scene II
Scene III
Scene IV
Scene V

Tu peux faire:

Scene L
Scene I
Scene C
Scene X
Scene V
NieDzejkob
la source
est Dun chiffre romain valide? IIRC, c'est 500 (mais je ne sais pas s'il est valable dans SPL)
Giuseppe
@Giuseppe Je ne comprends pas pourquoi vous ne vérifiez pas cela, mais l'interprète officiel SPL prend en charge M, C, D, X, L, I et V.
NieDzejkob Le
10

Supprimer les mots inutiles

Regardez ceci (insertion de nouvelles lignes et d'espaces pour la lisibilité):

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]

On dirait bien joué au golf hein? Voici un formulaire inintelligible encore plus dépouillé:

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!

Pour référence, voici une liste de mots facilement supprimables du code:

  • Dis ton esprit -> Dis ton
  • Ouvre ton coeur -> Ouvre coeur *
  • Ecoute ton coeur -> Ecoute, tothy
  • Ouvre ton esprit -> Ouvre ton esprit *
  • Vous êtes un chat -> Votre chat *
    • Ne s'applique qu'aux constantes telles que big cat, sinon vous avez toujours besoin du 'est'
  • Revenons à -> Laissez-nous
  • Be X [op] que Y? -> Soyez X [op] Y?
  • Vous est [op] de X et Y -> Vous est [op] deX Y
  • [Exeunt] -> (entièrement supprimé)

Légende:

  • Xet Ysont des constantes comme cat, Iouyou
  • [op]sont des opérations telles que nicer,the sum of
  • * signifie que vous pouvez supprimer la ponctuation s'il s'agit de la dernière phrase de la pièce

Si j'en rencontre d'autres, je l'ajouterai à la liste.

Pour plus de références, voici l’en-tête le plus court pour démarrer un programme:

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

Essayez-le en ligne!

Ajoutez Page et Ford comme caractères supplémentaires si nécessaire.

Jo King
la source
1
Si vous avez besoin de plus de personnages, voici
NieDzejkob
: | rayé
ASCII seulement
6

Utilisez des mots courts

Alors les voici:

  • Utilisez aau lieu de anou the, sauf les expressions the sum ofet similaires, car elles ne fonctionneront pas a.
  • Utilisez am, beou au islieu de areou art.
  • Utilisez Iau lieu de meou myself.
  • Utilisez au youlieu de thee, thou, thyselfou yourself.
  • Utilisez bigpour les adjectifs.
  • Utilisez catpour les nombres positifs.
  • Utilisez pigpour les nombres négatifs.
  • Utilisez zeropour zéro.
  • Utilisez worsepour A < B(au lieu de smallerou punier).
  • Utilisez nicerpour A > B( au lieu de better, bigger, fresher, friendlierou jollier).
  • Noms de personnages:
    • 4 lettres: Ajax, Ford, Page, Puck
    • 5 lettres: Egeus, Helen, Julia, Lucio, Mopsa, Paris, Pinch, Priam, Regan, Robin, Roméo, Timon, Titus, Vénus, Alto
    • 6 lettres: Adonis, Aegeon, Alonso, Angelo, Arthur, Banquo, Bianca, Brutus, Cicéron, Dorcas, Duncan, Émilie, Fenton, Hameau, Hécate, Hector, Hélène, Hermia, Imogen, Juliette, Lennox, Lennox, Oberon, Olivia, Orsino , Portia, Thaisa, Thurio, Tybalt
    • 7 lettres: Adriana, Emilia, Agrippa, Antonio, Capulet, Cassius, Claudio, Dionyza, Escalus, Goneril, Horatio, Leonato, Luciana, Macbeth, Macduff, Malcolm, Mariana, Miranda, Octavia, Ophelia, Ophelia, Orlando, Othello, Pantino, Proteus , Publius, Shallow, Shylock, Slender, Solinus, Thésée, Titania, Troilus, Ulysses
    • 8 lettres: Achille, Béatrice, Benedick, Benvolio, Claudius, Cordelia, Cressida, Dogberry, Don John, Falstaff, Gertrude, Hermonie, Isabella, Lysandre, Mercutio, Montague, Périclès, Polonais, Pompée, Prospero, Prospero, Rosalind, Stephano
    • 9 lettres: Agamemnon, Antiochus, Autolycus, Balthazar, Brabantio, Cassandra, Cléopâtre, Cléopâtre, Corneille, Démétrius, Desdémone, Donalbain, Don Pedro, Ferdinand, Francisca, Hippolyta, Roi Jean, Roi Lear, Lychorida, Lychorida, Sébastien, Saint Valentin, Vincent
    • 10 lettres: Andromaque, Cymberline, Fortinbras, frère Jean, roi Henri
    • 11 lettres: Mark Antony
    • 12 lettres: Docteur Caius, Roi Richard, Lady Capulet, Lady Macbeth, Lady Macduff, Prince Henry, la reine Elinor
    • 13 lettres: Jean de Gaunt, Jules César, Lady Montague, Maîtresse Ford, Maîtresse Page
    • 14 lettres: Frère Laurence, L'apothicaire
    • 15 lettres: Christopher Sly, Octavius ​​César
    • 17 lettres: John of Lancaster, Mistress Overdone, le duc de Milan
    • 18 lettres: le duc de Venise
    • 24 lettres: l'abbé de Westminster
    • 28 lettres: l'archevêque de Cantorbéry
    • Si vous avez vraiment besoin de plus, vous devriez absolument envisager d'utiliser la pile de chaque personnage.
NieDzejkob
la source
Notez que les caractères de plusieurs mots peuvent omettre des espaces après leur nom (du conseil de user202729 ), ils sont donc préférables aux caractères ne contenant qu'un mot
Jo King
5

Le "retournons à la scène X" peut être utilisé même si le personnage à qui on parle est en dehors de la scène. Donc au lieu de:

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 peux faire:

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
la source
5

Supprimer les espaces redondants

Outre les triviales (deux espaces adjacents, adjacents à une ponctuation, adjacents à une nouvelle ligne, à la fin) (à quelques exceptions près), l'espace après les jetons suivants peut être supprimé:

  • the sum of
  • let us
  • the ghost( comme ça ) (mais qui utiliserait ce personnage quand même)
  • if soet if not(enlever le ,après, et ne pas avoir besoin d'ajouter un espace Exemple:. if solet usact I)
  • listen to(ça listen tothymarche, comme ça )
  • et fondamentalement tous les jetons multi-mots .

Note: Ceci ne fonctionne pas avec l' interpréteur Perl . C'est probablement juste un effet involontaire causé par le comportement d'analyse de Flex. La "norme linguistique" n’est pas claire à ce sujet.

utilisateur202729
la source
Il est temps de revenir et d’éditer certaines de mes réponses ... Très belle trouvaille!
Jo King
Est-ce un bogue dans le tokenizer ou ce comportement est-il défini dans le langage?
Cœur
2
@ Cœur Voir mise à jour.
user202729
5

Vous n'êtes pas obligé de permuter les gens en conditions conditionnelles.

Par exemple,

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.

est plus long que

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
la source
1
WHOOps. fixation.
Oliver Ni
4

Au lieu de soustraire, ajouter des constantes

You is the difference between I and a big cat.

est plus long que

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

Les sauts peuvent être plus courts

Vous pouvez utiliser return tomême si la scène est en avance et vice versa. En fait, l'interprète ne se soucie même pas de l'omettre complètement. Cela signifie que ces trois déclarations sont équivalentes à 100%:

Let us proceed to Scene X.
Let us return to Scene X.
Let us Scene X.
NieDzejkob
la source
Jo King ( codegolf.stackexchange.com/a/164394/76162 ) a conclu que "Let us Scene X" est suffisant.
Ed Wynn
@ EdWynn Bon à savoir. J'ai réécrit la réponse pour inclure ceci.
NieDzejkob
4

Utilisez une seule scène

Normalement, vous ne pouvez pas réutiliser la première scène d'un acte, car elle a toujours la [Enter Ajax and Puck]première chose à faire. Cependant, vous pouvez commencer par ceci [Exeunt]pour pouvoir réutiliser la première scène d’une pièce. [Exeunt]est un octet plus court que de déclarer une nouvelle scène et passer à un acte équivaut à deux octets de moins que de sauter à une scène.

Ex: un programme de chat simple

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

Essayez-le en ligne!

À:

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

Essayez-le en ligne!

Jo King
la source
3

Utilisez des mots plus courts

Exemples:

Thyet thyselfsont plus courts que youret yourself.

Isest plus court que are.

et plus...

Oliver Ni
la source
3

Utiliser des conditionnels intelligents

Par exemple, n'utilisez pas

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

Mais plutôt,

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

If (so|not) ne doit pas immédiatement suivre la comparaison.

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
la source
4
En fait, les résultats d'une comparaison sont stockés sous la forme d'un drapeau et peuvent être utilisés de manière répétée au cours de transitions de scènes ou de plusieurs If sosecondes. Cela peut être utile pour éviter de répéter des comparaisons!
Jo King
2

Utiliser des constantes pour stocker de grands nombres

Par exemple, si vous avez

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!

Vous pouvez simplement déclarer une autre personne en haut

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

et changez votre code en

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
la source
8
L'interprète officiel ne supporte pas la déclaration de constantes comme celle-là.
NieDzejkob
2

Les gotos ne sont pas les seules commandes utilisables avec 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
la source
2

Toutes les nouvelles lignes sont ignorées

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

Utiliser <ou >au lieu de==

Ne s'applique pas à toutes les situations, mais c'est un peu plus court:

Puck == Ajax

Puck:Is I as bad as you?

Puck <Ajax ou Puck> Ajax

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

4 octets plus court pour les deux!

Jo King
la source
2

Vous n'avez pas besoin de la fin .ou !.

Essayez-le en ligne!

Cela peut aussi être utilisé avant une [. (merci jimmy23013)

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

Exemples:

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

Ne fonctionne pas dans:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](juste après Scene {number}:) (cependant ça marche, je ne sais pas pourquoi)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (et variantes plus courtes)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (et variantes plus courtes)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(seulement après vide Recall, Recall xou Recall@fonctionne etc.)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(sans mind)
utilisateur202729
la source
Cela ne fonctionne pas dans certaines situations où vous avez déjà supprimé un mot, tel que Speak thyouLet us Scene I
Jo King,
2

Utilisez 'deux fois' et la propriété distributive

Au lieu de:

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

Utilisation:

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

Cela économise 2 octets par twicepuisque 2 utilisations de bigsoit 8 octets (avec un espace) et twicen’est que de 6 octets.

Bonjour au revoir
la source