Đối với một thử thách khác mà tôi đang viết, tôi cần xác minh rằng các trường hợp thử nghiệm có thể giải quyết được với các số nguyên bị ràng buộc. Cụ thể, tôi cần xác minh các điều sau đây, cho một mảng số nguyên không trống A
và độ rộng bit nguyên n
:
- Tất cả các số nguyên
a
trongA
thỏa mãn-2**(n-1) <= a < 2**(n-1)
(biểu diễn vớin
-bit hai của số nguyên bổ sung). - Độ dài
A
nhỏ hơn2**n
. - Tổng số
A
thỏa mãn-2**(n-1) <= sum(A) < 2**(n-1)
. - Tất cả sự kết hợp của các yếu tố trong
A
đáp ứng tất cả các điều kiện trên.
Đương nhiên, tôi đã quyết định thuê ngoài vấn đề này cho bạn!
Cho một mảng các số nguyên A
và độ rộng bit nguyên dương n
, xác minh rằng A
thỏa mãn các điều kiện trên.
Các trường hợp thử nghiệm
[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
Tham chiếu thực hiện (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))