Golf un interprète violet
Le violet est un esolang conçu avec deux objectifs principaux:
- Être une minimisation d' Aubergine , car il n'y a tout simplement pas assez de langues à instruction unique auto-modifiantes.
- Pour admettre la possibilité d' interprètes de golf terriblement petits . Ma première passe à un interprète Python 2 raisonnablement complet n'est que de 702 octets, et je suis sûr qu'un golfeur plus expérimenté pourrait en raser un peu.
Votre objectif est d'écrire un interprète pour cette langue.
Informations sur le violet:
Un programme violet est une séquence de caractères placée dans une matrice de mémoire adressable infinie de telle sorte que le premier caractère du programme soit placé à l'adresse zéro. Le reste du tableau (avant et après le stockage du programme Purple) est initialisé à zéro.
Il existe trois registres en violet, appelés a et b et i , chacun pouvant contenir un entier signé et est initialisé à zéro. i est également le pointeur d'instruction et pointe toujours sur l'instruction Purple en cours d'exécution.
À chaque cycle, l'interpréteur lira une séquence de trois caractères contigus à partir de l'emplacement de mémoire indiqué par le pointeur d'instruction et tentera d'exécuter cette séquence en tant qu'instruction violette. Ensuite, le pointeur d'instruction est toujours incrémenté de 3.
Syntaxiquement, l'instruction Purple se compose de trois caractères (ou de leurs codages) consécutifs, comme " xyz ".
Le premier caractère x peut être l'un des suivants:
abABio
Ces symboles ont la signification suivante:
a - Place the result in register a.
b - Place the result in register b.
A - Place the result in the location in memory referred to by register a.
B - Place the result in the location in memory referred to by register b.
i - Set the instruction pointer to the result.
o - Output the result to stdout.
Les deux autres octets y et z peuvent être l'un des suivants:
abABio1
Chacun de ces symboles a la signification suivante:
a - Return the contents of register a.
b - Return the contents of register b.
A - Return the contents of the memory array at the address stored in register a.
B - Return the contents of the memory array at the address stored in register b.
i - Return the contents of register i (the instruction pointer).
o - Return the value of a single character read from stdin.
1 - Return the literal numeric value 1.
Après avoir récupéré l'instruction, l'interpréteur Purple évaluera y puis z , soustraira le résultat de z du résultat de y , puis effectuera l'action indiquée par x sur la différence.
Si la séquence de trois caractères (ou leurs codages) n'est pas une instruction Purple valide, l'interpréteur s'arrête immédiatement sans donner d'erreurs.
Votre interprète doit:
- Soyez un programme complet, pas une fonction.
- Ne sortez jamais vers stderr, sauf si EOF est lu .
- Comportement identique à l'implémentation de référence sur toutes les entrées bien formées qui n'impliquent pas de très grands nombres, y compris les programmes de test donnés ci-dessous. (Eh bien, à l'identique jusqu'au moment - il peut fonctionner plus lentement, mais pas trop!)
Vous pouvez fournir le programme à l'interpréteur sous la forme que vous souhaitez: le lire à partir d'un fichier, l'intégrer dans le programme sous forme de chaîne ou le lire à partir de stdin.
Cas de test:
Le programme
ooo
lorsqu'il est exécuté avec une entrée
z!
devrait céder
Y
Le programme
bbboobiii
lorsqu'il est exécuté avec une entrée
It's a cat program.
(ou toute autre entrée) devrait donner
It's a cat program.
(ou toute autre entrée reçue), puis recommencez et recommencez .
Le programme
Aoab11bi1bABoAaiba
lorsqu'il est exécuté avec une entrée
0
devrait céder
0
puis s'arrêter, mais lorsqu'il est exécuté avec une entrée
1
devrait continuer à sortir
1
pour toujours.
Le programme
b1bbb1oAbabaa1ab1Ab1Bi1b
devrait céder
b1bbb1oAbabaa1ab1Ab1Bi1b
Le programme
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
devrait céder
Hello, World!
Notation:
C'est le code-golf , donc la source la plus courte en octets, telle que potentiellement modifiée par le bonus suivant, gagne.
Prime:
- -10% si votre interprète lit un nom de fichier depuis stdin ou depuis un argument de ligne de commande et charge le programme à partir du fichier.
uint32
pour les caractères et MAXINT pour les caractères