Per un'altra sfida che sto scrivendo, devo verificare che i casi di test siano risolvibili con numeri interi limitati. In particolare, devo verificare quanto segue, per una matrice non vuota di numeri interi Ae una larghezza di bit di numero intero n:
- Tutti gli interi
ainAsoddisfano-2**(n-1) <= a < 2**(n-1)(rappresentabili connnumeri interi complementi di -bit due). - La lunghezza di
Aè inferiore a2**n. - La somma delle
Asoddisfazioni-2**(n-1) <= sum(A) < 2**(n-1). - Tutte le combinazioni di elementi
Asoddisfano tutte le condizioni di cui sopra.
Naturalmente, ho deciso di esternalizzare questo problema a te!
Data una matrice di numeri interi Ae una larghezza di bit intera positiva n, verificare che Asoddisfi le condizioni sopra.
Casi test
[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
Implementazione di riferimento (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))