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 A
entera de enteros y un ancho de bit entero n
:
- Todos los enteros
a
enA
satisf-2**(n-1) <= a < 2**(n-1)
(representables conn
los enteros complementarios de dos bits). - La longitud de
A
es menor que2**n
. - La suma de las
A
satisfacciones-2**(n-1) <= sum(A) < 2**(n-1)
. - Todas las combinaciones de elementos
A
satisfacen todas las condiciones anteriores.
¡Naturalmente, he decidido externalizar este problema!
Dada una matriz de enteros A
y un ancho de bit entero positivo n
, verifique que A
cumpla 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#2
está 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 porqueArg
tiene un valor0
en 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 set
esté 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
a
mentiras 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], 3
deberí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 encons
lugar deconcat
cuando hay dos listas paracons
hacer. : /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