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 - 1
2
Последняя часть: давайте пройдемся по самому выражению, потому что здесь есть еще несколько забавных синтаксических символов.
...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
является подмножеством этого.