Математика, 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]
В принципі, функцію можна викликати будь-якою (ненульовою) кількістю аргументів, але у вас можуть бути несподівані результати ...
Я думаю, що це вперше, що мені вдалося поставити все рішення нетривіального виклику в ліву частину а =.
Пояснення
Це рішення по-справжньому ставить можливості узгодження шаблонів 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є його підмножиною.