J'ai pensé au langage ésotérique Jumper. Plus tard, vous verrez pourquoi.
- Il fonctionne avec une mémoire à accès aléatoire avec des octets comme cellules. La RAM est indexée zéro et initialement remplie de zéros.
- Lorsque vous essayez d'accéder à des cellules avec des index négatifs, une erreur doit être affichée et le programme terminé.
- Lorsque vous essayez de lire à un index plus grand que le dernier, zéro doit être renvoyé.
- Lorsque vous essayez d'écrire à un index plus grand que le dernier, la RAM doit être augmentée à plusieurs de 1024 et de nouvelles cellules remplies de zéros (techniquement, vous pouvez augmenter la RAM non à plusieurs de 1024, la raison était l'augmentation des performances, donc si cela vous coûte beaucoup de caractères, vous peut pas le faire à plusieurs de 1024).
- Le programme a également un pointeur sur la cellule de la RAM qui est initialement zéro
- Lorsque le programme commence à exécuter une invite pour la chaîne d'entrée doit être affichée (ou prendre la saisie à partir des arguments de ligne de commande, c'est à vous). La chaîne d'entrée ne doit pas contenir de caractère nul (zéro octet). Ensuite, la chaîne d'entrée est écrite dans la RAM à partir d'un index nul.
- Lorsque le programme se termine l'exécution d'une boîte avec la sortie du programme s'affiche - le contenu de la RAM de zéro index au premier zéro octet à l'exclusion.
Maintenant, la partie la plus intéressante, la syntaxe.
Le programme se compose de commandes (opérateurs unaires-préfixes) et de leurs arguments. Les commandes et les arguments peuvent être délimités par des espaces ou de nouvelles lignes mais pas nécessaires. Cependant, les espaces à l'intérieur des arguments ne sont pas valides, par exemple, # 2 = 4
sont valides, mais # 2 = 4 4
ne le sont pas.
Le programme peut avoir des commentaires entre ()
. Les commentaires ne peuvent pas être imbriqués - par exemple, dans le (abc(def)ghi)
commentaire est (abc(def)
. Les commentaires peuvent être placés n'importe où.
#123
définit le pointeur RAM sur 123 (tout entier décimal positif ou zéro).>123
incrémente le pointeur RAM de 123 (tout entier décimal positif).<123
décrémente le pointeur RAM de 123 (tout entier décimal positif).=123
écrit 123 (tout entier décimal 8 bits non signé) dans la cellule actuelle.+123
ajoute 123 (tout entier décimal 8 bits non signé) à la cellule actuelle (modulo 256).-123
soustrait 123 (tout entier décimal 8 bits non signé) de la cellule actuelle (modulo 256).:123
- "goto" - passe à la commande numéro 123 (le premier est 0). Vous ne pouvez contrôler le flux de votre programme qu'avec goto - il doit sauter - c'est pourquoi j'ai décidé d'appeler ce langage Jumper.
Si l'argument est manquant - pensez-y à 1 pour les ><+-
commandes ou à 0 pour les #=:
commandes.
En outre, il existe un modificateur de commande - ?
(préfixe de la commande), il n'exécute la commande suivante que si la cellule actuelle n'est pas nulle, sinon il saute cette commande. Peut être appliqué à n'importe quelle commande.
Par exemple, ?:17
- passe à la commande 17 si la cellule actuelle n'est pas nulle.
Si le programme n'est pas valide ou qu'une erreur se produit pendant l'exécution, le message "Erreur" peut s'afficher. En raison de cela est CodeGolf, un tel message court sera très bien.
Ta tâche
Écrivez l'interprète le plus court pour cette langue.
Quelques programmes de test
(prints "Hello world!" regardless of input)
=72>=101>=108>=108>=111>=32>=119>=111>=114>=108>=100>=33>=
(appends "!" to the end of input string)
?:2 :4 >1 :0 =33 >1 =0
la source
Réponses:
Rubis, 447 octets
Prend à la fois le programme et l'entrée via des arguments de ligne de commande.
EDIT: correction de quelques bugs et ajout de la prise en charge de la syntaxe invalide au prix de 40 octets (tout en ajoutant quelques autres optimisations).
la source
Python (729)
Quant à l'exécution du programme:
Exemple:
Il y a probablement quelques choses que j'ai négligées, alors s'il vous plaît laissez un commentaire si vous essayez quelque chose qui devrait fonctionner mais qui ne fonctionne pas. Notez que cela est écrit en code Python 2.x.
la source
Ruby 2 -
540447420 caractèresExécuter en tant que "ruby2.0 jumper.rb 'instructions' 'initialization data'". 1.x Ruby ne fonctionnera pas (pas de méthode String.bytes).
Ajout de commandes et de commentaires sur plusieurs lignes et amélioration de ma mise.
Voici une suite de tests avec quelques tests de dispersion. La façon la plus simple de l'utiliser est de bourrer le code dans t / jumper.t et d'exécuter "perl t / jumper.t".
Version non golfée.
Un proto-assembleur rapide.
la source
Clojure -
585577 octetsPas d'astuces de golf spéciales utilisées, car je n'en connais pas pour Clojure. L'interprète est purement fonctionnel. Livré avec un joli message d'erreur en cas d'adresse RAM négative (une erreur est générée, mais aucune exception ou erreur n'est levée).
Exemples:
Codeoriginallégèrement non golfé:la source
-
à la fin de la classe de personnage de votre expression régulière, vous n'avez pas besoin de lui échapper. -1 caractère.CoffeeScript (465)
La première boîte de dialogue est pour le programme et la deuxième boîte de dialogue est entrée. Testez-le sur http://coffeescript.org .
Original :
C'est encore du golf, mais a commenté:
Edit : l'ajout d'espaces a pris plus d'octets que je ne le pensais. Cet interpréteur générera une erreur sur la syntaxe invalide, l'autre a un comportement non spécifié sur la syntaxe invalide.
la source
?:2 :4 >1 :0 = 33 <10 =0
(le programme append-! Avec un espace supplémentaire)<1
pas être le cas<10
.Javascript, 519
Cela obtient le programme et l'entrée via des boîtes d'invite. Le coller dans la console Javascript de votre navigateur fonctionnera, ainsi que le jeter dans un fichier, le coller avant le code
<!DOCTYPE html>
, la nouvelle ligne<html><head><script>
et après le code</script></head><body></body></html>
, et enregistrer le fichier résultant sous le nom "swagger.html".C'est ma première tentative dans ce domaine, et j'aime déjà la langue. Un peu. Cependant, il a vraiment besoin d'étiquettes de texte, au lieu de cet étiquetage d'index d'instruction de style BASIC.
Version non golfée (un peu):
la source
clojure.string/replace
?:2 :4 >1 :0 = 33 <10 =0
(l'ajout-! Avec un espace supplémentaire) Non testé cependant.C 687 GCC 4.9.0 et Visual C ++ 2013 (si les fins de ligne comptent pour 1)
Edit: Merci à Dennis, il est maintenant beaucoup plus court (et fonctionne dans GCC pour démarrer)
La version golfée
Une version un peu moins golfée:
la source
R[z]=x
dansP(x)
de(R[z]=x)
. 2. GCC ne requiert aucune des déclarations d'inclusion. 3.char C
->U C
.Groovy 582
version non golfée:
Je pense qu'il y a un bug avec les commentaires, qui ne sont pas reconnus correctement, qui pourrait être causé par la stupide expression régulière que j'ai utilisée, mais les 2 programmes fonctionnent comme ils le devraient:
la source
Haskell: une quantité impie de personnages
D'accord, en ce moment c'est quelque chose qui pourrait ou non être joué au golf sous peu. Il est incroyablement énorme pour ce qu'il est, avec beaucoup, beaucoup de code mal écrit (il y a pas mal de temps depuis que j'ai touché Haskell pour la dernière fois). Mais c'était amusant d'écrire.
la source
Haskell, 584
Le programme d'entrée et de cavalier est fourni comme les deux premières lignes d'entrée de stdin.
Je posterai une version non golfée plus tard, mais en attendant, je voulais laisser cela comme un puzzle pour le lecteur:
S'amuser!
la source