.
Ajax,.
Ford,.
Act I:.
Scene I:.
[Enter Ajax and Ford]
Scene II:.
Ford:
Open your mind.Is sky nicer than you?If so, let us return to scene IV.
Ajax:
Open your mind.You is sum you and sum big big big big big big pig and big big big big cat!
Scene III:.
Ford:
Speak thy mind.
Ajax:
You is sum you and pig!Is you as big as zero?If so, let us return to scene II.Let us return to scene III.
Scene IV:.
[Exeunt]
Versão não destruída:
The Decoding of the Lengths of Veronan Runs - A Drama of PPCG.
Romeo, quite a character.
Juliet, Romeo's lover and multiplicand.
Act I: In which the lengths of runs are decoded.
Scene I: A silent entrance.
[Enter Romeo and Juliet]
Scene II: In which neither Romeo nor Juliet believes the other open-minded.
Juliet:
Open your mind. Is my mother jollier than thou? If so,
we must proceed to scene IV.
Romeo:
Open your mind. Thou art the sum of thyself and the sum of my good aunt and
the difference between nothing and the quotient of the square of twice the sum
of thy foul fat-kidneyed goat and thy death and thy evil variable!
Scene III: In which Romeo snaps and brutally insults Juliet.
Juliet:
Speak thy mind.
Romeo:
Thou art the sum of thyself and a hog! Art thou as rotten as nothing? If so,
let us return to scene II. Let us return to scene III.
Scene IV: Finale.
[Exeunt]
Estou usando o compilador Python SPL do drsam94 , que possui alguns bugs (é por isso que, por exemplo, eu uso em Open your mind
vez da Open thy mind
versão golfed).
Para executar este programa, use:
$ python splc.py rld.spl > rld.c
$ gcc rld.c -o rld.exe
$ echo -n ":144,1'1" | ./rld
:4444,'
Como funciona
SPL é uma linguagem de programação esotérica projetada para fazer com que os programas se pareçam com as peças de Shakespeare. Isso é feito usando caracteres como variáveis, e o processamento é realizado fazendo com que os caracteres digam coisas um ao outro.
The Decoding of the Lengths of Veronan Runs - A Drama of PPCG.
Este é o título da peça; é ignorado pelo compilador.
Romeo, quite a character.
Juliet, Romeo's lover and multiplicand.
Aqui estamos declarando as variáveis usadas no restante do programa. Tudo entre ,
e .
é ignorado pelo compilador. Nesse caso, declaramos que era Romeo
usado para reter o caractere que está sendo decodificado e Juliet
usado para reter a duração da execução do caractere.
Act I: In which the lengths of runs are decoded.
Aqui declaramos o primeiro e único ato no programa. Atos e cenas são como rótulos; eles podem ser acessados a qualquer momento usando let us return to scene II
ou alguma variante disso. Nós usamos apenas um ato, porque é suficiente para nossas necessidades. Novamente, qualquer coisa entre :
e .
é ignorada pelo compilador.
Scene I: A silent entrance.
Aqui declaramos a primeira cena. As cenas são numeradas em algarismos romanos: o primeiro é Scene I
, o segundo Scene II
e assim por diante.
[Enter Romeo and Juliet]
Esta é uma direção de palco; nele, dizemos aos Romeo
e Juliet
variáveis para vir para o "palco". Somente duas variáveis podem estar no "palco" de uma só vez; o estágio é usado para que o compilador possa descobrir qual variável está endereçando e quando eles falam. Como temos apenas duas variáveis, Romeu e Julieta permanecerão no palco pelo período do programa.
Scene II: In which neither Romeo nor Juliet believes the other open-minded.
Outra declaração de cena. A cena II será saltada para decodificar outra duração.
Juliet:
Essa forma de declaração significa que Juliet começará a falar. Tudo até a próxima Romeo:
direção do palco ou declaração de cena / ato será uma frase falada por Julieta e, assim, "eu" se referirá a Julieta, "você" / "tu" a Romeu, etc.
Open your mind.
Este comando armazena o valor ordinal do caractere único de STDIN em Romeo
.
Is my mother jollier than thou?
No SPL, os substantivos são traduzidos para 1 ou -1, dependendo de serem positivos ou negativos. Nesse caso, my mother
traduz para 1. Adjetivos (positivos ou negativos) multiplicam seu substantivo por 2.
Esta é uma questão; nele, Julieta pergunta se my mother
(AKA 1) é "mais alegre" que Romeu. Os comparativos são traduzidos para less than
(se forem negativos, como worse
) ou greater than
(se forem positivos, como jollier
). Portanto, esta questão se resume a Is 1 greater than you?
.
A razão pela qual fazemos esta pergunta é detectar o final da entrada. Como o valor de EOF
varia de acordo com a plataforma, mas geralmente é menor que 1, usamos isso para detectá-lo.
If so, we must proceed to scene IV.
Se a pergunta anterior foi avaliada true
, pulamos para a cena IV - que é simplesmente o fim do programa. Em resumo, se detectarmos um EOF, encerraremos o programa.
Romeo:
Agora é a linha de Romeu: "eu" e "você" se referem a Romeu e Julieta, respectivamente.
Open your mind.
Novamente, essa instrução coloca o valor ordinal de um único caractere de STDIN em Juliet, que nesse caso é o comprimento de execução do caractere armazenado Romeo
.
Thou art the sum of thyself and the sum of my good aunt and the difference
between nothing and the quotient of the square of twice the sum of thy foul
fat-kidneyed goat and thy death and thy evil variable!
Este é muito longo para analisar em detalhes, mas confie em mim no que se refere Juliet -= 48
. Fazemos isso porque Juliet mantém o valor ASCII de um numeral e ord('0') == 48
; ao subtrair 48, convertemos do valor ASCII de um número para o próprio número.
Scene III: In which Romeo snaps and brutally insults Juliet.
Outra declaração de cena. Este é para o loop no qual repetidamente imprimimos o valor de caractere Romeo
, Juliet
times.
Juliet:
Speak thy mind.
Essa afirmação faz com que Romeu imprima seu valor como personagem; isto é, qualquer valor de caractere que foi armazenado anteriormente no Romeo agora é exibido.
Romeo:
Thou art the sum of thyself and a hog!
Um porco é um substantivo negativo, então se a hog
traduz em -1; portanto, esta declaração é avaliada como Juliet -= 1
.
Art thou as rotten as nothing?
Romeu pergunta aqui se Julieta é "tão podre quanto" ou igual a 0.
If so, let us return to scene II.
Se o valor de Juliet for 0, retornamos à cena II para decodificar a duração de outra personagem.
Let us return to scene III.
Senão, voltamos à cena III para exibir novamente o personagem de Romeu.
Scene IV: Finale.
[Exeunt]
Esta declaração final da cena é apenas um marcador para o final do programa. A [Exeunt]
direção do palco é necessária para que o compilador gere a cena final.