Consejos para jugar golf en el lenguaje de programación de Shakespeare

43

¿Qué consejos generales tiene para jugar al golf en el lenguaje de programación de Shakespeare? Estoy buscando ideas que se puedan aplicar a problemas de código de golf y que también sean al menos algo específicas para SPL (por ejemplo, "eliminar comentarios" no es una respuesta).

Por favor, publique un consejo por respuesta.

Loovjo
fuente
17
No estoy seguro de que pueda jugar golf SPL. SPL es tan detallado que casi siento que esta pregunta necesita la etiqueta de arrastre de código. : P
Alex A.
Simplemente no puedes jugar golf SPL. Al menos, para mi débil conocimiento de la tradición shakesperiana ...
Rodolfo Dias
@RodolfoDias: ¿débil? Creo que eres el erudito residente de Shakespeare en PPCG.
Alex A.
8
@AlexA. Lo cual puede no ser algo bueno: solo significa que estoy lo suficientemente demente como para tratar de entender SPL :-)
Rodolfo Dias
@AlexA. Sp puede hacerlo ...
Conor O'Brien

Respuestas:

18

(Bueno ... dado que este es mi lenguaje adoptado 1 , siento que estoy obligado a agregar algo aquí)

Use nombres cortos de variables

Sí, sí, sí, eso es bastante estándar para el golf de código, solo usas nombres de variables de una letra, no hay noticias aquí. O hay Debido a que los chaps que crearon SPL eran lo suficientemente extraños como para no permitir ningún nombre para las variables de su lenguaje: deben provenir de obras de Shakesperian que, en términos de longitud del personaje, es un dolor en la lucha real, pero, si estás codificando en SPL Ya lo sabes. Por lo tanto, mi consejo sería utilizar caracteres con nombres cortos, como Ajax , Ford , Page o Puck , en lugar del Arzobispo de Canterbury , por ejemplo.

Eso es todo lo que tengo, me temo.


1 - ya que mis habilidades en Java son equivalentes a las de un recién nacido.

Rodolfo Dias
fuente
13

(después de hacer la anterior, solo recordé algunas cosas)

Elige tu código cuidadosamente

Un ejemplo, para tratar de explicar lo que esto significa.

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

y

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

produce el mismo resultado exacto, que es hacer que el personaje que se habla asuma el valor 64 (ya que, suponiendo que lea mi larga batalla con SPL , sabe que ambas líneas son equivalentes a 2 * 2 * 2 * 2 * 2 * 2 * 1); sin embargo, el primero tiene 59 bytes, mientras que el segundo tiene un bytecount de 107.

Aún así, nadie estará lo suficientemente demente como para entrar en un desafío de con SPL, así que ...

Rodolfo Dias
fuente
10
¿Podrías usar el mismo adjetivo varias veces en una descripción? Por ejemplo a big big big big big big cat, ¿guardar 4 bytes más? Sé que arruina el arte ... pero este es el código golf después de todo. ;)
DLosc
@DLosc, por lo que he visto, no hay nada que te prohíba hacer eso. Entonces ... eres mejor golfista que yo ^ _ ^
Rodolfo Dias
1
Ejem. No llames a Robert Fraser demente. codegolf.stackexchange.com/a/69360/43394
wizzwizz4
12

Cualquier número romano es un número de escena válido.

Eso significa que en lugar de:

Scene I
Scene II
Scene III
Scene IV
Scene V

Tu puedes hacer:

Scene L
Scene I
Scene C
Scene X
Scene V
NieDzejkob
fuente
Es Dun número romano válido? IIRC, son 500 (pero no estoy seguro si es válido en SPL)
Giuseppe
@Giuseppe No entiendo por qué no solo verificas eso, sino que el intérprete oficial de SPL admite M, C, D, X, L, I y V.
NieDzejkob
10

Eliminar palabras innecesarias

Mire esto (insertando nuevas líneas y espacios en blanco para facilitar la lectura):

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]

Se ve muy golfista ¿eh? Aquí hay una forma ininteligible aún más simple:

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!

