Para otro desafío que estoy escribiendo, necesito verificar que los casos de prueba se puedan resolver con enteros acotados. Específicamente, necesito verificar lo siguiente, para una matriz no Aentera de enteros y un ancho de bit entero n:
- Todos los enteros
aenAsatisf-2**(n-1) <= a < 2**(n-1)(representables connlos enteros complementarios de dos bits). - La longitud de
Aes menor que2**n. - La suma de las
Asatisfacciones-2**(n-1) <= sum(A) < 2**(n-1). - Todas las combinaciones de elementos
Asatisfacen todas las condiciones anteriores.
¡Naturalmente, he decidido externalizar este problema!
Dada una matriz de enteros Ay un ancho de bit entero positivo n, verifique que Acumpla con las condiciones anteriores.
Casos de prueba
[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
Implementación de referencia (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))

Respuestas:
Wolfram Language (Mathematica) , 40 bytes
Pruébalo en línea!
La condición 1 está implícita al verificar la condición 3 para todos los subconjuntos, incluidos los de un elemento. Entonces tomamos el máximo de
y verifique si es menor que
2^#2(donde#2está la entrada de ancho de bits).A costa de sólo 6 bytes más, podemos reemplazar
Subsets@#conGatherBy[#,Arg], que es mucho más eficiente, ya que sólo computa los dos subconjuntos peor de los casos: el subconjunto de todos los valores no negativos, y el subconjunto de todos los valores negativos. (Esto funciona porqueArgtiene un valor0en el primero yπen el segundo).fuente
Jalea , 19 bytes
Pruébalo en línea!
Es suficiente verificar que
mapped sum of powerset + length of setesté en el rango requerido.fuente
ÆẸen lugar de2*$(no probado)05AB1E ,
131211 bytesGuardado 1 byte gracias al Sr. Xcoder
Pruébalo en línea!
Explicación
fuente
±)JavaScript (ES6),
756358 bytesLa suma de cualquier subconjunto de
amentiras entre las sumas de los elementos negativos y no negativos, por lo que verificar las dos sumas es suficiente para todo excepto el caso 2. Editar: Guardado1217 bytes gracias a @Arnauld.fuente
[-2, -2], 3debería ser cierto, ¿no?Jalea ,
2120 bytesPruébalo en línea!
Solución de complejidad de tiempo lineal. Resulta que sobreestimé la complejidad del tiempo
porque ahora me doy cuenta de que ordenar la matriz es completamente innecesario.
Explicación:
fuente
~2¦puede ser;~. EDITAR: Listo.;~$funcionará.JavaScript (ES6), 114 bytes
Toma entrada en la sintaxis de curry
(A)(n). Devuelve un booleano.Casos de prueba
Mostrar fragmento de código
fuente
Pyth , 20 bytes
Pruébalo aquí!
fuente
Clojure,
121117 bytesBueno, eso fue un poco tonto, dividir en valores positivos y negativos es mucho mejor que ordenar. Original, pero sorprendentemente no mucho más:
Esto funciona comprobando las sumas de prefijos de la secuencia en orden ascendente y descendente, creo que no es necesario generar todas las combinaciones de elementos
A.(into () S)es en efecto igual que(reverse S), a medida que las listas crecen desde la cabeza No pude encontrar una manera de usar enconslugar deconcatcuando hay dos listas paraconshacer. : /fuente
Jalea , 15 bytes
Pruébalo en línea!
Explicación
Guardado 1 byte gracias a caird coinheringaahing (leyendo la segunda entrada de STDIN en lugar de CLA).
fuente
Casco , 14 bytes
Ir con fuerza bruta recorriendo todas las sublistas, ya que dividir en partes positivas y negativas requiere más bytes. Pruébalo en línea!
Explicación
fuente
Pitón 2 ,
727170 bytesLa salida es por presencia / ausencia de un error .
Pruébalo en línea!
fuente