introduction
Kipple est un langage de programmation ésotérique basé sur une pile inventé par Rune Berg en mars 2003.
Kipple a 27 piles, 4 opérateurs et une structure de contrôle.
Piles
Les piles sont nommés a
- z
et contiennent des entiers signés 32 bits. Il existe également une pile spéciale @
pour rendre la sortie des numéros plus pratique. Lorsqu'un numéro est poussé @
, les valeurs ASCII des chiffres de ce numéro sont en fait poussées à la place. (Par exemple, si vous appuyez sur 12 vers @
, il poussera 49 puis 50 vers à la @
place.)
L'entrée est poussée sur la pile d'entrée i
avant l'exécution du programme. L'interprète demandera des valeurs à stocker i
avant l'exécution. Une fois l'exécution terminée, tout ce qui se trouve sur la pile de sortie o
est renvoyé à la sortie sous forme de caractère ASCII. Comme il s'agit du seul mécanisme d'E / S de Kipple, l'interaction avec un programme Kipple est impossible.
Les opérateurs
Un opérande est soit un identifiant de pile, soit un entier 32 bits signé.
Appuyez: >
ou<
Syntaxe: Operand>StackIndentifier
ouStackIndentifier<Operand
L'opérateur Push prend l'opérande vers la gauche et le pousse sur la pile spécifiée. Par exemple, 12>a
poussera la valeur 12 sur la pile a
. a>b
fera apparaître la valeur la plus élevée de la pile a
et la poussera sur la pile b
. Popping une pile vide renvoie toujours 0. a<b
est équivalent à b>a
. a<b>c
affiche la valeur la plus élevée de b
et pousse à la fois sur c
et a
.
Ajouter: +
Syntaxe: StackIndentifier+Operand
L'opérateur Ajouter pousse la somme de l'élément le plus haut de la pile et de l'opérande sur la pile. Si l'opérande est une pile, la valeur en est extraite. Par exemple, si la valeur la plus élevée de la pile a
est 1, alors a+2
poussera 3 dessus. Si a
est vide, alors a+2
poussera 2 dessus. Si les valeurs les plus élevées de la pile a
et b
sont 1 et 2, alors a+b
sautera la valeur 2 de la pile b
et poussera 3 sur la pile a
.
Soustraire: -
Syntaxe: StackIndentifier-Operand
L'opérateur Soustraire fonctionne exactement comme l'opérateur Ajouter, sauf qu'il soustrait au lieu d'ajouter.
Clair: ?
Syntaxe: StackIndentifier?
L'opérateur Clear vide la pile si son élément le plus haut est 0.
L'interprète ignore tout ce qui est pas à côté de l'opérateur, de sorte que le programme suivant fonctionnerait: a+2 this will be ignored c<i
. Cependant, la bonne façon d'ajouter des commentaires est d'utiliser le #
caractère. Tout ce qui se trouve entre un #
et un caractère de fin de ligne est supprimé avant l'exécution. Le caractère ASCII # 10 est défini comme fin de ligne dans Kipple.
Les opérandes peuvent être partagés par deux opérateurs, par exemple a>b c>b c?
peuvent être écrits comme a>b<c?
.
Le programme 1>a<2 a+a
se traduira par a
contenir les valeurs [1 4]
(de bas en haut) et non [1 3]
. De même pour l' -
opérateur.
La structure de contrôle
Il n'y a qu'une seule structure de contrôle dans Kipple: la boucle.
Syntaxe: (StackIndentifier code )
Tant que la pile spécifiée n'est pas vide, le code entre parenthèses correspondant sera répété. Les boucles peuvent contenir d'autres boucles. Par exemple, (a a>b)
déplace toutes les valeurs de pile a
sur pile b
, bien que l'ordre soit inversé . Une façon fonctionnellement identique mais plus élégante de le faire est (a>b)
.
Exemples
100>@ (@>o)
Cela produira 100
33>o 100>o 108>o 114>o 111>o 87>o 32>o 111>o 108>o 108>o 101>o 72>o
Cela s'imprimera "Hello World!"
. Lorsque la o
pile est en cours de sortie, elle commence à faire apparaître des caractères du haut vers le bas.
#prime.k by Jannis Harder
u<200
#change 200
k<2>m
u-2
(u-1 u>t u>z u<t
(k>e e+0 e>r)
(e>k)
m+1
m>t
m>z
m<t
t<0>z? t?
1>g
(r>b
m+0 m>a
b+0 b>w
(a-1
b+0 b>j
j?
1>s
(j<0>s j?)
s?
(s<0 w+0 w>b s?)
a>t
a>z
t>a
b-1
b>t
b>z
t>b
z<0>t? z?
a?)
b?
1>p
(b<0 b? 0>p)
p?
(p 0>r? 0>p? 0>g)
)
g?
(g m+0 m>k 0>g?)
u?)
(k>@
10>o
(@>o)
)
Ceci est un générateur de nombres premiers, mais je ne sais pas comment cela fonctionne.
Règles
Vous devez écrire un programme / fonction qui interprète Kipple. Ce programme / fonction peut obtenir un programme Kipple via un fichier source, ou l'obtenir via STDIN directement auprès de l'utilisateur. Si STDIN n'est pas disponible, il doit l'obtenir à partir de la saisie au clavier et continuer à obtenir la saisie jusqu'à ce qu'un caractère non imprimable spécifique soit entré. Par exemple, si votre interpréteur est écrit en code machine x86, il obtiendrait le caractère du programme Kipple par caractère à partir du clavier, et continuerait jusqu'à ce que esc(ou toute autre touche autre qui n'émet pas de caractère imprimable) soit enfoncée.
S'il y a une erreur, par exemple une erreur de syntaxe ou un débordement de pile, il doit le reconnaître d'une manière ou d'une autre, par exemple en renvoyant 10 au lieu de 0 ou des messages d'erreur produits par l'interpréteur / compilateur, MAIS PAS D'IMPRESSION DE MESSAGES D'ERREUR .
Toute autre règle régulière pour le golf de code s'applique à ce défi.
Votre code sera testé avec certains des exemples dans l'archive d' exemples de Kipple
Ceci est un code-golf . Le code le plus court en octets gagnera. Bonne chance!
Notez qu'il y a un opérateur optionnel dans Kipple, "
mais il ne fait pas partie de la spécification et juste une fonctionnalité supplémentaire dans l'interpréteur officiel. Je ne l'ai pas mentionné ici, il n'a donc pas besoin d'être soutenu dans votre soumission.
Si vous avez un doute sur une partie de la spécification, vous pouvez l'examiner avec un interpréteur officiel écrit en Java . Cela téléchargera un fichier zip contenant le programme compilé et le code source. Il est sous licence GPL.
la source
i
si je prends le programme source de stdin?Réponses:
C,
709702 octetsLe score d'octets est avec les sauts de ligne (qui peuvent être supprimés) supprimés, mais pour faciliter la lecture, je le poste ici avec les sauts de ligne:
Compilez avec
gcc -w golf.c
(fait-w
taire les avertissements pour votre santé mentale).Prend en charge tout sauf l'
i
entrée, car le demandeur n'a pas encore répondu à ma demande sur la façon de le faire si vous prenez le code de stdin. Il ne signale pas les erreurs de syntaxe.la source
./a.out < prime.k
.Ruby, 718 octets (actuellement non compétitif)
Je suis très fatigué
Le fichier est chargé comme argument de ligne de commande et l'entrée est envoyée via STDIN. Alternativement, canalisez le fichier dans STDIN si vous n'avez pas besoin d'entrée dans votre
i
registre.En raison d'une certaine confusion concernant la spécification, la version actuelle ne se gère pasa<b>c
correctement et n'est donc pas compétitive jusqu'à ce qu'elle soit corrigée.a<b>c
est corrigé maintenant. Cependant, il retourne toujours le mauvais résultat lors de l'exécution de la fonction primes, il reste donc comme une réponse non compétitive.la source
0 1 1 2 4 8 16...
je me demande s'il s'agit d'une erreur de spécificationa+0
est un non/(\((\g<1>|\s)+\)|[^()\s]+)/m
qu'il utilise pour fractionner les jetons et les groupes de jetons. ( Testez-le sur regex101 ). C'est probablement une erreur dans le reste de mon analyse, mais je ne sais pas où.