Đố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 Avà độ rộng bit nguyên n:
- Tất cả các số nguyên
atrongAthỏ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
Anhỏ hơn2**n. - Tổng số
Athỏ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 Avà độ rộng bit nguyên dương n, xác minh rằng Athỏ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))