Dicas para jogar golfe na linguagem de programação Shakespeare

43

Que dicas gerais você tem para jogar golfe na linguagem de programação Shakespeare? Estou procurando idéias que possam ser aplicadas a problemas de código-golfe e que também sejam pelo menos um pouco específicas para o SPL (por exemplo, "remover comentários" não é uma resposta).

Poste uma dica por resposta.

Loovjo
fonte
17
Não tenho certeza de que você pode jogar golfe na SPL. O SPL é tão detalhado que eu quase sinto que essa pergunta precisa da tag trolling de código. : P
Alex A.
Você simplesmente não pode jogar golfe na SPL. Pelo menos, a meu conhecimento fraco de lore shakespeariano ...
Rodolfo Dias
@RodolfoDias: Fraco? Acho que você é o estudioso residente de Shakespeare no PPCG.
Alex A.
8
@AlexA. Que pode não ser uma coisa boa: ele apenas significa que estou demente o suficiente para tentar entender SPL :-)
Rodolfo Dias
@AlexA. Sp pode fazê-lo ...
Conor O'Brien

Respostas:

18

(Bem ... como essa é minha linguagem adotada 1 , sinto que sou obrigado a adicionar algo aqui)

Use nomes curtos de variáveis

Sim, sim, sim, isso é bastante padrão no código de golfe, você apenas usa nomes de variáveis ​​com uma letra, sem notícias aqui. Ou existe? Como os caras que criaram o SPL foram malucos o suficiente para não permitir nenhum nome para as variáveis ​​de seu idioma: eles devem vir de peças shakesperianas que, em termos de tamanho de personagem, são uma dor de cabeça - mas, se você estiver codificando em SPL , você já sabe disso. Portanto, meu conselho seria usar personagens com nomes curtos, como Ajax , Ford , Page ou Puck , em vez de O Arcebispo de Canterbury , por exemplo.

É tudo o que tenho, receio.


1 - pois minhas habilidades em Java são equivalentes às de um recém-nascido.

Rodolfo Dias
fonte
13

(depois de fazer o anterior, lembrei-me de algumas coisas)

Escolha seu código com cuidado

Um exemplo, para tentar explicar o que isso significa.

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!

produz exatamente o mesmo resultado, que faz com que o personagem que está sendo falado assuma o valor 64 (desde que, assumindo que você leu minha longa batalha com o SPL , você sabe que as duas linhas são equivalentes a 2 * 2 * 2 * 2 * 2 * 2 * 1); no entanto, o primeiro possui 59 bytes, enquanto o segundo possui um número de bytes de 107.

Ainda assim, ninguém será demente o suficiente para entrar em um desafio de com a SPL, então ...

Rodolfo Dias
fonte
10
Você poderia usar o mesmo adjetivo várias vezes em uma descrição? Por exemplo a big big big big big big cat, economizando mais 4 bytes? Eu sei que isso arruina a arte ... mas isso é código de golfe, afinal. ;)
DLosc 21/04
@DLosc, pelo que vi, não há nada proibindo você de fazer isso. Então ... você é um golfista melhor do que me ^ _ ^
Rodolfo Dias
1
Ahem. Não chame Robert Fraser de louco. codegolf.stackexchange.com/a/69360/43394
wizzwizz4
12

Qualquer numeral romano é um número de cena válido

Isso significa que, em vez de:

Scene I
Scene II
Scene III
Scene IV
Scene V

Você pode fazer:

Scene L
Scene I
Scene C
Scene X
Scene V
NieDzejkob
fonte
é Dum numeral romano válido? IIRC, é de 500 (mas não tenho certeza se é válida em SPL)
Giuseppe
@Giuseppe Eu não entendo por que você não apenas verificar se, mas o intérprete oficial SPL suporta M, C, D, X, L, I e V.
NieDzejkob
10

Remova palavras desnecessárias

Veja isto (inserindo novas linhas e espaços em branco para facilitar a leitura):

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]

Parece muito golf eh? Aqui está uma forma ininteligível ainda mais simples:

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!

