Untuk tantangan lain yang saya tulis, saya perlu memverifikasi bahwa kasus uji dapat diselesaikan dengan bilangan bulat terbatas. Secara khusus, saya perlu memverifikasi yang berikut ini, untuk array integer yang tidak kosong A
dan lebar bit integer n
:
- Semua bilangan bulat
a
diA
memuaskan-2**(n-1) <= a < 2**(n-1)
(representable dengann
-bit dua ini bilangan bulat pelengkap). - Panjangnya
A
kurang dari2**n
. - Jumlah
A
kepuasan-2**(n-1) <= sum(A) < 2**(n-1)
. - Semua kombinasi elemen
A
memenuhi semua kondisi di atas.
Secara alami, saya telah memutuskan untuk mengalihdayakan masalah ini kepada Anda!
Diberikan array bilangan bulat A
dan lebar bit bilangan bulat positif n
, verifikasi yang A
memenuhi kondisi di atas.
Uji Kasus
[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
Implementasi Referensi (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))