Коллац на Фрактране
От: Кодт Россия  
Дата: 07.07.23 17:08
Оценка:
А вот вам этюд для труъ программистов!

"Я хочу сыграть с вами в одну игру..." (Джон Конвей, про свою игру "Жизнь")

Вы задаёте список положительных дробей.
Берём некое натуральное число.
И пытаемся умножить его на первую дробь. Если результат дробный — отменяем, пытаемся умножить на вторую дробь. И так далее...
Короче говоря, находим в списке первую дробь, которая при умножении на число даёт натуральное число.
Повторяем эту процедуру для результата умножения. (Каждый раз начинаем поиск от начала списка).
Ну и так далее.
Если ни одна из дробей не подошла, то процедура останавливается.

Этот список дробей является программой на эзотерическом языке Fractran.

Поскольку, я надеюсь, всем очевидно, что фрактран-машина имеет дело с разложением чисел на степени простых множителей, и сами множители ни на что не влияют, то можем сразу перейти к представлению фрактран-машины над конечными векторами целых чисел.
Программа представляет собой список векторов с произвольными компонентами (и положительными, и отрицательными).
Состояние — вектор со строго неотрицательными.

Пример кода, который делит число с остатком: <x,0,0> --> <0,x/2,x%2>
то есть, на вход подаём 2^x, а в итоге хотим получить 3^d * 5^r

1) < -2, +1, 0 > = 2^-2 * 3 = 3/4
2) < -1, 0, +1 > = 2^-1 * 5 = 5/2

Машина работает так:
— если x >= 2, делаем x-=2, d+=1 — и повторяем
— если x >= 1, делаем x-=1, r+=1 — и тут уже повторять не получится
— на этом и останавливаемся.

А вот пример машины, которая бесконечно прыгает между тремя состояниями
1) < -1, +1, 0 > = 3/2
2) < 0, -1, +1 > = 5/3
3) < +1, 0, -1 > = 2/5
Подаём на вход <1,0,0> = 2 и всё заверте




Предлагаю маленький конкурс: написать программу, реализующую последовательность Коллаца (3x+1).

На входе — некое число, символизирующее x. (Например, 2^x)
На выходе — некое число, символизирующее количество итераций до значения 1. (Например, 3^t)
(Примем за постулат, что 3x+1 всегда сходится к циклу 1-4-2-1).

Чем короче будет программа, тем лучше.

Только давайте сразу договоримся, что код публиковать в виде векторов, а не в виде дробей. Потому что какое-нибудь 1234/567 воспринимать тяжело, это же надо факторизовывать (2^1 * 617^1) / (3^4 * 7^1)
Перекуём баги на фичи!
Отредактировано 11.07.2023 20:24 Кодт . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.