Mathematica, 65 байт
f[a___,x_,b___]/;NestList[2#-1&,a~Min~b/. 2->0,4]~SubsetQ~{a,b}=x
Это определяет функцию, fкоторая должна вызываться с 5 аргументами, например
f[5, 9, 17, 33, 829]
В принципе, функцию можно вызывать с любым (ненулевым) числом аргументов, но вы можете получить неожиданные результаты ...
Я думаю, что это первый раз, когда мне удалось поместить все решение нетривиальной задачи в левую часть a =.
объяснение
Это решение действительно позволяет нам использовать возможности сопоставления с образцом Mathematica. Основная функция, которую мы используем, состоит в том, что Mathematica не может просто определять простые функции, как, f[x_] := (* some expression in x *)но мы можем использовать произвольно сложные шаблоны в левой части, например f[{a_, b_}, x_?OddQ] := ..., добавить определение, к fкоторому будет использоваться, только когда оно вызывается с двухэлементным список и нечетное целое число. Удобно, что мы уже можем давать имена элементам произвольно далеко вниз по левому выражению (например, в последнем примере мы могли бы сразу ссылаться на два элемента списка как aи b).
Шаблон, который мы используем в этой задаче f[a___,x_,b___]. Здесь a___и b___есть последовательности из нуля или более аргументов и xявляется одним аргументом. Так как правая часть определения просто x, что мы хотим, какая - то магия , которая гарантирует , что xиспользуется для ввода , мы ищем и a___и b___просто маски , которые охватывают остальные элементы.
Это делается путем прикрепления условия к шаблону с помощью /;. Правая часть /;(все до =) должна вернуться, Trueчтобы этот шаблон соответствовал. Прелесть в том , что модель согласовань Mathematica будет пытаться каждое назначение a, xи bк входам для нас, поэтому поиска правильного элемента делается для нас. По сути, это декларативное решение проблемы.
Что касается самого условия:
NestList[2#-1&,a~Min~b/. 2->0,4]~SubsetQ~{a,b}
Обратите внимание, что это не зависит xвообще. Вместо этого это условие зависит только от оставшихся четырех элементов. Это еще одна удобная особенность решения сопоставления с образцом: благодаря шаблонам последовательности aи bвместе содержат все другие входные данные.
Таким образом, это условие должно проверить, являются ли оставшиеся четыре элемента непрерывными элементами из нашей последовательности с не более чем одним пропуском. Основная идея для проверки этого состоит в том, что мы генерируем следующие четыре элемента из минимума (через ) и проверяем, являются ли четыре элемента его подмножеством. Единственные входные данные, в которых это может вызвать проблемы, - это те, которые содержат a , потому что это также генерирует допустимые элементы последовательности, поэтому нам нужно обрабатывать это отдельно.xi+1 = 2xi - 12
Последняя часть: давайте пройдемся по самому выражению, потому что здесь есть еще несколько забавных синтаксических символов.
...a~Min~b...
Эта инфиксная нотация коротка для Min[a,b]. Но помните, что aи bявляются последовательностями, так что это фактически расширяется до четырех элементов Min[i1, i2, i3, i4]и дает нам наименьший оставшийся элемент на входе.
.../. 2->0
Если это приводит к 2, мы заменяем его на 0 (который будет генерировать значения, которых нет в последовательности). Пространство необходимо, потому что иначе Mathematica анализирует плавающий литерал .2.
NestList[...&,...,4]
Мы применяем безымянную функцию слева 4 раза к этому значению и собираем результаты в список.
2#-1&
Это просто умножает его вход на 2 и уменьшает его.
...~SubsetQ~{a,b}
И, наконец, мы проверяем, что список, содержащий все элементы из aи bявляется подмножеством этого.