Метапрограммирование комбинаторика - PullRequest
0 голосов
/ 04 декабря 2018

Я заинтересован в создании функции python, которая принимает 2 * n аргументов, где n может быть переменной.Первые n аргументов сравниваются со вторыми n аргументами.

По существу, если, например, n = 2, функция f (a1, a2, b1, b2) проверит, что (a1 == b1 и a2 == b2) или (a1 == b2 и a2 == b1) .Для n = 3 функция f (a1, a2, a3, b1, b2, b3) проверит, что (a1 == b1 и a2 == b2 и a3 == b3) или(a1 == b2 и a2 == b3 и a3 == b1) или (a1 == b3 и a2 == b1 и a3 == b2)

Однако я хотел бы, чтобы функциясоздайте условное утверждение на лету в зависимости от значения n.

Возможно, это сложный заказ, и я могу провести собственное исследование, но есть ли кто-нибудь, кто может указать мне правильное направление?Это будет считаться метапрограммированием правильно?Кто-нибудь знает библиотеку, которая существует для такого рода вещей?

Спасибо,

-AA

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018
def f(*args):
    l = len(args)
    assert l % 2 == 0
    return args[:l / 2] == args[l / 2:] or args[:l / 2] == args[l:l / 2 - 1:-1]


assert f(True, True)
assert not f(True, False)
assert f(True, False, True, False)
assert f(True, False, False, True)
assert not f(True, False, True, True)
assert f(1, 1)
assert not f(1, 2)
assert f(1, 2, 1, 2)
assert f(1, 2, 2, 1)
assert not f(1, 2, 0, 1)
assert not f(1, 2, 1, 0)
assert f(1, 2, 3, 1, 2, 3)
assert f(1, 2, 3, 3, 2, 1)
assert not f(1, 2, 3, 1, 2, 0)
assert not f(1, 2, 3, 0, 2, 1)
0 голосов
/ 04 декабря 2018

Редактировать: так как вы сейчас указали Python, рассмотрите это как дополнительную отправную точку для будущих аскеров.

Вы можете начать свое исследование с некоторыми вариационными шаблонами:

template<typename... Args>
void foo(Args&&... args) {
  static_assert(sizeof...(args) % 2 == 0, "Need 2*n parameters for some n");
  // Condition using array + parameter pack expansion.
}
...