W przypadku innego wyzwania, które piszę, muszę sprawdzić, czy przypadki testowe można rozwiązać za pomocą ograniczonych liczb całkowitych. W szczególności muszę zweryfikować następujące elementy w przypadku niepustej tablicy liczb całkowitych Ai szerokości bitów liczb całkowitych n:
- Wszystkie liczby całkowite
awAzaspokojenia-2**(n-1) <= a < 2**(n-1)(zakodowania znbitowych liczb całkowitych w dwóch dopełniacza). - Długość
Ajest mniejsza niż2**n. - Suma
Asatysfakcji-2**(n-1) <= sum(A) < 2**(n-1). - Wszystkie kombinacje elementów
Aspełniają wszystkie powyższe warunki.
Oczywiście zdecydowałem się zlecić ten problem na zewnątrz!
Biorąc pod uwagę tablicę liczb całkowitych Ai dodatnią szerokość bitów całkowitych n, sprawdź, czy Aspełnia powyższe warunki.
Przypadki testowe
[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
Implementacja referencji (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))