Сегодня мы рассмотрим последовательность а , связанную с функцией Коллатца f :
Мы называем последовательность вида г, ф (г), F (F (Z)), ... в последовательности Коллатца .
Первое число в нашей последовательности, a (1) , равно 0 . При повторном применении f оно попадает в цикл 0 → 0 →…
Наименьшее число, которое мы еще не видели, равно 1, делая (2) = 1 . При повторном применении f оно попадает в цикл 1 → 4 → 2 → 1 →…
Теперь мы увидели число 2 в цикле выше, поэтому следующим наименьшим числом является (3) = 3 , попадающее в цикл 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 → 4 → 2 → 1 →…
Во всех вышеперечисленных циклах мы уже видели 4 и 5 , поэтому следующим числом является (4) = 6 .
К настоящему времени вы должны получить идею. a (n) - наименьшее число, которое не входило ни в одну последовательность Коллатца для всех a (1),…, a (n - 1) .
Напишите программу или функцию, которая, учитывая положительное целое число n , возвращает a (n) . Самый короткий код в байтах побеждает.
Testcases:
1 -> 0
2 -> 1
3 -> 3
4 -> 6
5 -> 7
6 -> 9
7 -> 12
8 -> 15
9 -> 18
10 -> 19
50 -> 114
(Это последовательность OEIS A061641 .)
n
быть на основе 0?a(n+1) = a(n) odd: 3*a(n)+1, or a(n) even: a(n)/2
a
не на основе 0, я не понимаю, почему вы, кажется, здесь говорите «на основе 0»:a(n) is the smallest number that was not part of any Collatz sequences for all a(0), …, a(n − 1).
Ответы:
Желе ,
2019 байтовПопробуйте онлайн! или проверьте все тесты .
Как это работает
После n итераций значение a (n + 1) будет в начале массива. Поскольку мы объединяем новый массив с обращенной копией старого, это означает, что a (n) будет в конце.
источник
Haskell,
9392 байтаПример использования:
([y|y<-[-1..],all(/=y)$c=<<[0..y-1]]!!) 10
->19
.c x
это цикл Коллатцаx
с немного изменойx == 1
. Основные функции перебирают все целые числа и сохраняют те, которые не предназначеныc x
дляx
in[0..y-1]
. Практически прямая реализация определения. Поскольку оператор индекса Haskell!!
основан на 0, я начинаю-1
с добавления (в противном случае бесполезного) числа, чтобы зафиксировать индекс.источник
MATL ,
4640 байтПопробуйте онлайн!
объяснение
Код имеет внешний
for
цикл, который генерируетn
последовательности Коллатца, по одной в каждой итерации. Каждая последовательность генерируется внутреннимdo...while
циклом, который вычисляет новые значения и сохраняет их в векторе последовательности до тех пор, пока не будет получено1
или0
. Когда мы закончим с последовательностью, вектор будет инвертирован и объединен с глобальным вектором, который содержит значения из всех предыдущих последовательностей. Этот вектор может содержать повторяющиеся значения. Обращение вектора последовательности гарантирует, что в конце внешнего цикла желаемый результат (начальное значение последней последовательности) будет в конце глобального вектора.Псевдокод :
Код комментария :
источник
Brachylog ,
7067656362 байтаПопробуйте онлайн!
источник
Python 2,
9796 байтИспользует тот факт, что все кратные 3 являются чистыми. Проверьте это на Ideone .
Как это работает
В первой строке
r,=s={-1}
задает s = {-1} (set) и r = -1 .Затем мы читаем целое число из STDIN, повторяем определенную строку столько раз, а затем выполняем ее. Это эквивалентно следующему коду Python.
В каждой итерации мы начинаем с поиска наименьшего члена {r + 1, r + 2, r + 3} , который не принадлежит s . На первой итерации это инициализирует r как 0 .
Во всех последующих запусках s может (и будет) содержать некоторые из r + 1 , r + 2 и r + 3 , но никогда не все из них, поскольку все кратные 3 являются чистыми. Чтобы проверить это утверждение, обратите внимание, что кратное m из 3 не имеет формы 3k + 1 . Это оставляет 2 м как единственно возможное предварительное изображение, которое также кратно 3 . Таким образом, m не может появиться в последовательности Коллатца любого числа, которое меньше, чем m , и поэтому является чистым.
После идентификации r и инициализации n мы применяем функцию Collatz с помощью
n=(n/2,3*n+1)[n%2]
добавления каждого промежуточного значения n к набору s с помощьюs|={n}
. Как только мы встретим число n , которое уже находится в s ,{n}-s
получим пустое множество, и итерация остановится.Последнее значение r является желаемым элементом последовательности.
источник
Pyth , 32 байта
Тестирование.
источник
Java, 148 байт
Идео это!(Предупреждение: экспоненциальная сложность из-за нулевой оптимизации.)
Преобразование его из
do...while
цикла вfor
цикл было бы лучше, но у меня возникли проблемы с этим.Совет игры в гольф приветствуется как обычно.
источник
for(b=1,i=1;i<n;i++)
наfor(b=1,i=0;++i<n;)
. Кстати, я понимаю, почему ваш ideone пропускает тестовый пример для 50, но почему он также пропускает 10? Он может справиться с этим без проблем.int a(int n){if(n<2)return 0;int f=a(n-1),b=0,i,c;for(;b<1;){f++;for(b=1,i=1;i<n;i++)for(c=i==2?4:a(i);c>1;c=c%2>0?c*3+1:c/2)b=c==f?0:b;}return f;}
Perl6, 96
На основании ответа Perl 5 . Немного дольше, так как синтаксис Perl6 менее простителен, чем синтаксис Perl5, но на этом я пока остановлюсь.
источник
PHP,
233124 байта+4 для функции:
источник
Perl 5 - 74 байта
Это довольно простое решение. Он многократно применяет функцию Collatz к переменной
$a
и сохраняет в массиве,@c
что значение было просмотрено, затем, достигнув 0 или 1, увеличивается$a
до тех пор, пока не увидит число, которое еще не было замечено. Это повторяется количество раз, равное входному значению минус 2, и, наконец,$a
выводится значение.источник
Mathematica, 134 байта
Более легкий для чтения формат:
источник