Фон
Fractran - це езотерична мова програмування, яку Тюрінг винайшов Джон Конвей. Програма Fractran складається з упорядкованого списку дробів. Програма починається з взяття одного цілого числа як вхідного. Кожна ітерація програми здійснює пошук у списку першого дробу таким чином, що множення числа на цей дріб дає інше ціле число. Потім він повторює цей процес з новим номером, починаючи з початку списку. Коли в списку немає дробу, який можна помножити на число, програма припиняється і надає число як вихід.
Причина того, що Fractran є повним Тьюрінгом, полягає в тому, що він імітує реєстрову машину. Основна факторизація числа зберігає вміст регістрів, тоді як ділення та множення є способом умовного додавання та віднімання з регістрів. Я рекомендую прочитати статтю Вікіпедії (зв'язана вище).
Змагання
Ваше завдання - написати якомога коротшу програму, яка може прийняти дійсну програму 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
Якщо я десь неоднозначний, не соромтеся запитати. Це дуже складний виклик для опису.
Крім того, будь ласка, опублікуйте згенерований BF код вашої програми для наступного введення, щоб забезпечити простий спосіб перевірити, чи працює ваша програма:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
Ця програма обчислює кількість одиниць у двійковому розширенні числа. Однак вхід і вихід форматовані дивним чином (як і у всіх програмах Fractran). Вхід має вигляд 2 ^ A, тоді як вихід має форму 13 ^ B.