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.
la source
uint32
pour les caractères et MAXINT pour les caractèresRéponses:
Pyth,
148128121 121 octets (ou 124 * .9 = 111,6, voir en bas)Suite de tests
Code donné sur la première ligne de STDIN, entré dans le programme Purple sur le reste de STDIN. Pour utiliser du code avec des sauts de ligne, utilisez une autre version en bas.
Golfé raisonnablement. Voici les sauts de ligne et l'indentation pour plus de clarté:
Fondamentalement, une
#
boucle effectue l'exécution et l'arrêt via une interruption d'erreur.a
etb
sont combinés en une seule variable,J
.Z
est le pointeur d'instruction.k
est entré dans le programme Violet.H
est la bande, représentée comme un dictionnaire.b
est le résultat actuel.Y
est le premier octet actuel de l'instruction.Lecture à partir d'un fichier:
Donnez le nom du fichier comme première ligne de STDIN. Essai:
la source
JavaScript (ES6), 292 octets
Explication
JavaScript réponses sont toujours bizarre quand
STDIN
etSTDOUT
sont nécessaires ...La première invite est l'entrée de la chaîne de programme. Chaque invite résultant d'une
o
instruction ne lit que le premier caractère.eval
est utilisé pour remplacer une phrase courante qui économise quelques octets. Non golfé et sans leeval
programme ressemble à ceci:la source
c="charCodeAt"
peut-il être remplacé par justec
?array[-1] = 1
est le même quearray = { "-1": 1 }
. Les deux sont accessibles avecarray[-1]
.Ceylan,
827792671 octetsIl se comporte un peu différemment de l'implémentation de référence lorsque le programme essaie de lire l'entrée à EOF - l'implémentation de référence se bloque avec une TypeError, qui est trop coûteuse à reproduire ici (et aussi probablement un bogue), donc cela renverra -1 à la place ( si nécessaire).
(Cependant, lorsque vous essayez d'écrire ce -1 sur stdout, l'interpréteur se terminera par une erreur OverflowErreur. Un problème similaire se produira si un nombre entier en dehors de la plage Unicode est généré.)
L'interpréteur prend le programme comme premier argument de ligne de commande (assurez-vous de le citer pour votre shell lorsqu'il contient des espaces ou d'autres choses intéressantes).
À Ceylan, nous ne pouvons que lire facilement les lignes d'entrée (je suppose que cela changera dans l'une des prochaines versions), donc quand il
o
est utilisé pour la lecture, je lis une ligne entière et tampon les parties pour de futures utilisations. Je suppose que cela fonctionne de manière similaire dans l'implémentation Python lorsqu'il est connecté à un terminal.Lorsque vous essayez d'exécuter une commande (partie) qui n'est pas l'un des caractères valides, le
nothing
provoquera une AssertionError à lancer, que nous interceptons ensuite dans le bloc catch autour de la boucle principale.Je pense que cela devrait être de préférence un type d'exception personnalisé (car AssertionError pourrait également se produire à d'autres endroits si j'ai un bogue), mais cela prendrait beaucoup plus d'espace, mangeant la plupart des améliorations que j'ai apportées à partir de la première version.
Quelques astuces utilisées pour le golf:
map
fonction, et en créons une nouvelle à chaque foisA
ouB
est utilisée comme x .variable
annotation, qui est maintenantl
).E
(pour l'environnement) et de las
méthode (step) - tout se passe maintenant à l'intérieur de larun
fonction..integer
pour obtenir le point de code d'un caractère,.hash
donne le même résultat. C'est doncstring*.hash
la même chose questring.map(Character.integer)
(donne un itérable des points de code d'une chaîne).is I ...
est plus court queexists ...
.x
) en chaîne,"``t``"
est plus court quet.string
(ou, ce que j'ai utilisé pour un caractèreString{t}
).Voici la version formatée (et commentée):
la source