Фон
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.