Para referência, veja uma lista de palavras facilmente removíveis do código:

  • Fale a sua mente -> Fale a sua
  • Abra seu coração -> Abra o coração *
  • Escute teu coração -> Escute tothy
  • Abra sua mente -> Mente aberta *
  • Você é um gato -> você gato *
    • Aplica-se apenas a constantes como big cat, caso contrário, você ainda precisa do 'é'
  • Vamos voltar para -> Vamos
  • Seja X [op] que Y? -> Seja X [op] Y?
  • Você é [op] de X e Y -> Você é [op] deX Y
  • [Exeunt] -> (totalmente removido)

Lenda:

  • Xe Ysão constantes como cat, Iouyou
  • [op]são operações como nicer,the sum of
  • * significa que você pode remover a pontuação se for a última frase da peça

Se eu me deparar com outros, adicionarei à lista.

Para referência extra, aqui está o cabeçalho mais curto para iniciar um programa:

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

Experimente online!

Adicione Page e Ford como caracteres extras, conforme necessário.

Brincadeira
fonte
1
Se você precisar de ainda mais personagens, há uma lista aqui
NieDzejkob
: | listrado
somente ASCII
6

Use palavras curtas

Então aqui estão eles:

  • Use em avez de anou the, exceto as expressões the sum ofe similares, pois elas não funcionarão a.
  • Use am, beou isem vez de areou art.
  • Use em Ivez de meou myself.
  • Use youem vez de thee, thou, thyselfou yourself.
  • Use bigpara adjetivos.
  • Use catpara números positivos.
  • Use pigpara números negativos.
  • Use zeropara zero.
  • Use worsepara A < B(em vez de smallerou punier).
  • Use nicerpara A > B(em vez de better, bigger, fresher, friendlierou jollier).
  • Nomes dos personagens:
    • 4 letras: Ajax, Ford, Page, Puck
    • 5 letras: Egeus, Helen, Julia, Lucio, Mopsa, Paris, Beliscar, Príamo, Regan, Robin, Romeu, Timon, Tito, Vênus, 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, Capuleto, Cássio, Cláudio, Dionyza, Escalus, Goneril, Horatio, Leonato, Luciana, Macbeth, Macduff, Malcolm, Mariana, Miranda, Octavia, Ofélia, Orlando, Othello, Pantino, Proteus Publius, Raso, Shylock, Esbelto, Solinus, Teseu, Titânia, Troilus, Ulisses
    • 8 letras: Aquiles, Beatrice, Benedick, Benvolio, Claudius, Cordelia, Cressida, Dogberry, Don John, Falstaff, Gertrude, Hermonie, Isabella, Lisandro, Mercutio, Montague, Péricles, Polonius, Pompéia, Prospero, Rosalind, Stephano
    • 9 letras: Agamenon, Antíoco, Autólito, Baltasar, Brabâncio, Cassandra, Cleópatra, Cornélio, Demétrio, Desdêmona, Donalbain, Don Pedro, Fernando, Francisca, Hipólita, Rei João, Rei Lear, Lychorida, Sebastian, O Fantasma, Valentim, Vincentio
    • 10 letras: Andrômaca, Cymberline, Fortinbras, Frei João, Rei Henrique
    • 11 letras: Mark Antony
    • 12 letras: Doutor Caius, Rei Richard, Lady Capulet, Lady Macbeth, Lady Macduff, Príncipe Henry, Rainha Elinor
    • 13 cartas: João de Gaunt, Júlio César, Lady Montague, Senhora Ford, Senhora Página
    • 14 letras: Frei Laurence, O Boticário
    • 15 cartas: Christopher Sly, Octavius ​​Caesar
    • 17 cartas: João de Lancaster, Senhora Overdone, Duque de Milão
    • 18 letras: O Duque de Veneza
    • 24 cartas: O Abade de Westminster
    • 28 cartas: O Arcebispo de Cantuária
    • Se você realmente precisa de mais, você definitivamente deve considerar o uso da pilha de cada personagem.
NieDzejkob
fonte
Note-se que personagens com várias palavras pode omitir quaisquer espaços após o seu nome (de ponta das user202729 ), então eles são preferíveis aos personagens com apenas uma palavra
Jo Rei
5

O "vamos voltar à cena X" pode ser usado mesmo que o personagem que está sendo falado esteja fora do palco. Então, em vez 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.

Você pode fazer:

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

Remover espaços redundantes

