Фон
Fractran - эзотерический полный по Тьюрингу язык программирования, изобретенный Джоном Конвеем. Программа Fractran состоит из упорядоченного списка дробей. Программа начинается с принятия единственного целого числа в качестве входных данных. На каждой итерации программы выполняется поиск первой дроби в списке, так что при умножении числа на эту дробь получается другое целое число. Затем он повторяет этот процесс с новым номером, начиная с начала списка. Если в списке нет дроби, которую можно умножить на число, программа завершает работу и выдает число в качестве результата.
Причина, по которой Fractran является Turing-complete, заключается в том, что он имитирует машину регистрации. Первичная факторизация числа хранит содержимое регистров, в то время как деление и умножение являются способом условного сложения и вычитания из регистров. Я бы порекомендовал прочитать статью в Википедии (ссылка выше).
Соревнование
Ваша задача - написать самую короткую из возможных программ, которая может принимать действительную программу Fractran из STDIN в качестве единственного входа и генерировать действительную BF-программу для STDOUT, которая имитирует программу Fractran. Есть два способа, которыми вы можете симулировать программу Fractran с помощью BF.
ПРИМЕЧАНИЕ. Ваш ответ не является программой BF. Ваш ответ - это код, который генерирует программу BF из любой данной программы Fractran. Цель состоит в том, чтобы программа BF была эквивалентна программе Fractran. (технически вы могли бы сделать соревнование в BF, но это было бы сложно)
Опция 1
Ваша программа должна выводить программу BF, которая выполняет следующие действия:
- Принимает ровно 1 число из STDIN в виде соответствующего символа ASCII (благодаря тому, как работает ввод BF), который является вводом в программу Fractran.
- Печатает ровно 1 число в STDOUT в форме соответствующего символа ASCII, который является выходом для программы Fractran.
Эта опция предназначена для точного представления входных и выходных данных виртуальной машины Fractran.
Вариант 2
Код BF, создаваемый вашей программой, должен выполнять следующие действия:
- Возьмите ввод, используя простую факторизацию числа, уже закодированного в памяти (до запуска программы). Если входное значение равно 28 (2 * 2 * 7), то во второй ячейке будет значение 2, а в седьмой ячейке - значение 1 (указатель начинается с ячейки 0). Все остальные ячейки будут равны нулю.
- Дайте вывод, имея основную факторизацию выхода, закодированного в памяти, когда программа завершается. Если выходные данные равны 10, то в каждой из ячеек 2 и 5 должно быть значение 1. Все остальные ячейки с простыми номерами должны иметь значение ноль. Содержание других клеток не имеет значения.
Эта опция представляет вычислительную модель, лежащую в основе языка Fractran.
Правила и требования
- Ввод (сверху вашей программы) будет список фракций на STDIN. В каждой строке будет одна дробь с запятой между числителем и знаменателем. Пустая строка представляет конец ввода. Фракции всегда будут сокращены до самых низких сроков.
- Вывод вашей программы должен быть однострочным, действительной BF-программой для STDOUT. Эта программа должна иметь возможность имитировать эту конкретную программу Fractran в соответствии с одним из двух вариантов. Для любого ввода сгенерированная программа BF должна иметь возможность выдавать тот же результат, что и программа Fractran.
- Вы должны указать, какой вариант вы выбрали.
- Вы можете выбрать границы памяти и ленты BF, а также указать, будут ли они переноситься.
- КОД ГОЛЬФ. Кроме того, размер выводимых программ BF не имеет значения, только размер программы, которая выполняет преобразование.
- Программы должны состоять только из печатных ASCII
Если я где-то неоднозначен, не стесняйтесь спрашивать. Это очень сложная задача для описания.
Кроме того, пожалуйста, опубликуйте сгенерированный код вашей программы для следующего ввода, чтобы обеспечить простой способ проверить, работает ли ваша программа:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
Эта программа вычисляет число 1 в двоичном расширении числа. Однако ввод и вывод отформатированы странным образом (как и во всех программах Fractran). Вход имеет форму 2 ^ A, а выход имеет форму 13 ^ B.
источник
Ответы:
Питон, 182 символа
Вариант 1, стандартные байтовые ячейки. Есть только 255 возможных входных данных (0 в качестве входных данных на самом деле не имеет смысла), поэтому я просто запускаю интерпретатор Fractran 255 раз в Python и генерирую простую программу Brainfuck для поиска таблиц, кодирующую результаты.
Вывод для примера ввода (
___
= 246 больше вложенных условий, я не могу вставить весь результат, так как он слишком большой):источник
Питон, 420 символов
Здесь используется некая комбинация опций 1 и 2: предполагается, что brainfuck реализован с большими целыми числами (я использую реализацию Sage). Введите fractran программы, например,
33/20,5/11,13/10,1/5,2/3,10/7,7/2
. Затем предварительно загрузите число, например2^5
, в курсор. Затем запустите вывод этого скрипта Python. Подождите 44 секунды. Результат13^2
находится там , где начался курсор. Я не дождался ответа2^7
.Это мой первый сценарий. Конечно, можно играть в гольф дальше, но у меня есть другие дела до позднего вечера.
edit: вместо того, чтобы играть в гольф дальше, я работаю над решением для варианта 2. также, вот результат для запрошенной программы:
источник
2^7
с моим переводчиком Brainfuck менее чем за 5 секунд. Кроме того, не должно ли это бытьraw_input()
вместоraw_input
(или это какая-то странность, о которой я не знаю)?raw_input()
надо. Я не удивлен, что компетентные интерпретаторы мозгового штурма добиваются большего успеха, чем моя ужасно наивная реализация Sage.Perl, 326 символов
Я собираюсь ответить на свой собственный вопрос, надеюсь, чтобы стимулировать больше ответов. Я, конечно, не имею права на победу. Это вариант 2 с неограниченной памятью и ячейками, хотя он работает и с ячейками. Каждая фракция преобразуется в один блок кода. Новые строки предназначены для удобства чтения.
Вот пример выходных данных. Это использует тот факт, что другие символы игнорируются как комментарии. Это также кажется очень коротким выводом по сравнению с другими записями, хотя размер вывода технически не имеет значения.
источник
Шалфей, 431 символ
Это совершенно новое решение. Я придумал несколько лучших способов сделать что-то в мозге, и это правильно реализует Вариант 2. Добавлены новые строки для ясности. Вероятно, это может быть дальше, но это требует переписывания BF, чтобы иметь меньшую глубину петли.
Образец вывода:
Учитывая вход
33/20,5/11,13/10,1/5,2/3,10/7,7/2
источник