N.Puck,.Page,.Ford,.Ajax,.Act I:.Scene I:.[Enter Puck and Ford]Puck:Listen to thy heart!Ford:You is the difference between a cat and I.Scene V:.[Exeunt][Enter Page and Ajax]Ajax:You is the difference between a cat and Ford.Scene X:.Page:You is the product of Puck and I.Is you as big as zero?If so,you is the sum of the sum of the sum of a big big big big big cat and a big big big cat and a big cat and a cat.If not,you big big big big big cat.Speak thy mind!Ajax:You is the sum of you and a cat.Is you as big as Ford?If not,let us return to Scene X.Page:You is the sum of a big big big cat and a big cat.Speak thy mind![Exit Page][Enter Puck]Ajax:You is the sum of you and a cat.Is you as big as Ford?If not,let us return to Scene V.[Exeunt]
Essayez-le en ligne!
Edit: a rendu la réponse compatible avec l'implémentation SPL officielle - je ne pouvais pas le faire fonctionner avant.
Golfé 6 octets car les numéros de scène ne doivent pas être consécutifs.
Explication :
SPL est un esolang conçu pour ressembler aux pièces de Shakespeare. Les noms positifs ont la valeur 1 (ici le chat est utilisé) et les noms négatifs ont la valeur -1 (aucun n'a été utilisé mais porc est l'un d'entre eux). Les adjectifs modifient une constante en la multipliant par 2.
N.
Tout jusqu'au premier point est le titre et n'a pas d'importance.
Puck,. row counter
Page,. column counter
Ford,. input
Ajax,. temp
Les caractères sont des variables entières, chacun d'eux a également une pile mais je n'avais pas besoin d'utiliser cette fonctionnalité.
Act I:.
Scene I:.
Les actes et les scènes sont utilisés comme étiquettes goto
[Enter Puck and Ford]
Cela n'est utile que si exactement deux personnages sont sur la scène en même temps.
Puck:Listen to thy heart!
Lit un nombre et fait en sorte que Ford s'en souvienne.
Ford:You is the difference between a cat and I.
Comme vous pouvez le voir, Engrish est valide dans SPL. Cela fait de la valeur de Puck "la différence entre un chat et moi". Mais qu'est-ce que ça veut dire?cat
est un nom positif, donc c'est Puck = 1 - Ford
.
Scene II:.
[Exeunt]
Exeunt est juste un pluriel de "sortie", et sans arguments signifie que tout le monde sur la scène sort.
[Enter Page and Ajax]
Ajax:You is the difference between a cat and Ford.
C'est aussi Page = 1 - Ford
mais c'est parlé par un acteur différent donc ce I
serait faux. Puisqu'il s'agit d'une boucle, je ne peux pas simplement copier la valeur dePuck
.
Scene III:.
Page:You is the product of Puck and I.
Assez simple maintenant. Ajax = Puck * Page
.
Is you as big as zero?
"aussi [adj] que" est le ==
opérateur.
If so,you is the sum of the sum of the sum of a big big big big big cat and a big big big cat and a big cat and a cat.
Si Ajax == 0 ... "chat" vaut 1, "gros chat" vaut 2, "gros gros chat" vaut 4 et ainsi de suite. Après avoir substitué les constantes simples, nous obtenons "la somme de la somme de la somme de 32 et 8 et 2 et 1" -> "la somme de la somme de 40 et 2 et 1" -> "la somme de 42 et 1" -> "43", qui est l'ASCII pour +.
If not,you fat fat fat fat fat cat.
sinon c'est juste "fat fat fat fat fat fat cat", donc Ajax obtient la valeur de 32, l'ASCII pour un espace.
Speak thy mind!
Il s'agit de la commande de sortie d'un caractère.
Ajax:
You sum you and cat.Is you as big as Ford?If not,let us return to Scene III.
Il s'agit d'une construction en boucle. "Vous additionnez vous et chat" incrémente Page, et if(Page != Ford) goto Scene III
. Le reste du programme utilise les mêmes composants, voici donc une version de pseudocode plus lisible:
Scène 1:
entrée = [numéro d'entrée];
ligne = 0 - entrée + 1;
Scene2:
col = 0 - entrée + 1;
Scene3:
temp = ligne * col;
si (temp == 0) {
temp = '+';
}autre{
temp = '';
}
putchar (temp);
Page = Page + 1;
if (Page! = Ford) goto Scene3;
Ajax = 10;
putchar (Ajax);
Puck = Puck + 1;
if (Puck! = Ford) goto Scene2;