Інтерпретувати DOGO!


9

Інтерпретувати DOGO

DOGO - менш відома мова програмування. Хоча оригінальний DOGO (мова жарту з публікації Usenet) ніколи не був реалізований, була створена мова, що нагадує його. Командами для мови є:

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

Операції:

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

Приклади

Привіт Світ:

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 пляшок пива

Правила

  • Кожне подання повинно бути або повною програмою, або функцією. Якщо це функція, її потрібно запускати, лише додаючи виклик функції в нижній частині програми. Все інше (наприклад, заголовки в C) повинні бути включені.
  • Якщо це можливо, надайте посилання на веб-сайт, де можна перевірити ваш код.
  • Ваша програма не може нічого написати STDERR(або щось подібне).
  • Ви можете взяти інформацію STDIN(або найближчу альтернативу вашій мові) або як аргумент.
  • Стандартні лазівки заборонені.

Оцінка балів

Програми оцінюються відповідно до байтів . Набір символів за замовчуванням - UTF-8, якщо ви використовуєте інший, вкажіть.

Що вбік, це і є , а найменший байт вважатиметься переможцем!

Подання

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат - це сума двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний бал є останнім номером у заголовку:

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

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

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

Таблиця лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Оновлення:

Вибачте за те, що ви не дуже добре прояснили команди sitта stayкоманди. Вони, як сказав @ user6245072, як [і ]в BF.

Оновлення 2:

Щоб уточнити питання @ KennyLau:

  • Операція за замовчуванням - 0.
  • Пам'ять складається з 8-бітних комірок.
  • Клітини загортають на перелив / перелив.
  • Введення потрібно для роботи 4.

Чи потрібно обробляти сторонні введення? Такі, як введенняsit lie-down roll-over play-dead heel
Чорнило вартості»

1
Також операція 1говорить "приріст наступної комірки", але відповідний код BF - це "поточна комірка декременту". Яка правильна поведінка?
Значення чорнила

@ KevinLau-notKenny Спасибі, моя провина.
Джордж Гібсон

Відповіді:


1

Рубін, 287 байт

Працює нескінченною стрічкою в обох напрямках. Вхід DOGO - це файл у командному рядку. Якщо аргументу командного рядка немає, програма DOGO все одно буде працювати, якщо вона передається як STDIN, якщо вона не використовує операцію 3(отримати байт від STDIN), і в цьому випадку я поняття не маю. У будь-якому випадку найкраще вводити файли.

Передбачає, що в програмному файлі не існує іншого тексту, крім чотирьох команд і пробілів.

Привіт, світова демонстрація

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

Пітон 3, 388 398 373 371 байт

Припускає 256 комірок пам'яті. Просто просто реалізація, легко переможна, ймовірно, може бути більше гольфу. Спробуйте на repl.it .

Завдяки @EasterlyIrk за те, що я зрозумів, що Python 3 набагато коротший, ніж Python 2.

РЕДАКТУВАННЯ: Здійснено, я під час друку враховував лише надмір / перелив, а не фактичну вартість.

Завдяки @ KevinLau-notKenney за економію 25 (!) Байтів із множенням списку та хитростями операторів інверсії

EDIT: -3 байти, вводячи 256 в змінну, -4 возившись з операторами, +8 переконуючись, що це малі регістри

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

Навіщо використовувати sys.stdout.write? Чому ні print?
Rɪᴋᴇʀ

Друк @ EᴀsᴛᴇʀʟʏIʀᴋ додає нові рядки. фактична функція друку з кінцевим аргументом знаходиться в Python 3
Blue

Що змушує python3 не підозрювати? Щойно перевірений, чудово працює зprint(...,end='')
1616

@ EᴀsᴛᴇʀʟʏIʀᴋ Мені було занадто ледащо це встановити. Я можу також змінити відповідь, тхо
Блакитний

Тоді, можливо, спробуйте ідеону або онлайн-інтерпретатора пітона. Або встановити його. : P
Rɪᴋᴇʀ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.