Além dos triviais (dois espaços adjacentes, adjacentes a uma pontuação, adjacentes a uma nova linha, no final) (com algumas exceções), o espaço após os seguintes tokens pode ser removido:

  • the sum of
  • let us
  • the ghost( assim ) (mas quem usaria esse personagem de qualquer maneira)
  • if soe if not(remover o ,depois disso, e não precisa adicionar qualquer espaço Exemplo:. if solet usact I)
  • listen to( listen tothyfunciona assim )
  • e basicamente quaisquer tokens de várias palavras .

Nota: Isso não funciona com o intérprete Perl . Provavelmente é apenas um efeito não intencional causado pelo comportamento de análise do Flex. O "padrão da linguagem" não é claro sobre isso.

user202729
fonte
Hora de voltar e editar algumas das minhas respostas ... Achado muito bom!
Jo Jo
Isso é um bug no tokenizer ou esse comportamento é definido no idioma?
Cœur
2
@ Cœur Ver atualização.
user202729
5

Você não precisa mudar as pessoas em condicionais.

Por exemplo,

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.

é maior 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
fonte
1
WHOOps. fixação.
Oliver Ni
4

Em vez de subtrair, adicione constantes

You is the difference between I and a big cat.

é maior que

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

Saltos podem ser mais curtos

Você pode usar return tomesmo que a cena esteja à frente e vice-versa. De fato, o intérprete nem se importa se você o omite completamente. Isso significa que essas três instruções são 100% equivalentes:

Let us proceed to Scene X.
Let us return to Scene X.
Let us Scene X.
NieDzejkob
fonte
Jo King ( codegolf.stackexchange.com/a/164394/76162 ) descobriu que "Deixe-nos a cena X" é suficiente.
Ed Wynn
@ Edwynn bom saber. Reescrevi a resposta para incluir isso.
NieDzejkob
4

Use apenas uma cena

Normalmente, você não pode reutilizar a primeira cena de um ato, uma vez que sempre tem a [Enter Ajax and Puck]primeira coisa. No entanto, você pode [Exeunt]usar o prefácio para poder reutilizar a primeira cena de uma peça. [Exeunt]é um byte mais curto do que declarar uma nova cena e pular para um ato é dois bytes a menos que pular para uma cena.

Por exemplo: Um programa simples para gatos

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

Experimente online!

Para:

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

Experimente online!

Brincadeira
fonte
3

Use palavras mais curtas

Exemplos:

Thye thyselfsão mais curtos que youre yourself.

Isé mais curto que are.

e mais...

Oliver Ni
fonte
3

Use condicionais inteligentes

Por exemplo, não use

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

Mas sim,

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

If (so|not) não precisa seguir imediatamente a comparação.

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
fonte
4
De fato, os resultados de uma comparação são armazenados como uma bandeira e podem ser usados ​​repetidamente em transições de cena ou em vários If sos. Isso pode ser útil para evitar comparações repetidas!
Jo Rei
2

Use constantes para armazenar grandes números

Por exemplo, se você tiver

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!

Você pode simplesmente declarar outra pessoa no topo

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

e mude seu código para

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
fonte
8
O intérprete oficial não suporta declarar constantes assim.
NieDzejkob
2

Gotos não são os únicos comandos utilizáveis ​​com 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
fonte
2

Todas as novas linhas são ignoradas

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

Use <ou em >vez de==

Não é aplicável a todas as situações, mas é um pouco mais curto:

Puck == Ajax

Puck:Is I as bad as you?

Disco <Ajax ou Disco> Ajax

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

4 bytes mais curtos para ambos!

Brincadeira
fonte
2

Você não precisa do final .ou !.

Experimente online!

Isso também pode ser usado antes de a [. (obrigado jimmy23013)

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

Exemplos:

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

Não funciona em:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](logo depois Scene {number}:) (no entanto, isso funciona, não sei por quê)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (e variantes mais curtas)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (e variantes mais curtas)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(só depois de vazio Recall, Recall xou Recall@etc. obras)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(sem mind)
user202729
fonte
Isso não funciona em algumas situações em que você já removeu uma palavra, como Speak thyouLet us Scene I
Jo King
2

Use 'duas vezes' e a propriedade distributiva

Ao invés de:

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

Usar:

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

Isso economiza 2 bytes por cada twicevez que 2 usos de bigsão 8 bytes (com um espaço) e twicesão apenas 6 bytes.

Olá adeus
fonte