Für eine weitere Herausforderung, die ich schreibe, muss ich überprüfen, ob Testfälle mit begrenzten ganzen Zahlen lösbar sind. Insbesondere muss ich Folgendes für ein nicht leeres Array von Ganzzahlen Aund eine ganzzahlige Bitbreite überprüfen n:
- Alle Ganzzahlen
ainAerfüllen-2**(n-1) <= a < 2**(n-1)(darstellbar mitn-bit zwei Komplement-Ganzzahlen). - Die Länge von
Aist weniger als2**n. - Die Summe von
Aerfüllt-2**(n-1) <= sum(A) < 2**(n-1). - Alle Kombinationen von Elementen
Aerfüllen alle obigen Bedingungen.
Natürlich habe ich beschlossen, dieses Problem an Sie auszulagern!
Vergewissern Sie sich bei einem gegebenen Array von Ganzzahlen Aund einer positiven Ganzzahlbitbreite n, dass Adie obigen Bedingungen erfüllt sind.
Testfälle
[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
Referenzimplementierung (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))