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 9sont 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 9chaînons ( 9+en regex). Par exemple, 9, 99et 9999999999sont 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 9est le nombre 9 et la valeur de la variable 99est 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 Vpour faire référence à un nom de variable arbitraire ci-dessous.
Chaque instance de Vpourrait ê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 Vsur une ligne imprime cette variable sur stdout.
Si Va un nombre impair de 9l »( 9, 999, etc.) , alors la valeur entière de Vdivisé par 9 à imprimer (en décimal).
Si Va un nombre pair de 9« s ( 99, 9999, etc.), le ASCII caractère avec le code Vdivisé par 9, mod 128 est imprimé. (C'est (V / 9) % 128une valeur de 0 à 127.)
Exemple : le programme
9
9999
serait imprimer 1W. La première ligne est imprimée 1car 9/9 correspond à 1. La deuxième ligne est imprimée Wcar 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. \ndoit être explicitement imprimé pour un saut de ligne.
3. entrée
V
Une seule variable Vsur une ligne avec un espace de début prend l'entrée de stdin et la stocke dans cette variable.
Si Va un nombre impair de 9', l'utilisateur peut taper n'importe quel entier signé et Vsera défini sur 9 fois cette valeur.
Si Va un nombre pair de 9, l'utilisateur peut saisir n'importe quel caractère ASCII et Vsera défini sur 9 fois son code de caractère.
Exemple : donné -57et Aen entrée, ce programme
9
9
99
99
serait sortie -57A. En interne, la variable 9aurait la valeur -513 et 99la 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.V1VVV1
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 V1V1V1
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 1pour 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É