Мне нравится концепция 0815 , за исключением того, что переводчик на сайте создателя возвращает ошибку 404. Поэтому я решил попросить всех вас помочь!
Основы
0815 основан на трех (3) регистрах и очереди. Регистры называются X, Y и Z, причем X - только для записи, Z - только для чтения, а Y - «вспомогательный» регистр, к которому нет прямого доступа. Все регистры начинаются с 0. Все числа в шестнадцатеричном формате.
инструкции
Примечание. Некоторые инструкции принимают параметры, которые отформатированы, например, }:hello:
где :hello:
это параметр. Другое примечание: некоторые описания инструкций неясны, поэтому я взял некоторые вольности с ними. (Оригинальные инструкции здесь )
~
означает, что параметр обязателен
----------|---|--------------------------------------------
~Move | < | <:8: will write 8 to X (parameter required)
----------|---|--------------------------------------------
Swap | x | Swap X and Y
----------|---|--------------------------------------------
~Label | } | }:hello: makes a label called 'hello'
----------|---|--------------------------------------------
Input | | | Set X to an integer from input in
Number | | hexadecimal greedily (regex: [0-9A-F]+)
----------|---|--------------------------------------------
Input | ! | Set X to the ASCII code of one ASCII
ASCII | | character in the input
----------|---|--------------------------------------------
Print | % | Prints an integer stored in Z
number | | (hexadecimal base)
----------|---|--------------------------------------------
Print | $ | Prints an ASCII char stored in Z
ASCII | |
----------|---|--------------------------------------------
Roll | | Rolls all registers to the left
Registers | ~ | X <- Y <- Z <- X
Left | | After roll: X = Y, Y = Z and Z = X
----------|---|--------------------------------------------
Roll | | Rolls all registers to the right
Registers | = | X -> Y -> Z -> X
Right | | After roll: Y = X, Z = Y and X = Z
----------|---|--------------------------------------------
~Jump if | ^ | ^:loop: Jumps to the label 'loop' if Z is
not zero | | not zero
----------|---|--------------------------------------------
~Jump if | # | #:loop: Jumps to the label 'loop' if Z is
zero | | zero
----------|---|--------------------------------------------
Инструкции очереди
----------|---|--------------------------------------------
Clear | ? | Clears the queue
----------|---|--------------------------------------------
Enqueue | > | Enqueue the number stored in Z
----------|---|--------------------------------------------
Dequeue | { | Dequeue a number into X
----------|---|--------------------------------------------
| | Rolls the queue to the left, wrapping as
Roll | | necessary. The first number becomes the
Queue | @ | last; second becomes first and so on. Can
Left | | take a parameter to roll a certain number
| | of times. @:b: rolls 11 times.
----------|---|--------------------------------------------
Roll | |
Queue | & | The opposite of @
Right | |
----------|---|--------------------------------------------
Арифметические инструкции
----------|---|--------------------------------------------
Add | + | Z = X + Y
----------|---|--------------------------------------------
Subtract | - | Z = X - Y
----------|---|--------------------------------------------
Multiply | * | Z = X * Y
----------|---|--------------------------------------------
Divide | / | Z = X / Y
| | Y = remainder
----------|---|--------------------------------------------
Примеры программ
Привет, мир: (слегка в гольф)
<:48:~$<:65:~$<:6C:~$$><:6F:~$>@<:2C:~$<:20:~$<:57:~${~$<:72:~${~$<:64:~$
Кот:
}:_t:!~$^:_t:
Машина Правды:
|~}:i:%^:i:
Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
источник
~
и~
в ваших командах "Roll Registers"? У вас есть пример программы, которую люди могут использовать для тестирования?Ответы:
Пип ,
321262248 байтЗначительно сокращено с помощью eval и некоторых трюков с колмогоровской сложностью.
Попробуйте онлайн! (Пример - программа чисел Collatz / Hailstone с сайта автора языка).
Заметки:
[0-9A-F]+
). Если в|
инструкции следующий символ ввода - нет0-9A-F
, чтение завершается неудачно и вызывает потенциально странное поведение. Это означает, что четная нечетная программа автора не работает так, как написано ... Я не уверен, как он ожидал, что сработает несколько чисел, но я просто реализовал в соответствии с тем, что сказано в спецификации.Моя неутешная версия с комментариями:
источник
haxe, 987 байт
или с пробелами:
Успешно играл в гольф с haxe? Вау.
источник
Python 3, 1320 байт
Ungolfed версия, а также анализ (и , при необходимости, скорректированные версии) тестовых программ, можно найти в этом суть .
Дизайнерские решения:
Есть проблемы с примерами программ, использующими только CR в качестве новой строки (иногда), что заставляет мою оболочку перезаписывать текущую строку, а не начинать новую. Это влияет на программы Фибоначчи и 99 бутылок пива. Последний стих из 99 бутылок пива также не печатается правильно, и я все еще выясняю, почему.
источник
Скала,
3123284426262,540 байтВ дополнение к ограничениям, изложенным в этом вопросе, этот переводчик был написан так, чтобы как можно больше склоняться к принципам FP. В частности:
Это было выполнено, за исключением четырех строк кода, которые управляют основным циклом интерпретатора. Неизменяемые структуры было очень трудно использовать здесь, потому что состояние регистров управляет потоком управления цикла (в частности, двумя операторами GOTO). Я все еще думаю о том, как преобразовать его, чтобы использовать чистые и неизменные структуры, но это не имеет отношения к проблеме гольфа в коде.
Я опубликую версию без Golf на Github и предоставлю ссылку, когда я это сделаю. Пока я выложу оригинальную версию здесь:
источник
Flex / C ++,
848838 байтСоставлено с:
Это может скомпилироваться и с другими
lex
, но я не проверял. Он работает в два прохода, поэтому прыжки вперед обрабатываются правильно. Имена меток могут начинаться с цифры, как это часто бывает в тестовых случаях. Шестнадцатеричные литералы могут быть только заглавными, в соответствии со спецификациями.Проходит все тестовые случаи, в том числе найденные на Esolangs Wiki и на странице 0815. Обработка ошибок не существует и выход на неизвестном ярлыке не изящен, ведь это код-гольф.
Я готовлю к выпуску переводчика (и намного приятнее), чтобы OP мог продолжать работать с 0815. Оставайтесь с нами :)
источник
\r
вместо\n
новой строки (Mac OS старой школы?), Так что если вы хотите увидеть что-то напечатанное на экране./0815 99bb.0815 | tr "\r" "\n"
. То же самое для Фибоначчи.Common Lisp, 1088 байт
Ungolfed
С необязательной трассировкой во время выполнения.
Fibonnaci
Macroexpansion
Выход
Может быть, больше объяснений позже
источник
Питон 3,
1573, 1499 байтЗапускает примеры программ по адресу http://paulo-jorente.de/poncho/esolang/0815/ и реализует все инструкции (даже пишите, в соответствии с оригинальной спецификацией).
Выполняет исходный файл, переданный в командной строке.
источник
j=raw_input
наj=input
), но он не работает для меня в программе «99 бутылок пива». Пример ("//" для новой строки): "0x63 // пива на стене // 0x62 один вниз и раздача его вокруг // 0x62 пива на стене // 0x62 пива на стене // 0x61 один вниз и передать его ")