Я придумал эзотерический язык Jumper. Позже вы поймете, почему.
- Он работает с оперативной памятью с байтами в качестве ячеек. ОЗУ проиндексировано нулями и изначально заполнено нулями.
- При попытке доступа к ячейкам с отрицательными индексами должна отображаться ошибка и программа завершается.
- При попытке чтения с большим индексом, чем последний, должен быть возвращен ноль.
- При попытке записи с большим индексом, чем в прошлом, объем оперативной памяти должен быть увеличен до кратного 1024, а новые ячейки заполнены нулями (технически вы можете увеличить объем ОЗУ не до кратного 1024, причина была в повышении производительности, поэтому, если это будет стоить вам много символов, может сделать это не кратно 1024).
- Программа также имеет указатель на ячейку в оперативной памяти, которая изначально равна нулю
- Когда программа начинает выполнять запрос на ввод входной строки (или принимать входные данные из аргументов командной строки, это зависит от вас). Входная строка не должна содержать нулевой символ (нулевой байт). Затем входная строка записывается в ОЗУ, начиная с нулевого индекса.
- Когда программа заканчивается, отображается окно с выводом программы - содержимое оперативной памяти от нулевого индекса до первого нулевого байта, исключая.
Теперь самая интересная часть, синтаксис.
Программа состоит из команд (унарных операторов-префиксов) и их аргументов. Команды и аргументы могут быть разделены пробелами или новыми строками, но не обязательно. Однако пробелы внутри аргументов недопустимы, например, # 2 = 4
допустимы, но # 2 = 4 4
это не так.
Программа может иметь комментарии между ()
. Комментарии не могут быть вложенными - например, в (abc(def)ghi)
комментарии есть (abc(def)
. Комментарии могут быть размещены где угодно.
#123
устанавливает указатель RAM на 123 (любое положительное десятичное целое или ноль).>123
увеличивает указатель ОЗУ на 123 (любое положительное десятичное целое число).<123
уменьшает указатель ОЗУ на 123 (любое положительное десятичное целое число).=123
записывает 123 (любое 8-разрядное целое число без знака) в текущей ячейке.+123
добавляет 123 (любое 8-разрядное десятичное целое число без знака) в текущую ячейку (по модулю 256).-123
вычитает 123 (любое 8-разрядное десятичное целое число без знака) из текущей ячейки (по модулю 256).:123
- «Перейти» - перейти к команде № 123 (сначала 0). Вы можете контролировать поток вашей программы только с помощью goto - она должна прыгать - поэтому я решил назвать этот язык Jumper.
Если аргумент отсутствует - подумайте, что это 1 для ><+-
команд или 0 для#=:
команд.
Также есть модификатор команды - ?
(префикс к команде), он выполняет следующую команду, только если текущая ячейка не равна нулю, иначе пропускает эту команду. Может применяться к любой команде.
Например,?:17
- переходит к команде 17, если текущая ячейка не равна нулю.
Если программа недействительна или ошибка возникает во время выполнения, может отображаться сообщение «Ошибка». Из-за этого есть CodeGolf, такое короткое сообщение будет хорошо.
Твое задание
Написать кратчайший переводчик для этого языка.
Некоторые тестовые программы
(prints "Hello world!" regardless of input)
=72>=101>=108>=108>=111>=32>=119>=111>=114>=108>=100>=33>=
(appends "!" to the end of input string)
?:2 :4 >1 :0 =33 >1 =0
источник
Ответы:
Рубин, 447 байт
Принимает как программу, так и ввод через аргументы командной строки.
РЕДАКТИРОВАТЬ: Исправлено несколько ошибок и добавлена поддержка неверного синтаксиса стоимостью 40 байт (при добавлении нескольких других оптимизаций).
источник
Питон (729)
Что касается запуска программы:
Пример:
Вероятно, есть несколько вещей, которые я упустил из виду, поэтому, пожалуйста, оставьте комментарий, если вам случится попробовать что-то, что должно работать, но не работает. Обратите внимание, что это написано в коде Python 2.x.
источник
Ruby 2 -
540447420 символовЗапустите как "ruby2.0 jumper.rb" инструкция "данные инициализации" ". 1.x Ruby не будет работать (без метода String.bytes).
Добавлены многострочные команды и комментарии и улучшен мой режим.
Вот набор тестов с несколькими точечными тестами. Самый простой способ его использования - вставить код в t / jumper.t и запустить «perl t / jumper.t».
Безголовая версия.
Быстрый прото-ассемблер.
источник
Clojure -
585577 байтНикаких специальных трюков в гольфе не использовалось, потому что я не знаю ничего о Clojure. Интерпретатор чисто функциональный. Поставляется с красивым сообщением об ошибке в случае отрицательного адреса ОЗУ (выводится ошибка, но не выдается никаких исключений или ошибок).
Примеры:
Оригинальныйнемного негольфированный код:источник
-
в конце класса символов вашего регулярного выражения, вам не нужно избегать его. -1 символCoffeeScript (465)
Первое окно подсказки предназначено для программы, а второе поле ввода введено. Проверьте это на http://coffeescript.org .
Оригинал :
Это все еще игра в гольф, но прокомментировал:
Изменить : Добавление пробелов заняло больше байтов, чем я думал. Этот интерпретатор выдаст ошибку при неверном синтаксисе, другой имеет неопределенное поведение при неверном синтаксисе.
источник
?:2 :4 >1 :0 = 33 <10 =0
(программа append-! С дополнительным пробелом)<1
не<10
.Javascript, 519
Это получает программу и ввод через подсказки. Будет работать вставка этого в консоль Javascript вашего браузера, а также добавление этого в файл, вставка перед кодом
<!DOCTYPE html>
, новой строкой<html><head><script>
и после кода</script></head><body></body></html>
и сохранение полученного файла как «swagger.html».Это моя первая попытка в этом, и мне уже нравится язык. Своего рода. Тем не менее, он действительно нуждается в текстовых метках вместо маркировки указателей команд в стиле BASIC.
Беззвучная версия (вроде):
источник
clojure.string/replace
?:2 :4 >1 :0 = 33 <10 =0
(добавление! С дополнительным пробелом) Не проверено, хотя.C 687 GCC 4.9.0 и Visual C ++ 2013 (если окончание строки считается как 1)
Редактировать: благодаря Деннису теперь он намного короче (и работает в GCC для загрузки)
Версия для гольфа
Чуть менее гольф-версия:
источник
R[z]=x
наP(x)
на(R[z]=x)
. 2. GCC не требует каких-либо утверждений включения. 3.char C
->U C
.Groovy 582
версия без золота:
Я думаю, что есть ошибка с комментариями, которые не распознаются правильно, что может быть вызвано глупым регулярным выражением, которое я использовал, но две программы работают так, как должны:
источник
Haskell: безбожное количество персонажей
Хорошо, сейчас это то, что может или не может быть в ближайшее время в гольф. Он необычайно огромен, с множеством небрежно написанного кода (прошло довольно много времени с тех пор, как я в последний раз касался Haskell). Но было весело писать.
источник
Хаскелл, 584
Программа ввода и перемычки предоставляются в качестве первых двух строк ввода из стандартного ввода.
Позже я выложу версию без заглядывания, но пока что я хотел оставить это как загадку для читателя:
Веселиться!
источник