W przypadku innego wyzwania, które piszę, muszę sprawdzić, czy przypadki testowe można rozwiązać za pomocą ograniczonych liczb całkowitych. W szczególności muszę zweryfikować następujące elementy w przypadku niepustej tablicy liczb całkowitych A
i szerokości bitów liczb całkowitych n
:
- Wszystkie liczby całkowite
a
wA
zaspokojenia-2**(n-1) <= a < 2**(n-1)
(zakodowania zn
bitowych liczb całkowitych w dwóch dopełniacza). - Długość
A
jest mniejsza niż2**n
. - Suma
A
satysfakcji-2**(n-1) <= sum(A) < 2**(n-1)
. - Wszystkie kombinacje elementów
A
spełniają wszystkie powyższe warunki.
Oczywiście zdecydowałem się zlecić ten problem na zewnątrz!
Biorąc pod uwagę tablicę liczb całkowitych A
i dodatnią szerokość bitów całkowitych n
, sprawdź, czy A
spełnia powyższe warunki.
Przypadki testowe
[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
Implementacja referencji (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))
Odpowiedzi:
Wolfram Language (Mathematica) , 40 bajtów
Wypróbuj online!
Warunek 1 jest implikowany przez sprawdzenie warunku 3 dla wszystkich podzbiorów, w tym dla jednego elementu. Więc bierzemy maksimum
i sprawdź, czy to mniej niż
2^#2
(gdzie#2
jest wejście o szerokości bitu).Kosztem zaledwie 6 więcej bajtów, możemy wymienić
Subsets@#
sięGatherBy[#,Arg]
, co jest o wiele bardziej wydajny, ponieważ oblicza tylko dwóch najgorszych scenariuszy podzbiory: podzbiór wszystkich wartości nieujemnych, a podzbiór wszystkich wartości ujemnych. (Działa to, ponieważArg
ma wartość0
pierwszego iπ
drugiego).źródło
Galaretka , 19 bajtów
Wypróbuj online!
Wystarczy sprawdzić, czy
mapped sum of powerset + length of set
jest w wymaganym zakresie.źródło
ÆẸ
zamiast2*$
(niesprawdzonego)05AB1E ,
131211 bajtówZaoszczędzono 1 bajt dzięki Mr. Xcoder
Wypróbuj online!
Wyjaśnienie
źródło
±
)JavaScript (ES6),
756358 bajtówSuma dowolnego podzbioru
a
leży między sumami elementów ujemnych i nieujemnych, więc sprawdzenie dwóch sum wystarcza na wszystko oprócz przypadku 2. Edycja: Zapisano1217 bajtów dzięki @Arnauld.źródło
[-2, -2], 3
powinien być prawdziwy, prawda?Galaretka ,
2120 bajtówWypróbuj online!
Rozwiązanie złożoności czasowej liniowej. Okazuje się, że przeceniłem złożoność czasu
ponieważ teraz zdaję sobie sprawę, że sortowanie tablicy jest całkowicie niepotrzebne.
Wyjaśnienie:
źródło
~2¦
może być;~
. EDYCJA: Gotowe.;~$
będzie działać.JavaScript (ES6), 114 bajtów
Pobiera dane wejściowe w składni curry
(A)(n)
. Zwraca wartość logiczną.Przypadki testowe
Pokaż fragment kodu
źródło
Pyth , 20 bajtów
Wypróbuj tutaj!
źródło
Clojure,
121117 bajtówCóż, to było trochę głupie, dzielenie na wartości dodatnie i ujemne jest o wiele lepsze niż sortowanie. Oryginalne, ale zaskakująco niewiele dłużej:
Działa to poprzez sprawdzanie sum prefiksu sekwencji w porządku rosnącym i malejącym, myślę, że nie jest konieczne generowanie wszystkich kombinacji elementów w
A
.(into () S)
jest tak samo jak(reverse S)
, ponieważ listy rosną z głowy. Nie mogłem wymyślić sposobu użyciacons
zamiast,concat
gdy istnieją dwie listycons
do. : /źródło
Galaretka , 15 bajtów
Wypróbuj online!
Wyjaśnienie
Zaoszczędzono 1 bajt dzięki caird coinheringaahing (odczytywanie drugiego wejścia z STDIN zamiast CLA).
źródło
Łuska , 14 bajtów
Radzenie sobie z brutalną siłą poprzez zapętlanie wszystkich podlist, ponieważ podział na części dodatnią i ujemną zajmuje więcej bajtów. Wypróbuj online!
Wyjaśnienie
źródło
Python 2 ,
727170 bajtówWyjście odbywa się przez obecność / brak błędu .
Wypróbuj online!
źródło