¡Interpreta a DOGO!

9

Interpretar DOGO

DOGO es un lenguaje de programación menos conocido. Si bien el DOGO original (un lenguaje de broma de una publicación de Usenet) nunca se ha implementado, se ha creado un lenguaje similar. Los comandos para el idioma son:

+===========+================================================================+
|  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.                      |
+-----------+----------------------------------------------------------------+

Las operaciones son:

+========+=======================================================+====+
| 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.              | .  |
+--------+-------------------------------------------------------+----+

Ejemplos

Hola Mundo:

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 botellas de cerveza

Reglas

  • Cada presentación debe ser un programa completo o una función. Si es una función, debe ser ejecutable solo necesitando agregar la llamada a la función en la parte inferior del programa. Cualquier otra cosa (por ejemplo, encabezados en C), debe incluirse.
  • Si es posible, proporcione un enlace a un sitio en línea donde se pueda probar su código.
  • Su programa no puede escribir nada STDERR(o algo similar).
  • Puede tomar información de STDIN(o la alternativa más cercana en su idioma), o como argumento.
  • Las lagunas estándar están prohibidas.

Puntuación

Los programas se puntúan según los bytes . El conjunto de caracteres predeterminado es UTF-8; si está utilizando uno diferente, especifique.

Aparte de eso, este es el , ¡y el conteo de bytes más bajo se considerará el ganador!

Envíos

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

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

Tabla de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Actualizar:

Perdón por no aclarar los comandos sity staymuy bien. Son, como dijo @ user6245072, como [y ]en BF.

Actualización 2:

Para aclarar las preguntas de @ KennyLau:

  • La operación predeterminada es 0.
  • La memoria consta de celdas de 8 bits.
  • Las células se envuelven en desbordamiento / desbordamiento.
  • Se requiere entrada para la operación 4.
George Gibson
fuente
¿Necesitamos manejar entradas extrañas? Como una entrada desit lie-down roll-over play-dead heel
Value Ink
1
Además, la operación 1dice "incremento próxima cell`, pero el código BF correspondiente es 'celda actual decremento' ¿Cuál es el comportamiento correcto.?
Valor de tinta
@ KevinLau-notKenny Gracias, mi culpa.
George Gibson

Respuestas:

1

Rubí, 287 bytes.

Se ejecuta en una cinta infinita en ambas direcciones. La entrada DOGO es un archivo en la línea de comando. Si no hay un argumento de línea de comando, un programa DOGO seguirá funcionando si se pasa como STDIN, a menos que use la operación 3(obtenga un byte de STDIN) en cuyo caso no tengo idea. En cualquier caso, la entrada de archivos es la mejor.

Asume que no hay otro texto que no sean los cuatro comandos y espacios en blanco en el archivo del programa.

Hola demostración mundial

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]
Tinta de valor
fuente
2

Python 3, 388 398 373 371 bytes

Asume 256 celdas de memoria. Solo una implementación sencilla, fácilmente superable, probablemente se pueda jugar más. Pruébalo en repl.it .

Gracias a @EasterlyIrk por haberme dado cuenta de que Python 3 es mucho más corto que Python 2.

EDITAR: me di cuenta de que solo tomé en cuenta el flujo excesivo / insuficiente durante la impresión, no en el valor real.

Gracias a @ KevinLau-notKenney por guardar 25 (!) Bytes con trucos de operadores de inversión y multiplicación de listas

EDITAR: -3 bytes poniendo 256 en una variable, -4 jugando con los operadores, +8 asegurándose de que esté en minúsculas

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
Azul
fuente
¿Por qué usar sys.stdout.write? ¿Por qué no print?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ print agrega nuevas líneas. la función de impresión real con el argumento final está en Python 3
Azul
¿Qué hace a python3 fuera de cuestión? Recién probado, funciona bien conprint(...,end='')
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Fui demasiado flojo para instalarlo. Yo también podría cambiar la respuesta, aunque
Azul
Entonces tal vez intente ideone o un intérprete de python en línea para eso. O instalarlo. : P
Rɪᴋᴇʀ