Математика, 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 - 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
є його підмножиною.