99 (prononcé "quatre-vingt-dix-neuf") est un tout nouveau langage de programmation ésotérique (à ne pas confondre avec 99 , notez les italiques). Votre tâche dans ce défi consiste à écrire un interprète pour 99 aussi court que possible. La soumission avec le moins d'octets gagne. Tiebreaker va à la soumission postée en premier.
Étant donné que cette question est un peu plus approfondie que d'habitude et que j'ai hâte de voir de bonnes réponses, j'attribuerai une récompense de 250 représentants à ma réponse préférée (pas nécessairement le gagnant).
99 Spec
99 est un langage impératif . Chaque ligne d'un programme 99 est une instruction unique et, au cours de l'exécution, le pointeur d'instruction commence à la ligne supérieure et parcourt chacune des lignes suivantes dans l'ordre, en les exécutant en cours de route. Le programme se termine lorsque la dernière ligne a été exécutée. Les instructions Goto peuvent rediriger le chemin du pointeur d'instruction.
Newline, space et 9
sont les trois seuls personnages importants dans un programme 99 . Tous les autres personnages sont complètement ignorés. En outre, les espaces de fin sur chaque ligne sont ignorés et plusieurs espaces d'une ligne sont lus comme un seul espace. ("Newline" désigne tout codage de saut de ligne courant . Peu importe celui que votre interprète utilise.)
Donc ce programme:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
Est identique à ce programme:
9 99 9999
9 9
Variables
Les variables dans 99 ont toutes des noms qui sont un ou plusieurs 9
chaînons ( 9+
en regex). Par exemple, 9
, 99
et 9999999999
sont toutes les variables distinctes. Naturellement, il y en a infiniment beaucoup (sauf limitations de mémoire).
La valeur de chaque variable est un entier signé, de précision arbitraire . Par défaut, chaque variable est affectée à sa propre représentation numérique. Donc, sauf si elle a été réaffectée, la valeur de la variable 9
est le nombre 9 et la valeur de la variable 99
est le nombre 99, et ainsi de suite. Vous pourriez penser que les variables sont traitées comme des nombres simples jusqu'à leur affectation explicite.
Je vais utiliser V
pour faire référence à un nom de variable arbitraire ci-dessous.
Chaque instance de V
pourrait être remplacé par 9
, 99
, 999
, 9999
, etc.
Les déclarations
Il existe cinq types d’énoncés différents dans 99 . Chaque ligne d'un programme 99 contient exactement une déclaration.
La syntaxe décrite ici suppose que tous les caractères superflus ont été supprimés, tous les espaces finaux ont été supprimés et que toutes les séquences d'espaces multiples ont été remplacées par des espaces simples.
1. Pas d'opération
Une ligne vide est un no-op . Cela ne fait rien (à part l'incrémentation du pointeur d'instruction).
2. sortie
V
Une seule variable V
sur une ligne imprime cette variable sur stdout.
Si V
a un nombre impair de 9
l »( 9
, 999
, etc.) , alors la valeur entière de V
divisé par 9 à imprimer (en décimal).
Si V
a un nombre pair de 9
« s ( 99
, 9999
, etc.), le ASCII caractère avec le code V
divisé par 9, mod 128 est imprimé. (C'est (V / 9) % 128
une valeur de 0 à 127.)
Exemple : le programme
9
9999
serait imprimer 1W
. La première ligne est imprimée 1
car 9/9 correspond à 1. La deuxième ligne est imprimée W
car 9999/9 correspond à 1111, et 1111 mod 128 à 87, et 87 correspond au code de caractère W
.
Notez que les sauts de ligne ne sont pas imprimés entre les jetons de sortie. \n
doit être explicitement imprimé pour un saut de ligne.
3. entrée
V
Une seule variable V
sur une ligne avec un espace de début prend l'entrée de stdin et la stocke dans cette variable.
Si V
a un nombre impair de 9
', l'utilisateur peut taper n'importe quel entier signé et V
sera défini sur 9 fois cette valeur.
Si V
a un nombre pair de 9
, l'utilisateur peut saisir n'importe quel caractère ASCII et V
sera défini sur 9 fois son code de caractère.
Exemple : donné -57
et A
en entrée, ce programme
9
9
99
99
serait sortie -57A
. En interne, la variable 9
aurait la valeur -513 et 99
la valeur 585.
Votre interprète peut supposer que les entrées sont toujours syntaxiquement valables.
4. Cession
Cette déclaration peut être arbitrairement longue. Il y a deux variables ou plus sur une ligne, séparées par des espaces:
V1 V2 V3 V4 V5 ...
Ceci assigne à la somme de tous les 'avec des indices pairs, moins la somme des ' avec des indices impairs (excluant ). Les assignations sont par valeur, pas par référence.V1
V
V
V1
Il pourrait être traduit dans la plupart des langues par .V1 = V2 - V3 + V4 - V5 + ...
Donc, s’il n’ya que deux variables, l’affectation normale est la suivante:
V1 V2
→ V1 = V2
S'il y en a trois, alors c'est une soustraction:
V1 V2 V3
→ V1 = V2 - V3
Et le signe +
/ -
continue à basculer avec chaque variable supplémentaire:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
Exemple : Ce programme afficherait 1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. Aller à (sauter si tout à zéro)
Cette déclaration peut aussi être arbitrairement longue. Il y a deux variables ou plus sur une ligne, séparées par des espaces, avec un espace de gauche :
V1 V2 V3 V4 V5 ...
Si certaines des valeurs sont non nulles, cela se comporte comme un non-op. Le pointeur d'instruction est déplacé vers la ligne suivante comme d'habitude.V1
Si toutes les valeurs sont égales à zéro, le pointeur d'instruction est déplacé vers le numéro de ligne . Les lignes sont indexées à zéro. Par conséquent, si la valeur est zéro, le pointeur se déplace vers la ligne supérieure. Le programme se termine (normalement, sans erreur) s'il est négatif ou supérieur à l'indice le plus élevé possible (nombre de lignes moins une).V1
V1
V1
V1
Notez que ce n'était pas divisé par 9 ici. Et comme il est impossible d'avoir une variable qui ne soit pas un multiple de 9, seuls les numéros de ligne qui sont des multiples de 9 peuvent être sautés.V1
Exemples:
Ce programme imprimera 1
pour toujours:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
Ce programme
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
affichera les nombres 11 à 1, par ordre décroissant, entourés de G
:
G11G10G9G8G7G6G5G4G3G2G1G
Détails supplémentaires
L'interpréteur idéal s'exécutera à partir de la ligne de commande avec le nom de fichier de programme 99 en tant qu'argument. Les E / S seront également effectuées à la volée dans la ligne de commande.
Cependant, vous pouvez simplement écrire une fonction interpréteur qui prend le programme sous forme de chaîne, ainsi qu'une liste des jetons d'entrée (par exemple ["-57", "A"]
). La fonction doit imprimer ou renvoyer la chaîne de sortie.
Des méthodes légèrement différentes d’exécution de l’interprète et de gestion des E / S conviennent si ces options sont impossibles dans votre langue.
Bonus: écrivez quelque chose de cool dans 99 et je le mettrai volontiers dans cet article à titre d'exemple.
- Voici un exemple d'un programme "99 Bouteilles de bière" de Mac's answer .
J'espère que vous avez apprécié mon 99ème défi! :RÉ