Задача
Напишите программу, которая выступает в качестве Fractran интерпретатор. Победителем является самый короткий интерпретатор по количеству символов на любом языке. Ваша программа должна принимать два входа: программа фрактанта, которая должна быть выполнена, и целое число ввода n. Программа может быть в любой форме, удобной для вашей программы - например, список из 2-х кортежей или плоский список. Вывод должен быть единственным целым числом, являющимся значением регистра в конце выполнения.
Fractran
Fractran - тривиальный эзотерический язык, изобретенный John Conway. Программа фрактанта состоит из списка положительных дробей и начального состояния n. Интерпретатор поддерживает счетчик программ, изначально указывающий на первую фракцию в списке. Программы Fractran выполняются следующим образом:
- Проверьте, является ли произведение текущего состояния и фракция, находящаяся в настоящее время под программным счетчиком, целым числом. Если это так, умножьте текущее состояние на текущую дробь и reset счетчик программ на начало списка.
- Продвиньте счетчик программ. Если конец списка достигнут, остановитесь, в противном случае вернитесь к шагу 1.
Подробнее о том, как и почему работает Fractran, см. запись esolang и эту запись по хорошей математике/плохой математике.
Тест-векторы
Программа: [(3, 2)]
Вход: 72 (2 3 3 2)
Выход: 243 (3 5)
Программа: [(3, 2)]
Вход: 1296 (2 4 3 4)
Выход: 6561 (3 8)
Программа: [(455, 33), (11, 13), (1, 11), (3, 7), (11, 2), (1, 3)] < ш > Вход: 72 (2 3 3 2)
Выход: 15625 (5 6)
Бонусный тестовый вектор:
Ваше сообщение не обязательно должно правильно исполнять эту последнюю программу, чтобы быть приемлемым ответом. Но это правда, если это так!
Программа: [(455, 33), (11, 13), (1, 11), (3, 7), (11, 2), (1, 3)] < ш > Вход: 60466176 (2 10 3 10)
Выход: 7888609052210118054117285652827862296732064351090230047702789306640625 (5 100)
Представления и подсчет очков
Программы занимают строго по длине в символах - самое короткое - лучшее. Не стесняйтесь представить как красиво выложенную, так и документированную и "минитизированную" версию вашего кода, чтобы люди могли видеть, что происходит.
Язык 'J' недопустим. Это потому, что уже известное решение в J на одной из связанных страниц. Если вы поклонник J, извините!
В качестве дополнительного бонуса, однако, любой, кто может предоставить работающего переводчика fractran в фрактране, получит бонус в размере 500 баллов. В маловероятном случае с несколькими переводчиками для самостоятельного хостинга, каждый с самым коротким числом дробей получит награду.
Победители
Официальным победителем, после подачи самоорганизационного решения фрактанта, содержащего 1779 фракций, является решение Джесси Бедер. Практически говоря, решение слишком медленно, чтобы выполнить даже 1 + 1, однако.
Невероятно, с тех пор это было избито другим решением фрактрана - Amadaeus solution всего за 84 фракции! Он способен выполнять первые два тестовых примера в течение нескольких секунд при работе на моем исходном решении Python. Он использует новый метод кодирования для фракций, что также заслуживает пристального внимания.
Почетные упоминания:
- решение Stephen Canon, в 165 символах сборки x86 (28 байт машинного кода)
- Иорданское решение в 52 символах рубина - который обрабатывает длинные целые числа
- Бесполезное решение в 87 символах Python, которое, хотя и не является самым коротким решением Python, является одним из немногих решений, которые не являются рекурсивными и, следовательно, более сложны программ с легкостью. Это также очень читаемо.