Вступ: Комбінаційна логіка
Комбінаційна логіка (CL) заснована на речах, званих комбінаторами , які в основному є функціями. Є два основні "вбудовані" комбінатори, S
і K
, що буде пояснено пізніше.
Ліво-асоціативність
CL - ліво-асоціативний , що означає, що дужки (містять речі), які знаходяться в лівій частині ліворучної пари дужок, що містять його, можуть бути вилучені, при цьому його матеріал буде вивільнений. Наприклад, щось подібне:
((a b) c)
Можна зменшити до
(a b c)
Там, де (a b)
знаходиться ліворуч від більшої дужки ((a b) c)
, його можна зняти.
Набагато більший приклад асоціації ліворуч (квадратні дужки - це пояснення):
((a b) c ((d e) f (((g h) i) j)))
= (a b c ((d e) f (((g h) i) j))) [((a b) c...) = (a b c...)]
= (a b c (d e f (((g h) i) j))) [((d e) f...) = (d e f...)]
= (a b c (d e f ((g h i) j))) [((g h) i) = (g h i)]
= (a b c (d e f (g h i j))) [((g h i) j) = (g h i j)]
Дужки також можна зменшити, коли більше однієї пари обертаються навколо одних і тих же предметів. Приклади:
((((a)))) -> a
a ((((b)))) -> a b
a (((b c))) -> a (b c) [(b c) is still a group, and therefore need brackets.
Note that this doesn't reduce to `a b c`, because
`(b c)` is not on the left.]
Вбудовані
У CL є два "вбудовані" комбінатори, S
і K
які можуть перемикати об'єкти (поодинокі комбінатори або група комбінаторів / груп, обгорнутих у дужки) приблизно так:
K x y = x
S x y z = x z (y z)
Де x
, y
і z
може бути дублерів для чого - небудь.
Приклад S
і K
полягають в наступному:
(S K K) x [x is a stand-in for anything]
= S K K x [left-associativity]
= K x (K x) [S combinator]
= x [K combinator]
Ще один приклад:
S a b c d
= a c (b c) d [combinators only work on the n objects to the right of it,
where n is the number of "arguments" n is defined to have -
S takes 3 arguments, so it only works on 3 terms]
Вищенаведені приклади звичайних заяв CL, де твердження не можна додатково оцінювати і досягає кінцевого результату за певний час. Існують ненормовані твердження (це твердження CL, які не припиняються і будуть оцінюватися назавжди), але вони не входять до сфери завдання та не потребують їх висвітлення.
Якщо ви хочете дізнатися більше про CL, прочитайте цю сторінку Вікіпедії .
Завдання:
Ваше завдання - зробити додаткові комбінатори, враховуючи кількість аргументів, і що він оцінює як вхідний, який задається так:
{amount_of_args} = {evaluated}
Де {amount_of_args}
натуральне число дорівнює кількості аргументів і {evaluated}
складається з:
- аргументи до суми аргументів,
1
будучи першим аргументом,2
будучи другим, тощо.- Вам гарантовано, що номери аргументів, що перевищують кількість аргументів (тобто лише
4
тоді, коли{amount_of_args}
є3
), не з'являться у{evaluated}
.
- Вам гарантовано, що номери аргументів, що перевищують кількість аргументів (тобто лише
- дужки
()
Отже, приклади входів:
3 = 2 3 1
4 = 1 (2 (3 4))
Перший вхід запитує комбінатор (скажімо, R
) з трьома аргументами ( R 1 2 3
), який потім оцінює:
R 1 2 3 -> 2 3 1
Другий вхід запитує про це (з назвою комбінатора A
):
A 1 2 3 4 -> 1 (2 (3 4))
З урахуванням введення в цьому форматі, ви повинні повернути рядок S
, K
і ()
, що при підстановці з ім'ям комбінатора і працювати з аргументами, повертає той же оцінене заяву в якості {evaluated}
блоку , коли командний блок заміщено тому для цього імені комбінатора.
У вихідному операторі комбінатора може бути видалено пробіл і видалені зовнішні дужки, тому щось подібне (S K K (S S))
можна перетворити SKK(SS)
.
Якщо ви хочете , щоб перевірити виходи вашої програми, @aditsu зробив комбінаторної логіки аналізатор (який включає в себе S
, K
, I
і навіть ті , і інші люблять B
і C
) тут .
Оцінка:
Оскільки це метагольф , метою цього виклику є досягнення найменшої кількості байтів на виході з урахуванням цих 50 тестів . Будь ласка, поставте у відповідь свої результати для 50 тестових випадків або зробіть пастину (чи щось подібне) та опублікуйте посилання на цю пастину.
У разі вирівнювання виграє найдавніше рішення.
Правила:
- Ваша відповідь повинна повернути правильний вихід - тому, задавши вхід, він повинен повернути правильний вихід відповідно до визначення в задачі.
- Ваша відповідь повинна вийти протягом години на сучасному ноутбуці для кожного тестового випадку.
- Будь-яке жорстке кодування рішень заборонено. Однак вам дозволяється жорстко кодувати до 10 комбінаторів.
- Ваша програма повинна повертати те саме рішення кожного разу за один і той же вхід.
- Ваша програма повинна повернути дійсний результат для будь-яких даних, а не лише тестових випадків.
1
, ви можете відняти 1
з усього, а потім обернути рішення для цієї відповіді K()
. Приклад: Рішення для 2 -> 1
є K
, тому рішення для 3 -> 2
є KK
, рішення 4 -> 3
є K(KK)
і т.д.