Interpreta DOGO!


9

Interpreta DOGO

DOGO è un linguaggio di programmazione meno conosciuto. Mentre l'originale DOGO (un linguaggio scherzoso tratto da un post Usenet) non è mai stato implementato, è stato creato un linguaggio simile al suo. I comandi per la lingua sono:

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

Le operazioni sono:

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

Esempi

Ciao mondo:

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 bottiglie di birra

Regole

  • Ogni invio dovrebbe essere un programma o una funzione completi. Se è una funzione, deve essere eseguibile solo aggiungendo la chiamata di funzione nella parte inferiore del programma. Qualsiasi altra cosa (ad es. Intestazioni in C) deve essere inclusa.
  • Se possibile, fornire un collegamento a un sito online in cui è possibile testare il codice.
  • Il tuo programma non può scrivere nulla STDERR(o qualcosa di simile).
  • Puoi prendere input da STDIN(o l'alternativa più vicina nella tua lingua) o come argomento.
  • Sono vietate le scappatoie standard .

punteggio

I programmi vengono classificati in base ai byte . Il set di caratteri predefinito è UTF-8, se ne usi uno diverso, specifica.

A parte questo, questo è e il conteggio di byte più basso sarà considerato il vincitore!

Inseriti

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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

Classifica

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Aggiornare:

Mi spiace di non chiarire la site staycomandi molto bene. Sono, come diceva @ user6245072, come [e ]in BF.

Aggiornamento 2:

Per chiarire le domande di @ KennyLau:

  • L'operazione predefinita è 0.
  • La memoria è composta da celle a 8 bit.
  • Le celle si avvolgono su overflow / underflow.
  • È richiesto input per il funzionamento 4.

Dobbiamo gestire input estranei? Come un input disit lie-down roll-over play-dead heel
Value Ink

1
Inoltre, l'operazione 1dice "incrementa la cella successiva", ma il codice BF corrispondente è "decrementa la cella corrente". Qual è il comportamento corretto?
Value Ink

@ KevinLau-notKenny Grazie, colpa mia.
George Gibson,

Risposte:


1

Rubino, 287 byte

Funziona su un nastro infinito in entrambe le direzioni. L'input DOGO è un file sulla riga di comando. Se non esiste alcun argomento della riga di comando, un programma DOGO funzionerà comunque se trasmesso come STDIN, a meno che non utilizzi l'operazione 3(ottenere un byte da STDIN) nel qual caso non ne ho idea. Ad ogni modo, l'input di file è il migliore.

Presuppone che non esistano altri testi oltre ai quattro comandi e spazi bianchi nel file di programma.

Ciao dimostrazione mondiale

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]

2

Python 3, 388 398 373 371 byte

Presuppone 256 celle di memoria. Solo un'implementazione semplice, facilmente battibile, probabilmente può essere giocata a golf di più. Provalo su repl.it .

Grazie a @EasterlyIrk per avermi fatto capire che Python 3 è molto più breve di Python 2.

EDIT: realizzato Ho tenuto conto solo over / underflow durante la stampa, non in valore reale.

Grazie a @ KevinLau-notKenney per aver salvato 25 (!) Byte con moltiplicazioni dell'elenco e trucchi dell'operatore di inversione

MODIFICA: -3 byte inserendo 256 in una variabile, -4 scherzando con gli operatori, +8 assicurandosi che sia in minuscolo

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

Perché l'uso sys.stdout.write? Perché no print?
Rɪᴋᴇʀ

La stampa @ EᴀsᴛᴇʀʟʏIʀᴋ aggiunge nuove righe. l'effettiva funzione di stampa con end arg è in Python 3
Blue

Cosa rende python3 fuori discussione? Appena testato, funziona bene conprint(...,end='')
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ Ero troppo pigro per installarlo. Potrei anche cambiare la risposta, però
Blue

Quindi forse prova ideone o un interprete di pitone online per quello. O installalo. : P
Rɪᴋᴇʀ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.