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))
Jawaban:
Bahasa Wolfram (Mathematica) , 40 byte
Cobalah online!
Kondisi 1 tersirat dengan memeriksa kondisi 3 untuk semua himpunan bagian, termasuk yang satu elemen. Jadi kami mengambil maks
dan periksa apakah itu kurang dari
2^#2
(di mana#2
input bit-width).Dengan biaya hanya 6 byte lebih, kita dapat menggantinya
Subsets@#
denganGatherBy[#,Arg]
, yang jauh lebih efisien karena hanya menghitung dua himpunan bagian terburuk: himpunan bagian dari semua nilai non-negatif, dan himpunan bagian dari semua nilai negatif. (Ini berfungsi karenaArg
memiliki nilai0
pada yang pertama danπ
yang terakhir.)sumber
Jelly , 19 byte
Cobalah online!
Sudah cukup untuk memeriksa bahwa
mapped sum of powerset + length of set
ada dalam kisaran yang diperlukan.sumber
ÆẸ
alih-alih2*$
(belum teruji)05AB1E ,
131211 byteDisimpan 1 byte berkat Tn. Xcoder
Cobalah online!
Penjelasan
sumber
±
)JavaScript (ES6),
756358 byteJumlah dari setiap himpunan
a
kebohongan antara jumlah dari elemen negatif dan nonnegatif, jadi memeriksa dua jumlah tersebut sudah cukup untuk semuanya kecuali case 2. Edit: Disimpan1217 byte berkat @Arnauld.sumber
[-2, -2], 3
seharusnya benar, bukan?Jelly ,
2120 byteCobalah online!
Solusi kompleksitas waktu linier. Ternyata saya terlalu memperkirakan kerumitan waktu
karena sekarang saya menyadari bahwa menyortir array sama sekali tidak perlu.
Penjelasan:
sumber
~2¦
bisa;~
. EDIT: Selesai.;~$
akan berhasil.JavaScript (ES6), 114 byte
Mengambil input dalam sintaks currying
(A)(n)
. Mengembalikan boolean.Uji kasus
Tampilkan cuplikan kode
sumber
Pyth , 20 byte
Coba di sini!
sumber
Clojure,
121117 byteYah itu agak bodoh, memecah menjadi nilai positif dan negatif jauh lebih baik daripada memilah. Asli, tetapi secara mengejutkan tidak lebih lama:
Ini bekerja dengan memeriksa jumlah awalan dari urutan dalam urutan naik dan turun, saya pikir itu tidak perlu untuk menghasilkan semua kombinasi elemen di
A
.(into () S)
berlaku sama dengan(reverse S)
, karena daftar tumbuh dari kepala. Saya tidak bisa menemukan cara untuk menggunakannyacons
daripadaconcat
ketika ada dua daftar untukcons
melakukannya. : /sumber
Jelly , 15 byte
Cobalah online!
Penjelasan
Disimpan 1 byte berkat caird coinheringaahing (membaca input kedua dari STDIN bukan CLA).
sumber
Sekam , 14 byte
Pergi dengan kekuatan kasar dengan mengulang semua sublists, karena membelah menjadi bagian positif dan negatif membutuhkan lebih banyak byte. Cobalah online!
Penjelasan
sumber
Python 2 ,
727170 byteOutput adalah melalui ada / tidak adanya kesalahan .
Cobalah online!
sumber