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.
Respostas:
(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.
fonte
(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.
e
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 código-golfe com a SPL, então ...
fonte
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. ;)Qualquer numeral romano é um número de cena válido
Isso significa que, em vez de:
Você pode fazer:
fonte
D
um numeral romano válido? IIRC, é de 500 (mas não tenho certeza se é válida em SPL)Remova palavras desnecessárias
Veja isto (inserindo novas linhas e espaços em branco para facilitar a leitura):
Parece muito golf eh? Aqui está uma forma ininteligível ainda mais simples:
Para referência, veja uma lista de palavras facilmente removíveis do código:
big cat
, caso contrário, você ainda precisa do 'é'Lenda:
X
eY
são constantes comocat
,I
ouyou
[op]
são operações comonicer
,the sum of
Se eu me deparar com outros, adicionarei à lista.
Para referência extra, aqui está o cabeçalho mais curto para iniciar um programa:
Experimente online!
Adicione Page e Ford como caracteres extras, conforme necessário.
fonte
Use palavras curtas
Então aqui estão eles:
a
vez dean
outhe
, exceto as expressõesthe sum of
e similares, pois elas não funcionarãoa
.am
,be
ouis
em vez deare
ouart
.I
vez deme
oumyself
.you
em vez dethee
,thou
,thyself
ouyourself
.big
para adjetivos.cat
para números positivos.pig
para números negativos.zero
para zero.worse
paraA < B
(em vez desmaller
oupunier
).nicer
paraA > B
(em vez debetter
,bigger
,fresher
,friendlier
oujollier
).fonte
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:
Você pode fazer:
fonte
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 so
eif not
(remover o,
depois disso, e não precisa adicionar qualquer espaço Exemplo:.if solet usact I
)listen to
(listen tothy
funciona assim )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.
fonte
Você não precisa mudar as pessoas em condicionais.
Por exemplo,
é maior que
fonte
Em vez de subtrair, adicione constantes
é maior que
fonte
Saltos podem ser mais curtos
Você pode usar
return to
mesmo 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:fonte
Let usscene X
é o suficiente .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
Experimente online!
Para:
Experimente online!
fonte
Use palavras mais curtas
Exemplos:
Thy
ethyself
são mais curtos queyour
eyourself
.Is
é mais curto queare
.e mais...
fonte
Use condicionais inteligentes
Por exemplo, não use
Mas sim,
fonte
If (so|not)
não precisa seguir imediatamente a comparação.fonte
If so
s. Isso pode ser útil para evitar comparações repetidas!Use constantes para armazenar grandes números
Por exemplo, se você tiver
Você pode simplesmente declarar outra pessoa no topo
e mude seu código para
fonte
Gotos não são os únicos comandos utilizáveis com
If (so|not)
fonte
Todas as novas linhas são ignoradas
fonte
Use
<
ou em>
vez de==
Não é aplicável a todas as situações, mas é um pouco mais curto:
Puck == Ajax
Disco <Ajax ou Disco> Ajax
4 bytes mais curtos para ambos!
fonte
Você não precisa do final
.
ou!
.Experimente online!
Isso também pode ser usado antes de a
[
. (obrigado jimmy23013)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 depoisScene {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 vazioRecall
,Recall x
ouRecall@
etc. obras),.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy
(semmind
)fonte
Speak thy
ouLet us Scene I
Use 'duas vezes' e a propriedade distributiva
Ao invés de:
Usar:
Isso economiza 2 bytes por cada
twice
vez que 2 usos debig
são 8 bytes (com um espaço) etwice
são apenas 6 bytes.fonte