OEIS имеет вариант (A111439) последовательности Голомба . Как и в последовательности Голомба, A(n)
описывает, как часто n
появляется в последовательности. Но кроме того, никакие два последовательных числа не могут быть идентичными. При построении последовательности A(n)
всегда выбирается как наименьшее положительное целое число, которое не нарушает эти два свойства. Из-за запрещенных последовательных идентичных чисел ряд слегка колеблется вверх и вниз по мере роста. Вот первые 100 терминов:
1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 8, 9,
10, 9, 10, 9, 10, 11, 10, 11, 10, 11, 10, 11, 12, 11, 12, 13, 12, 13, 12,
13, 12, 13, 12, 13, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 16, 15,
16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 18, 17, 18, 17, 18, 19, 18, 19, 18,
19, 18, 19, 18, 19, 18, 19, 20, 19, 20, 21, 20, 21, 20, 21, 20, 21, 20
Полный список первых 10000 номеров можно найти в OEIS .
Задача состоит в том, чтобы написать программу или функцию, которая вычисляет A(n)
, учитывая n
. n
на 1
основе того, что свойство с самоописанием работает.
правила
Вы можете написать программу или функцию и использовать любой из наших стандартных методов получения ввода и предоставления вывода.
Вы можете использовать любой язык программирования , но учтите, что эти лазейки по умолчанию запрещены.
Это код-гольф , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.
Тестовые случаи
n A(n)
1 1
4 2
10 6
26 10
100 20
1000 86
1257 100
10000 358
N
после последнего вхождения появляется число,N-1
которое измеряет количество колебаний доN
.)Ответы:
Haskell , 67 байт
Определяет функцию
f
. Попробуйте онлайн! Это очень медленно,f 15
время ожидания вычислений на TIO.объяснение
Просто перейдем к определению: на каждом этапе выберите минимальное положительное число,
n
которое удовлетворяет ограничениям (не равным предыдущей записи и еще не произошлоf n
).источник
Mathematica,
6968 байтСпасибо Мартину Эндеру за то, что он нашел для меня дополнительный -1 байт!
Безымянная функция, принимающая положительное целое число в
n
качестве входных данных и возвращающая положительное целое число. Построим весь список первыхn
элементов этой последовательности, затем возьмемLast
элемент. Список{}
создается, начиная с пустого списка и оперируя с ним функциейn
раз в строке (черезNest
).Рассматриваемая функция
{##&@@#,1//.x_/;x==Last@#||#~Count~x==#[[x]]->x+1}&
принимает частичный список значений последовательности (по существу##&@@#
) и добавляет к нему следующее значение. Следующее значение вычисляется путем запуска сx=1
последующим многократным замещениемx
доx+1
тех пор, пока выполняется условиеx==Last@#||#~Count~x==#[[x]]
- иными словами, если либоx
является предыдущим элементом, либоx
уже находится в списке правильное число раз. Эта функция выдает некоторые ошибки, так как (например) мы не должны вызыватьx
th-й элемент исходного списка{}
; Однако все значения верны.источник
Python 2,
9986 байтСпасибо @Dennis за несколько улучшений общим объемом 13 байт!
Программа работает довольно наивно: она отслеживает список значений, которые она определила до сих пор, и надеется добавить следующее значение. Он пытается добавить a
1
в конец списка, если может; если нет, то он пытается2
и так далее, пока что-то не разрешено.Теперь мы начнем с того,
1,2,3
что будем подавать результаты1,2,3
. Это сделано для того, чтобы избежать каких-либо проблем, поскольку список уже вычисленных значений слишком короткий: я предполагаю, что еслиn
по крайней мере,4
тоa(n)
строго меньше, чемn
. (В этой программеs[n]
он равенa(n)
. Наш список фактически инициализирован[0,1,2,3]
так, потому что списки0
индексируются в Python. Так, напримерa(1)=s[1]=1
, иa(2)=s[2]=2
.)Итак, допустим, мы пытаемся определить
s[m]
, что означает, что наш список уже включаетs[0], s[1], ..., s[m-1]
. Мы начнем сt=1
и попытаемся установитьs[m]=1
. Когда это не работает, мы идемt=2
и пытаемся установитьs[m]=2
. Каждый раз, когда мы увеличиваемt
, мы проверяем,s.count(t)==s[t]
... но правая часть не будет выдавать ошибку, пока нам никогда не придется идти так высоко, какt=m
. Гипотеза говорит, что мы никогда не должны, так как первое значение, которое мы вычисляем, на самом делеs[4]
.Эта реализация вычисляет на 3 значения последовательности больше, чем нужно. Например, если
n
есть8
, он вычислит доs[11]
того, как вернет значениеs[8]
.Я был бы счастлив увидеть подтверждение гипотезы. Я полагаю, что это может быть доказано (сильной?) Индукцией.
Изменить: Вот доказательство гипотезы . На самом деле мы доказываем немного более сильную форму утверждения, поскольку оно не требует дополнительной работы.
Теорема: для всех
n
больше или равно4
, терминa(n)
меньше или равен(n-2)
.Доказательство (по индукции Strong): (Base
n=4
): Это утверждение верно дляn=4
, так какa(4) = 2 = 4-2
.Теперь предположим,
a(k)
что меньше или равноk-2
для всехk
от4
сквозногоn
, включительно (и предположимn
, по крайней мере4
). В частности, это означает, что все предыдущие члены последовательности были не более(n-2)
. Нам нужно показать, чтоa(n+1)
будет максимум(n-1)
. Теперь, по определению,a(n)
это наименьшее положительное целое число, которое не нарушает ни одно из условий, поэтому нам просто нужно показать, что значение(n-1)
не будет нарушать ни одно из условий.Значение
(n-1)
не будет нарушать условие «нет последовательных повторов», потому что по предположению индукции предыдущая запись была не более(n-2)
. И это не будет нарушать условиеa(m)
«количество разm
появляется», если оно(n-1)
не было достигнутоa(n-1)
. Но по предположению сильной индукции,(n-1)
ранее были достигнуты0
времена, иa(n-1)
не равен,0
посколькуa(m)
является положительным для всехm
.Следовательно
a(n+1)
, меньше или равноn-1 = (n+1)-2
, как желательно. QED.источник
Желе , 17 байт
Последние три контрольных примера - это слишком много для TIO. Я проверил 1000 и 1257 локально.
Попробуйте онлайн! или проверьте первые 100 терминов .
Как это устроено
источник
Python 2 ,
7774 байтаЭто рекурсивная реализация алгоритма @ mathmandan .
Реализация O (безумная) : ввод 9 занимает 2 секунды локально, ввод 10 52 секунд и ввод 11 17 минут и 28 секунд. Однако если декларация объявлена как обычная функция, а не как лямбда, для проверки контрольных примеров можно использовать памятку.
Попробуйте онлайн!
Обратите внимание, что даже при наличии заметки TIO не может вычислить f (1257) или f (10000) (оба проверены локально).
источник
05AB1E ,
3231 байтПопробуйте онлайн!
объяснение
Мы технически в цикле ,
G
когда мы добавляем N в глобальный список, но все петли в 05AB1E использовать ту же переменную N как индекс, так что внутренний контур[...]
имеет переписывается N изG
означает , что мы можем добавить его вне цикла.Проблемы с вложенными циклами и условиями не позволяют нам делать это внутри цикла.
источник
Befunge,
141136 байтПопробуйте онлайн!
Из-за ограничений памяти Befunge практически нецелесообразно отслеживать все предыдущие записи в последовательности, поэтому в этом решении используется алгоритм с меньшим объемом памяти, который вычисляет значения более непосредственно.
Тем не менее, мы все еще ограничены размером ячейки, который в эталонном интерпретаторе Befunge-93 представляет собой 8-битное значение со знаком, поэтому наибольшее поддерживаемое четное число в последовательности равно
A(1876) = 126
, а наибольшее поддерживаемое нечетное число равноA(1915) = 127
.Если вы хотите проверить большие значения, вам нужно использовать интерпретатор с большим размером ячейки. Это должно включать большинство реализаций Befunge-98 ( попробуйте онлайн! ).
источник
Python 2, 117 байт
Мех. Не так коротко. Простое итеративное решение.
Попробуйте онлайн
Вот действительно неудачная попытка рекурсивного решения (129 байт):
источник
-1
вместо того,n-1
чтобы сохранить байт, я думаю, нет.