Para outro desafio que estou escrevendo, preciso verificar se os casos de teste são solucionáveis com números inteiros limitados. Especificamente, preciso verificar o seguinte, para uma matriz não vazia de números inteiros Ae uma largura de bit inteiro n:
- Todos os números inteiros
aemAsatisfazíveis-2**(n-1) <= a < 2**(n-1)(representáveis comnnúmeros inteiros de complemento de -bit two). - O comprimento de
Aé menor que2**n. - A soma de
Asatisfaz-2**(n-1) <= sum(A) < 2**(n-1). - Todas as combinações de elementos
Aatendem a todas as condições acima.
Naturalmente, decidi terceirizar esse problema para você!
Dada uma matriz de números inteiros Ae uma largura de bits inteira positiva n, verifique se Asatisfaz as condições acima.
Casos de teste
[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
Implementação de referência (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))