Interprete o DOGO!

9

Interpretar DOGO

DOGO é uma linguagem de programação menos conhecida. Embora o DOGO original (um idioma de piada de uma postagem da Usenet) nunca tenha sido implementado, um idioma semelhante a ele foi criado. Os comandos para o idioma são:

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

As operações são:

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

Exemplos

Olá 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 garrafas de cerveja

Regras

  • Cada envio deve ser um programa ou uma função completa. Se for uma função, deve ser executável, bastando adicionar a chamada de função na parte inferior do programa. Qualquer outra coisa (por exemplo, cabeçalhos em C) deve ser incluída.
  • Se possível, forneça um link para um site online onde seu código pode ser testado.
  • Seu programa não pode gravar nada em STDERR(ou algo semelhante).
  • Você pode receber informações de STDIN(ou a alternativa mais próxima em seu idioma) ou como argumento.
  • As brechas padrão são proibidas.

Pontuação

Os programas são pontuados de acordo com os bytes . O conjunto de caracteres padrão é UTF-8; se você estiver usando outro, especifique.

Além disso, trata-se de , e a menor contagem de bytes será considerada a vencedora!

Submissões

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:

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

Entre os melhores

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.

Atualizar:

Desculpe por não esclarecer os comandos site staymuito bem. Eles são, como @ user6245072 disse, como [e ]no BF.

Atualização 2:

Para esclarecer as perguntas de @ KennyLau:

  • A operação padrão é 0.
  • A memória consiste em células de 8 bits.
  • As células envolvem-se em excesso / excesso.
  • É necessária entrada para a operação 4.
George Gibson
fonte
Precisamos lidar com entradas estranhas? Como uma entrada desit lie-down roll-over play-dead heel
Value Ink
11
Além disso, a operação 1diz "incrementar a próxima célula`, mas o código BF correspondente é" decrementar a célula atual ". Qual deles é o comportamento correto?
Value Ink
@ KevinLau-notKenny Obrigado, minha culpa.
George Gibson

Respostas:

1

Ruby, 287 bytes

É executado em uma fita infinita nas duas direções. A entrada DOGO é um arquivo na linha de comandos. Se não houver argumento de linha de comando, um programa DOGO ainda funcionará se for passado como STDIN, a menos que use operação 3(obtenha um byte de STDIN), caso em que não faço ideia. De qualquer forma, a melhor entrada de arquivo.

Assume que nenhum outro texto além dos quatro comandos e espaços em branco existem no arquivo de programa.

Olá, demonstração 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]
Value Ink
fonte
2

Python 3, 388 398 373 371 bytes

Supõe 256 células de memória. Apenas uma implementação direta, facilmente derrotável, provavelmente pode ser mais praticada. Experimente-o em repl.it .

Obrigado a @EasterlyIrk por me fazer perceber que o Python 3 é muito mais curto que o Python 2.

EDIT: Percebi que só respondi por excesso / insuficiência durante a impressão, e não pelo valor real.

Obrigado a @ KevinLau-notKenney por salvar 25 (!) Bytes com truques de operador de multiplicação e inversão de lista

EDIT: -3 bytes, colocando 256 em uma variável, -4 mexendo com os operadores, +8 certificando-se de que está em minúscula

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
fonte
Por que usar sys.stdout.write? Por que não print?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ print adiciona novas linhas. a função de impressão real com o final arg está em Python 3
Blue
O que torna o python3 fora de questão? Acabei de testar, funciona bem comprint(...,end='')
#
@ EᴀsᴛᴇʀʟʏIʀᴋ Eu estava com preguiça de instalá-lo. Eu poderia muito bem mudar a resposta, tho
azul
Então talvez tente ideone ou um intérprete python on-line para isso. Ou instale-o. : P
Rɪᴋᴇʀ 05/05