Interpréter DOGO!

9

Interpréter DOGO

DOGO est un langage de programmation moins connu. Bien que le DOGO original (un langage de blague d'un article Usenet) n'ait jamais été implémenté, un langage qui lui ressemble a été créé. Les commandes pour la langue sont:

+===========+================================================================+
|  Command  |                          Description                           |
+===========+================================================================+
| SIT       | If the value of the current memory cell is 0, jump to STAY.    |
+-----------+----------------------------------------------------------------+
| STAY      | If the value of the current memory cell is not 0, jump to SIT. |
+-----------+----------------------------------------------------------------+
| ROLL-OVER | Select the next operation from the operation list.             |
+-----------+----------------------------------------------------------------+
| HEEL      | Execute the currently selected operation.                      |
+-----------+----------------------------------------------------------------+

Les opérations sont:

+========+=======================================================+====+
| Number |                      Description                      | BF |
+========+=======================================================+====+
|      0 | Increment current memory cell.                        | +  |
+--------+-------------------------------------------------------+----+
|      1 | Decrement current memory cell.                        | -  |
+--------+-------------------------------------------------------+----+
|      2 | Move to next memory cell.                             | >  |
+--------+-------------------------------------------------------+----+
|      3 | Move to previous memory cell.                         | <  |
+--------+-------------------------------------------------------+----+
|      4 | Input a byte and store it in the current memory cell. | ,  |
+--------+-------------------------------------------------------+----+
|      5 | Output the current memory cell as ASCII.              | .  |
+--------+-------------------------------------------------------+----+

Exemples

Bonjour le monde:

roll-over roll-over heel roll-over roll-over roll-over roll-over heel heel heel 
heel heel heel heel heel heel sit roll-over roll-over roll-over heel roll-over 
roll-over roll-over heel heel heel heel heel heel heel heel roll-over roll-over 
heel roll-over roll-over roll-over roll-over roll-over heel roll-over roll-over 
roll-over roll-over roll-over stay roll-over roll-over roll-over heel roll-over 
roll-over heel roll-over roll-over roll-over heel roll-over roll-over roll-over 
roll-over heel heel heel heel heel heel heel sit roll-over roll-over roll-over 
heel roll-over roll-over roll-over heel heel heel heel roll-over roll-over heel 
roll-over roll-over roll-over roll-over roll-over heel roll-over roll-over 
roll-over roll-over roll-over stay roll-over roll-over roll-over heel roll-over  
roll-over roll-over heel roll-over roll-over roll-over roll-over roll-over heel 
roll-over heel heel heel heel heel heel heel roll-over roll-over roll-over 
roll-over roll-over heel heel roll-over heel heel heel roll-over roll-over 
roll-over roll-over roll-over heel roll-over roll-over roll-over heel heel heel 
roll-over roll-over roll-over roll-over heel heel heel heel heel heel heel heel 
sit roll-over roll-over roll-over heel roll-over roll-over roll-over heel heel 
heel heel roll-over roll-over heel roll-over roll-over roll-over roll-over 
roll-over heel roll-over roll-over roll-over roll-over roll-over stay roll-over 
roll-over roll-over heel roll-over roll-over heel roll-over roll-over roll-over 
heel heel heel roll-over roll-over roll-over roll-over heel heel heel heel heel 
heel heel heel heel heel sit roll-over roll-over roll-over heel roll-over 
roll-over roll-over heel heel heel heel heel heel heel heel heel roll-over 
roll-over heel roll-over roll-over roll-over roll-over roll-over heel roll-over 
roll-over roll-over roll-over roll-over stay roll-over roll-over roll-over heel 
roll-over roll-over roll-over roll-over heel heel heel roll-over roll-over 
roll-over roll-over heel roll-over roll-over roll-over roll-over heel heel heel 
heel roll-over roll-over heel roll-over heel heel heel roll-over roll-over 
roll-over roll-over roll-over heel roll-over roll-over heel heel heel heel heel 
heel roll-over roll-over roll-over roll-over heel roll-over roll-over heel heel 
heel heel heel heel heel heel roll-over roll-over roll-over roll-over heel 
roll-over roll-over roll-over heel heel roll-over roll-over roll-over roll-over 
heel roll-over roll-over roll-over roll-over roll-over heel

99 bouteilles de bière

Règles

  • Chaque soumission doit être soit un programme complet soit une fonction. S'il s'agit d'une fonction, elle doit pouvoir être exécutée en n'ajoutant que l'appel de fonction au bas du programme. Tout autre élément (par exemple, en-têtes en C) doit être inclus.
  • Si c'est possible, veuillez fournir un lien vers un site en ligne où votre code peut être testé.
  • Votre programme ne peut rien écrire STDERR(ou quelque chose de similaire).
  • Vous pouvez prendre des informations STDIN(ou l'alternative la plus proche dans votre langue), ou comme argument.
  • Les failles standard sont interdites.

Notation

Les programmes sont notés en octets . Le jeu de caractères par défaut est UTF-8, si vous en utilisez un autre, veuillez le spécifier.

Cela mis à part, il s'agit du , et le nombre d'octets le plus bas sera considéré comme le gagnant!

Soumissions

Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

# Perl, 43 + 2 (-p flag) = 45 bytes

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Classement

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.

Mise à jour:

Désolé de ne pas préciser les sitet staycommandes très bien. Ils sont, comme l'a dit @ user6245072, comme [et ]dans BF.

Mise à jour 2:

Pour clarifier les questions de @ KennyLau:

  • L'opération par défaut est 0.
  • La mémoire se compose de cellules 8 bits.
  • Les cellules s'enroulent en cas de débordement / débordement.
  • Une entrée est requise pour le fonctionnement 4.
George Gibson
la source
Avons-nous besoin de gérer les entrées étrangères? Comme une entrée desit lie-down roll-over play-dead heel
Value Ink
1
En outre, l'opération 1indique "incrémenter la cellule suivante", mais le code BF correspondant est "décrémenter la cellule actuelle". Lequel est le comportement correct?
Value Ink
@ KevinLau-notKenny Merci, ma faute.
George Gibson

Réponses:

1

Rubis, 287 octets

Fonctionne sur une bande infinie dans les deux sens. L'entrée DOGO est un fichier sur la ligne de commande. S'il n'y a pas d'argument de ligne de commande, un programme DOGO fonctionnera toujours s'il est transmis en tant que STDIN, sauf s'il utilise l'opération 3(obtenir un octet de STDIN), auquel cas je n'en ai aucune idée. Quoi qu'il en soit, la saisie de fichiers est la meilleure.

Suppose qu'aucun autre texte que les quatre commandes et les espaces n'existent dans le fichier programme.

Démonstration Hello World

i=k=o=0;m={}
c=$<.read.upcase.split.map{|e|%w{SIT STAY ROLL-OVER HEEL}.index e}.join
(m[k]||=0
e=c[i].to_i
e>2?o>4?$><<m[k].chr:
o>3?m[k]=STDIN.getc.ord:
o>1?k+=o>2?-1:1:
m[k]=o<1?-~m[k]%256:~-m[k]%256:
e>1?o=-~o%6:
e>0?m[k]>0?i=c.rindex(?0,i):0:
m[k]<1?i=c.index(?1,i):0
i+=1)while c[i]
Encre de valeur
la source
2

Python 3, 388 398 373 371 octets

Suppose 256 cellules de mémoire. Juste une mise en œuvre simple, facilement battable, peut probablement être jouée plus. Essayez - le sur repl.it .

Merci à @EasterlyIrk de m'avoir fait réaliser que Python 3 est beaucoup plus court que Python 2.

EDIT: réalisé que je n'ai pris en compte que les dépassements / sous-dépassements lors de l'impression, pas en valeur réelle.

Merci à @ KevinLau-notKenney pour avoir économisé 25 (!) Octets avec des astuces d'opérateur de multiplication et d'inversion de liste

EDIT: -3 octets en mettant 256 dans une variable, -4 en jouant avec les opérateurs, +8 en s'assurant qu'il est en minuscules

def p(s):
 b=256
 l,m=[w[-1]for w in s.lower().split()],[0]*b
 i=p=x=0
 while x<len(l):
  c=l[x]
  if'm'>c:
   if 1>i:m[p]=-~m[p]%b
   if 1==i:m[p]=~-m[p]%b
   if 2==i:p=-~p%b
   if 3==i:p=~-p%b
   if 4==i:m[p]=ord(input()[0])
   if 4<i:print(chr(m[p]),end="")
  if'r'==c:i=-~i%6
  if't'==c and m[p]<1:x+=l[:x].index('y')
  if'x'<c and m[p]>0:x-=l[x::-1].index('t')
  x+=1
Bleu
la source
Pourquoi utiliser sys.stdout.write? Pourquoi ne pas print?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ print ajoute des nouvelles lignes. la fonction d'impression réelle avec l'argument de fin est en Python 3
Blue
Qu'est-ce qui rend python3 hors de question? Vient de tester, fonctionne très bien avecprint(...,end='')
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ J'étais trop paresseux pour l'installer. Je pourrais aussi bien changer la réponse, tho
Blue
Ensuite, essayez peut-être ideone ou un interpréteur python en ligne pour cela. Ou installez-le. : P
Rɪᴋᴇʀ