Интерпретировать ДОГО!

9

Интерпретировать ДОГО

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, если вы используете другой, пожалуйста, укажите.

Это в стороне, это и самый низкий счетчик байтов будет считаться победителем!

Материалы

Чтобы убедиться, что ваш ответ отображается, начните его с заголовка, используя следующий шаблон уценки:

# 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

Leaderboard

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Обновить:

Извините, что не разъяснил sitи stayкоманды очень хорошо. Они, как сказал @ user6245072, как [и ]в BF.

Обновление 2:

Чтобы уточнить вопросы @ KennyLau:

  • Операция по умолчанию 0.
  • Память состоит из 8-битных ячеек.
  • Клетки обертывают при переполнении / недостаточности.
  • Ввод необходим для работы 4.
Джордж Гибсон
источник
Нужно ли нам обрабатывать посторонний ввод? Такие, как вводsit lie-down roll-over play-dead heel
Value Ink
1
Кроме того, операция 1говорит: «увеличить следующую ячейку», но соответствующий код BF - «уменьшить текущую ячейку». Какая из них правильная?
Value Ink
@ 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

Python 3, 388 398 373 371 байт

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

Спасибо @EasterlyIrk за то, что я понял, что Python 3 намного короче, чем Python 2.

РЕДАКТИРОВАТЬ: понял, что во время печати я учитывал только переполнение, а не фактическое значение.

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

РЕДАКТИРОВАТЬ: -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ʀᴋ print добавляет новые строки. фактическая функция печати с конечным аргументом в Python 3
Blue
Что делает Python3 исключенным? Просто испытано, работает отлично сprint(...,end='')
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Мне было лень его устанавливать. Я мог бы также изменить ответ, хотя
Синий
Тогда, возможно, попробуйте ideone или онлайн-интерпретатор python для этого. Или установите его. : P
Rɪᴋᴇʀ