Como referencia, aquí hay una lista de palabras fácilmente extraíbles del código:

  • Habla tu mente -> Habla tu
  • Abre tu corazón -> Abre el corazón *
  • Escucha tu corazón -> Escucha tothy
  • Abre tu mente -> Abre la mente *
  • Eres un gato -> Tu gato *
    • Solo se aplica a constantes como big cat, de lo contrario, aún necesita el 'es'
  • Volvamos a -> Permítanos
  • ¿Ser X [op] que Y? -> Ser X [op] Y?
  • Usted es [op] de X e Y -> Usted es [op] de X Y
  • [Exeunt] -> (eliminado por completo)

Leyenda:

  • Xy Yson constantes como cat, Ioyou
  • [op]son operaciones como nicer,the sum of
  • * significa que puedes eliminar la puntuación si es la última oración de la obra

Si me encuentro con algún otro, lo agregaré a la lista.

Para referencia adicional, aquí está el encabezado más corto para comenzar un programa:

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

Pruébalo en línea!

Agregue Page y Ford como caracteres adicionales según sea necesario.

Jo King
fuente
1
Si necesita aún más personajes, hay una lista aquí
NieDzejkob
: | a rayas
solo ASCII
6

Usa palabras cortas

Así que aquí están:

  • Use en alugar de ano the, excepto las expresiones the sum ofy similares, ya que no funcionarán con a.
  • Use am, beo en islugar de areo art.
  • Use en Ilugar de meo myself.
  • Usar youen lugar de thee, thou, thyselfo yourself.
  • Uso bigpara adjetivos.
  • Úselo catpara números positivos.
  • Usar pigpara números negativos.
  • Usar zeropara cero.
  • Use worsepara A < B(en lugar de smallero punier).
  • Utilizar nicerpara A > B(en lugar de better, bigger, fresher, friendliero jollier).
  • Nombres de personajes:
    • 4 letras: Ajax, Ford, Page, Puck
    • 5 letras: Egeus, Helen, Julia, Lucio, Mopsa, Paris, Pinch, Priam, Regan, Robin, Romeo, Timon, Titus, Venus, Viola
    • 6 letras: 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 letras: Adriana, Aemilia, Agrippa, Antonio, Capulet, Cassius, Claudio, Dionyza, Escalus, Goneril, Horatio, Leonato, Luciana, Macbeth, Macduff, Malcolm, Mariana, Miranda, Octavia, Ophelia, Orlando, Othello, Pantino, Proteus , Publio, Poco profundo, Shylock, Delgado, Solinus, Teseo, Titania, Troilo, Ulises
    • 8 letras: Achilles, Beatrice, Benedick, Benvolio, Claudius, Cordelia, Cressida, Dogberry, Don John, Falstaff, Gertrude, Hermonie, Isabella, Lysander, Mercutio, Montague, Pericles, Polonius, Pompeius, Prospero, Rosalind, Stephano
    • 9 letras: Agamenón, Antíoco, 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 letras: Andromache, Cymberline, Fortinbras, Fray John, King Henry
    • 11 letras: Mark Antony
    • 12 letras: Doctor Caius, King Richard, Lady Capulet, Lady Macbeth, Lady Macduff, Prince Henry, Queen Elinor
    • 13 letras: John of Gaunt, Julius Caesar, Lady Montague, Mistress Ford, Mistress Page
    • 14 letras: Fray Laurence, El boticario
    • 15 letras: Christopher Sly, Octavius ​​Caesar
    • 17 cartas: John de Lancaster, Mistress Overdone, The Duke of Milan
    • 18 letras: el duque de Venecia
    • 24 letras: el abad de Westminster
    • 28 letras: el arzobispo de Canterbury
    • Si realmente necesitas más, definitivamente deberías considerar usar la pila de cada personaje.
NieDzejkob
fuente
Tenga en cuenta que los caracteres de varias palabras pueden omitir cualquier espacio después de su nombre (del consejo de user202729 ), por lo que son preferibles a los caracteres con una sola palabra
Jo King,
5

El "vamos a volver a la escena X" se puede usar incluso si el personaje con el que se habla está fuera del escenario. Entonces en lugar 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 puedes hacer:

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
fuente
5

Eliminar espacios redundantes

