Pour un autre défi que j'écris, je dois vérifier que les cas de test peuvent être résolus avec des entiers bornés. Plus précisément, je dois vérifier les éléments suivants, pour un tableau non vide d'entiers A
et une largeur de bit entière n
:
- Tous les entiers
a
dansA
satisfont-2**(n-1) <= a < 2**(n-1)
(représentables avecn
des entiers complémentaires à deux bits). - La longueur de
A
est inférieure à2**n
. - La somme de
A
satisfait-2**(n-1) <= sum(A) < 2**(n-1)
. - Toutes les combinaisons d'éléments
A
satisfont à toutes les conditions ci-dessus.
Naturellement, j'ai décidé de vous sous-traiter ce problème!
Étant donné un tableau d'entiers A
et une largeur de bit entière positive n
, vérifiez qu'il A
satisfait aux conditions ci-dessus.
Cas de 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
Implémentation de référence (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))