J'aime le concept de 0815 , sauf que l'interprète sur le site Web du créateur renvoie une erreur 404. J'ai donc décidé de vous demander à tous d'aider!
Les bases
0815 est basé sur trois (3) registres et une file d'attente. Les registres sont nommés X, Y et Z, X étant en écriture seule, Z en lecture seule et Y étant un registre "auxiliaire" auquel il n'est pas possible d'accéder directement. Tous les registres commencent à 0. Tous les nombres sont en hexadécimal.
Instructions
Remarque: Certaines instructions acceptent des paramètres formatés comme }:hello:
où :hello:
est le paramètre. Autre remarque: Certaines descriptions d'instructions ne sont pas claires, j'ai donc pris quelques libertés avec elles. (Instructions originales ici )
~
signifie que le paramètre est requis
----------|---|--------------------------------------------
~Move | < | <:8: will write 8 to X (parameter required)
----------|---|--------------------------------------------
Swap | x | Swap X and Y
----------|---|--------------------------------------------
~Label | } | }:hello: makes a label called 'hello'
----------|---|--------------------------------------------
Input | | | Set X to an integer from input in
Number | | hexadecimal greedily (regex: [0-9A-F]+)
----------|---|--------------------------------------------
Input | ! | Set X to the ASCII code of one ASCII
ASCII | | character in the input
----------|---|--------------------------------------------
Print | % | Prints an integer stored in Z
number | | (hexadecimal base)
----------|---|--------------------------------------------
Print | $ | Prints an ASCII char stored in Z
ASCII | |
----------|---|--------------------------------------------
Roll | | Rolls all registers to the left
Registers | ~ | X <- Y <- Z <- X
Left | | After roll: X = Y, Y = Z and Z = X
----------|---|--------------------------------------------
Roll | | Rolls all registers to the right
Registers | = | X -> Y -> Z -> X
Right | | After roll: Y = X, Z = Y and X = Z
----------|---|--------------------------------------------
~Jump if | ^ | ^:loop: Jumps to the label 'loop' if Z is
not zero | | not zero
----------|---|--------------------------------------------
~Jump if | # | #:loop: Jumps to the label 'loop' if Z is
zero | | zero
----------|---|--------------------------------------------
Instructions de file d'attente
----------|---|--------------------------------------------
Clear | ? | Clears the queue
----------|---|--------------------------------------------
Enqueue | > | Enqueue the number stored in Z
----------|---|--------------------------------------------
Dequeue | { | Dequeue a number into X
----------|---|--------------------------------------------
| | Rolls the queue to the left, wrapping as
Roll | | necessary. The first number becomes the
Queue | @ | last; second becomes first and so on. Can
Left | | take a parameter to roll a certain number
| | of times. @:b: rolls 11 times.
----------|---|--------------------------------------------
Roll | |
Queue | & | The opposite of @
Right | |
----------|---|--------------------------------------------
Instructions arithmétiques
----------|---|--------------------------------------------
Add | + | Z = X + Y
----------|---|--------------------------------------------
Subtract | - | Z = X - Y
----------|---|--------------------------------------------
Multiply | * | Z = X * Y
----------|---|--------------------------------------------
Divide | / | Z = X / Y
| | Y = remainder
----------|---|--------------------------------------------
Exemples de programmes
Bonjour tout le monde: (légèrement golfé)
<:48:~$<:65:~$<:6C:~$$><:6F:~$>@<:2C:~$<:20:~$<:57:~${~$<:72:~${~$<:64:~$
Chat:
}:_t:!~$^:_t:
Truth Machine:
|~}:i:%^:i:
C'est du code-golf , donc la soumission avec le moins d'octets gagne!
la source
~
et~
dans vos commandes "roll registres"? Avez-vous un exemple de programme que les gens peuvent utiliser pour tester?Réponses:
Pip ,
321262248 octetsTrès raccourci en utilisant eval et quelques astuces de complexité Kolmogorov.
Essayez-le en ligne!(L'exemple est le programme de nombres Collatz / grêlons du site Web de l'auteur de la langue.)
Remarques:
[0-9A-F]+
). Si, lors d'une|
instruction, le caractère d'entrée suivant n'est pas0-9A-F
, la lecture échoue et provoque un comportement potentiellement étrange. Cela signifie que le programme pair-impair de l'auteur ne fonctionne pas tel qu'il est écrit ... Je ne sais pas comment il s'attendait à ce que plusieurs lectures de nombres fonctionnent, mais je viens de l'implémenter en fonction de ce que la spécification a dit.Ma version non golfée avec commentaires:
la source
haxe, 987 octets
ou avec des espaces:
Golfé avec haxe avec succès? Sensationnel.
la source
Python 3, 1320 octets
La version non golfée, ainsi que l'analyse (et si nécessaire, les versions corrigées) des programmes de test, peuvent être trouvées dans cet essentiel .
Décisions de conception:
Il y a des problèmes avec les programmes d'exemple utilisant CR seul comme leur nouvelle ligne (parfois), ce qui fait que mon shell écrase la ligne actuelle plutôt que d'en commencer une nouvelle. Cela affecte les programmes Fibonacci Sequence et 99 Bottles of Beer. Le dernier verset de 99 bouteilles de bière ne s'imprime pas non plus correctement, et je cherche toujours pourquoi.
la source
Scala,
3,1232,8442,6262,540 octetsEn plus des contraintes décrites dans la question, cet interprète a été écrit pour se pencher autant que possible sur les principes de PF. Plus précisément:
Cela a été accompli, à l'exception des quatre lignes de code qui pilotent la boucle principale de l'interpréteur. Les structures immuables étaient très difficiles à utiliser ici car l'état des registres entraîne le flux de contrôle de la boucle (en particulier les deux instructions GOTO). Je réfléchis toujours à la façon de le convertir pour utiliser des structures pures et immuables, mais cela n'a rien à voir avec le défi du code golf.
Je publierai la version non golfée sur Github et fournirai un lien lorsque je le ferai. Pour l'instant, je posterai la version originale ici:
la source
Flex / C ++,
848838 octetsCompilé avec:
Il pourrait aussi être compilé avec d'autres
lex
es, mais je n'ai pas vérifié. Il fonctionne en deux passes, donc les sauts en avant sont traités correctement. Les noms d'étiquette peuvent commencer par un chiffre, car cela se produit plus d'une fois dans les cas de test. Les littéraux hexadécimaux ne peuvent être que des majuscules, conformément aux spécifications.Réussit tous les cas de test, y compris ceux trouvés sur le Wiki Esolangs et la page 0815. La gestion des erreurs est inexistante et la sortie sur une étiquette inconnue n'est pas gracieuse, après tout, c'est du code-golf.
Je prépare l'interprète non golfé (et beaucoup plus agréable) pour une version, afin que OP puisse continuer à bricoler avec 0815. Restez à l'écoute :)
la source
\r
au lieu de\n
comme nouvelle ligne (Mac OS old school?), Donc si vous voulez voir quelque chose imprimé à l'écran./0815 99bb.0815 | tr "\r" "\n"
. Pareil pour Fibonacci.Lisp commun, 1088 octets
Non golfé
Avec trace facultative lors de l'exécution.
Fibonnaci
Macroexpansion
Sortie
Peut-être plus d'explications plus tard
la source
Python 3,
1573, 1499 octetsExécute les exemples de programmes sur http://paulo-jorente.de/poncho/esolang/0815/ et implémente toutes les instructions (même celles écrites, selon les spécifications d'origine).
Exécute le fichier source transmis sur la ligne de commande.
la source
j=raw_input
àj=input
), mais il ne fonctionne pas pour moi sur le programme « 99 bouteilles de bière ». Un échantillon ("//" pour la nouvelle ligne): "0x63 // 0x63tles de bière sur le mur // 0x62 one down and pass it around // 0x62tles of beer on the wall // 0x62tles of beer on the wall // 0x61 one vers le bas et le faire circuler ")