Для другой задачи, которую я пишу, мне нужно проверить, что тестовые случаи разрешимы с ограниченными целыми числами. В частности, мне нужно проверить следующее для непустого массива целых A
и целочисленной битовой ширины n
:
- Все числа
a
вA
удовлетворяют условию-2**(n-1) <= a < 2**(n-1)
(представимых сn
битовых дополнением до двух целых чисел). - Длина
A
меньше чем2**n
. - Сумма
A
удовлетворяет-2**(n-1) <= sum(A) < 2**(n-1)
. - Все комбинации элементов
A
удовлетворяют всем вышеперечисленным условиям.
Естественно, я решил передать эту проблему вам!
Учитывая массив целых чисел A
и положительную целую битовую ширину n
, убедитесь, что A
удовлетворяет условиям выше.
Тестовые случаи
[0, 0, 0], 2: True
[0, 0, 0, 0], 2: False (violates #2)
[1, 2, 3, 4, 5], 8: True
[1, 2, 3, 4, 5], 2: False (violates all conditions)
[1, 2, 3, 4, 5], 5: True
[-3, 4, 1], 4: True
[10, 0, -10], 4: False (violates #1 and #4)
[27, -59, 20, 6, 10, 53, -21, 16], 8: False (violates #4)
[-34, 56, 41, -4, -14, -54, 30, 38], 16: True
[-38, -1, -11, 127, -35, -47, 28, 89, -8, -12, 77, 55, 75, 75, -80, -22], 7: False (violates #4)
[-123, -85, 6, 121, -5, 12, 52, 31, 64, 0, 6, 101, 128, -72, -123, 12], 12: True
Реализация ссылок (Python 3)
#!/usr/bin/env python3
from itertools import combinations
from ast import literal_eval
def check_sum(L, n):
return -2**(n-1) <= sum(L) < 2**(n-1)
def check_len(L, n):
return len(L) < 2**n
def check_elems(L, n):
return all(-2**(n-1) <= a < 2**(n-1) for a in L)
A = literal_eval(input())
n = int(input())
OUTPUT_STR = "{}, {}: {}".format(A, n, "{}")
if not (check_elems(A, n) and check_len(A, n) and check_sum(A, n)):
print(OUTPUT_STR.format(False))
exit()
for k in range(1, len(A)):
for b in combinations(A, k):
if not check_sum(b, n):
print(OUTPUT_STR.format(False))
exit()
print(OUTPUT_STR.format(True))
Ответы:
Wolfram Language (Mathematica) , 40 байт
Попробуйте онлайн!
Условие 1 подразумевается проверкой условия 3 для всех подмножеств, включая одноэлементные. Итак, мы берем максимум
и проверьте, если это меньше, чем
2^#2
(где#2
ввод битовой ширины).Цена всего-более байт, мы можем заменить
Subsets@#
сGatherBy[#,Arg]
, который является гораздо более эффективным , поскольку он вычисляет только два наихудших подмножества: подмножество всех неотрицательных значений, а подмножество всех значений отрицательных. (Это работает, потому чтоArg
имеет значение для0
первого иπ
второго.)источник
Желе , 19 байт
Попробуйте онлайн!
Достаточно проверить, что
mapped sum of powerset + length of set
находится в требуемом диапазоне.источник
ÆẸ
вместо2*$
(не проверено)05AB1E ,
131211 байтовСохранено 1 байт благодаря Mr. Xcoder
Попробуйте онлайн!
объяснение
источник
±
)JavaScript (ES6),
756358 байтСумма любого подмножества
a
лежит между суммами отрицательных и неотрицательных элементов, поэтому проверка двух сумм достаточна для всего, кроме случая 2. Редактирование: Сохранено1217 байт благодаря @Arnauld.источник
[-2, -2], 3
должно быть правдой, нет?Желе ,
2120 байтПопробуйте онлайн!
Решение по линейной временной сложности. Оказывается, я переоценил сложность времени
потому что теперь я понимаю, что сортировка массива совершенно не нужна.
Объяснение:
источник
~2¦
может быть;~
. РЕДАКТИРОВАТЬ: Готово.;~$
будет работать.JavaScript (ES6), 114 байт
Принимает ввод в синтаксисе карри
(A)(n)
. Возвращает логическое значение.Контрольные примеры
Показать фрагмент кода
источник
Pyth , 20 байтов
Попробуй это здесь!
источник
Clojure,
121117 байтНу, это было немного глупо, разделение на положительные и отрицательные значения намного лучше, чем сортировка. Оригинально, но на удивление не намного дольше:
Это работает путем проверки сумм префиксов последовательности в порядке возрастания и убывания, я думаю, что нет необходимости создавать все комбинации элементов в
A
.(into () S)
в действительности так же, как(reverse S)
, как списки растут из головы. Я не мог найти способ использоватьcons
вместоconcat
двух списков,cons
чтобы. : /источник
Желе , 15 байт
Попробуйте онлайн!
объяснение
Сохранено 1 байт благодаря совместному использованию caird (чтение второго ввода из STDIN вместо CLA).
источник
Шелуха , 14 байт
Идем грубой силой, перебирая все подсписки, поскольку разбиение на положительные и отрицательные части занимает больше байтов. Попробуйте онлайн!
объяснение
источник
Python 2 ,
727170 байтВыход через наличие / отсутствие ошибки .
Попробуйте онлайн!
источник