Interpretuj DOGO!

9

Interpretuj DOGO

DOGO to mniej znany język programowania. Chociaż oryginalny DOGO (język żartów z postu Usenet) nigdy nie został zaimplementowany, utworzono język podobny do niego. Polecenia dla tego języka to:

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

Operacje to:

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

Przykłady

Witaj świecie:

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 butelek piwa

Zasady

  • Każde zgłoszenie powinno być pełnym programem lub funkcją. Jeśli jest to funkcja, musi być uruchomiona, wystarczy dodać wywołanie funkcji na dole programu. Wszystko inne (np. Nagłówki w C) musi zostać uwzględnione.
  • Jeśli to możliwe, proszę podać link do strony internetowej, na której można przetestować kod.
  • Twój program nie może napisać niczego STDERR(lub czegoś podobnego).
  • Możesz wziąć dane wejściowe z STDIN(lub najbliższej alternatywy w twoim języku) lub jako argument.
  • Standardowe luki są zabronione.

Punktacja

Programy są oceniane według bajtów . Domyślny zestaw znaków to UTF-8, jeśli używasz innego, proszę podać.

Poza tym tak jest , a najniższa liczba bajtów zostanie uznana za zwycięzcę!

Zgłoszenia

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aktualizacja:

Niestety nie dla wyjaśnienia siti staypolecenia bardzo dobrze. Są, jak powiedział @ user6245072, jak [i ]w BF.

Aktualizacja 2:

Aby wyjaśnić pytania @ KennyLau:

  • Domyślna operacja to 0.
  • Pamięć składa się z 8-bitowych komórek.
  • Komórki zawijają się przy przepełnieniu / niedopełnieniu.
  • Dane wejściowe są wymagane do operacji 4.
George Gibson
źródło
Czy musimy radzić sobie z obcymi danymi wejściowymi? Takich jak wkład sit lie-down roll-over play-dead heel
Ink Value
1
Ponadto operacja 1mówi „zwiększ kolejną komórkę”, ale odpowiedni kod BF to „zmniejsz bieżącą komórkę”. Które z nich jest prawidłowe zachowanie?
Wartość tuszu
@ KevinLau-notKenny Dzięki, moja wina.
George Gibson,

Odpowiedzi:

1

Rubinowy, 287 bajtów

Działa na nieskończonej taśmie w obu kierunkach. Dane wejściowe DOGO to plik w wierszu poleceń. Jeśli nie ma argumentu wiersza poleceń, program DOGO nadal będzie działał, jeśli zostanie przekazany jako STDIN, chyba że użyje operacji 3(pobierz bajt ze STDIN), w którym to przypadku nie mam pojęcia. W każdym razie najlepsze jest wprowadzanie plików.

Zakłada, że ​​w pliku programu nie ma innego tekstu oprócz czterech poleceń i białych znaków.

Hello World Demonstration

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]
Wartość tuszu
źródło
2

Python 3, 388 398 373 371 bajtów

Zakłada 256 komórek pamięci. Po prostu prosta implementacja, łatwa do pokonania, prawdopodobnie może być bardziej golfa. Wypróbuj repl.it .

Dzięki @EasterlyIrk za uświadomienie mi, że Python 3 jest znacznie krótszy niż Python 2.

EDYCJA: Uświadomiłem sobie, że podczas drukowania uwzględniłem tylko przepełnienie / niedopełnienie, a nie rzeczywistą wartość.

Dzięki @ KevinLau-notKenney za zaoszczędzenie 25 (!) Bajtów z mnożeniem list i operacjami odwracania operatora

EDYCJA: -3 bajty przez wstawienie 256 do zmiennej, -4 bałagan z operatorami, +8 upewnienie się, że to małe litery

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
niebieski
źródło
Dlaczego warto korzystać sys.stdout.write? Dlaczego nie print?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ print dodaje nowe linie. rzeczywista funkcja drukowania z końcowym argumentem znajduje się w Python 3
Blue
Co sprawia, że ​​python3 nie wchodzi w rachubę? Właśnie przetestowany, działa dobrze zprint(...,end='')
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Byłem zbyt leniwy, aby go zainstalować. Równie dobrze mogę zmienić odpowiedź, chociaż
Blue
Następnie może wypróbować do tego ideone lub internetowy interpreter Pythona. Lub zainstaluj. : P
Rɪᴋᴇʀ