Además de los triviales (dos espacios adyacentes, adyacentes a una puntuación, adyacentes a una nueva línea, al final) (con algunas excepciones), se puede eliminar el espacio después de los siguientes tokens:

  • the sum of
  • let us
  • the ghost( así ) (pero quién usaría este personaje de todos modos)
  • if soy if not(quitar el ,después de esto, y no es necesario añadir ningún espacio Ejemplo:. if solet usact I)
  • listen to(así listen tothyfunciona, así )
  • y básicamente cualquier token de varias palabras .

Nota: Esto no funciona con el intérprete de Perl . Probablemente sea solo un efecto involuntario causado por el comportamiento de análisis de Flex. El "estándar de idioma" no está claro al respecto.

usuario202729
fuente
Es hora de retroceder y editar algunas de mis respuestas ... ¡Muy buen hallazgo!
Jo King
¿Es eso un error en el tokenizer, o ese comportamiento está definido en el lenguaje?
Cœur
2
@ Cœur Ver actualización.
user202729
5

No tiene que cambiar personas en condicionales.

Por ejemplo,

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.

es más largo 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
fuente
1
WHOOps fijación.
Oliver Ni
4

En lugar de restar, agregue constantes

You is the difference between I and a big cat.

es más largo que

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

Los saltos pueden ser más cortos.

Puede usar return toincluso si la escena está por delante, y viceversa. De hecho, al intérprete ni siquiera le importa si lo omite por completo. Esto significa que estas tres declaraciones son 100% equivalentes:

Let us proceed to Scene X.
Let us return to Scene X.
Let us Scene X.
NieDzejkob
fuente
Jo King ( codegolf.stackexchange.com/a/164394/76162 ) descubrió que "Déjenos escena X" es suficiente.
Ed Wynn
@EdWynn es bueno saberlo. Reescribí la respuesta para incluir esto.
NieDzejkob
66
Let usscene Xes suficiente .
user202729
4

Use solo una escena

Normalmente, no se puede reutilizar la primera escena de un acto, ya que siempre tiene lo [Enter Ajax and Puck]primero. Sin embargo, puedes hacer un prefacio [Exeunt]para poder reutilizar la primera escena de una obra. [Exeunt]es un byte más corto que declarar una nueva escena, y saltar a un acto es dos bytes menos que saltar a una escena.

Por ejemplo: un programa simple para gatos

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

Pruébalo en línea!

A:

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

Pruébalo en línea!

Jo King
fuente
3

Usa palabras más cortas

Ejemplos:

Thyy thyselfson más cortos que youry yourself.

Ises más corto que are.

y más...

Oliver Ni
fuente
3

Use condicionales inteligentes

Por ejemplo, no uses

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

Sino más bien

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

If (so|not) no tiene que seguir de inmediato la comparación.

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
fuente
44
De hecho, los resultados de una comparación se almacenan como una bandera y se pueden usar repetidamente en las transiciones de escena o en varios If sosegundos. ¡Esto puede ser útil para evitar repetir las comparaciones!
Jo King
2

Use constantes para almacenar grandes números

Por ejemplo, si tienes

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!

Puedes declarar a otra persona en la parte superior

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

y cambia tu código a

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
fuente
8
El intérprete oficial no admite la declaración de constantes como esa.
NieDzejkob
2

Gotos no son los únicos comandos utilizables 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.
NieDzejkob
fuente
2

Se ignoran todas las líneas nuevas.

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

Use <o en >lugar de==

No es aplicable a todas las situaciones, pero es bastante más corto:

Puck == Ajax

Puck:Is I as bad as you?

Puck <Ajax o Puck> Ajax

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

¡4 bytes más cortos para ambos!

Jo King
fuente
2

No necesitas el final .o !.

Pruébalo en línea!

Esto también se puede usar antes de a [. (gracias jimmy23013)

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

Ejemplos:

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

No funciona en:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](justo después Scene {number}:) (sin embargo, esto funciona, no sé por qué)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (y variantes más cortas)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (y variantes más cortas)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(sólo después de vacío Recall, Recall xo Recall@etc. obras)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(sin mind)
usuario202729
fuente
Esto no funciona en algunas situaciones en las que ya ha eliminado una palabra, como Speak thyoLet us Scene I
Jo King
2

Use 'dos ​​veces' y la propiedad distributiva

En lugar de:

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

Utilizar:

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

Esto ahorra 2 bytes por cada twice2 usos de big8 bytes (con un espacio) y twicesolo 6 bytes.

Hola Adios
fuente