Para outro desafio que estou escrevendo, preciso verificar se os casos de teste são solucionáveis com números inteiros limitados. Especificamente, preciso verificar o seguinte, para uma matriz não vazia de números inteiros A
e uma largura de bit inteiro n
:
- Todos os números inteiros
a
emA
satisfazíveis-2**(n-1) <= a < 2**(n-1)
(representáveis comn
números inteiros de complemento de -bit two). - O comprimento de
A
é menor que2**n
. - A soma de
A
satisfaz-2**(n-1) <= sum(A) < 2**(n-1)
. - Todas as combinações de elementos
A
atendem a todas as condições acima.
Naturalmente, decidi terceirizar esse problema para você!
Dada uma matriz de números inteiros A
e uma largura de bits inteira positiva n
, verifique se A
satisfaz as condições acima.
Casos de teste
[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
Implementação de referência (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))
Respostas:
Wolfram Language (Mathematica) , 40 bytes
Experimente online!
A condição 1 é implícita verificando a condição 3 para todos os subconjuntos, incluindo os de um elemento. Então tomamos o máximo de
e verifique se é menor que
2^#2
(onde#2
está a entrada de largura de bits).Ao custo de apenas mais 6 bytes, podemos substituí-lo
Subsets@#
porGatherBy[#,Arg]
, o que é muito mais eficiente, porque calcula apenas os dois subconjuntos de pior caso: o subconjunto de todos os valores não negativos e o subconjunto de todos os valores negativos. (Isso funciona porqueArg
tem um valor de0
no primeiro eπ
no segundo.)fonte
Geléia , 19 bytes
Experimente online!
Basta verificar se
mapped sum of powerset + length of set
está no intervalo necessário.fonte
ÆẸ
em vez de2*$
(não testado)05AB1E ,
131211 bytesEconomizou 1 byte graças ao Sr. Xcoder
Experimente online!
Explicação
fonte
±
) #JavaScript (ES6),
756358 bytesA soma de qualquer subconjunto de
a
mentiras entre as somas dos elementos negativos e não-negativos, portanto, verificar as duas somas é suficiente para tudo, exceto o caso 2. Edit: Saved1217 bytes graças a @Arnauld.fonte
[-2, -2], 3
deveria ser verdade, não?Geléia ,
2120 bytesExperimente online!
Solução linear de complexidade de tempo. Acontece que eu superestimei a complexidade do tempo
porque agora percebo que classificar a matriz é completamente desnecessário.
Explicação:
fonte
~2¦
pode ser;~
. EDIT: Feito.;~$
vai funcionar.JavaScript (ES6), 114 bytes
Recebe entrada na sintaxe de currying
(A)(n)
. Retorna um booleano.Casos de teste
Mostrar snippet de código
fonte
Pitão , 20 bytes
Experimente aqui!
fonte
Clojure,
121117 bytesBem, isso foi um pouco idiota, dividir em valores positivos e negativos é muito melhor do que classificar. Original, mas surpreendentemente não muito mais:
Isso funciona verificando somas de prefixo da sequência em ordem crescente e decrescente, acho que não é necessário gerar todas as combinações de elementos em
A
.(into () S)
é efetivamente o mesmo que(reverse S)
, à medida que as listas crescem da cabeça. Não consegui descobrir uma maneira de usar emcons
vez deconcat
quando há duas listascons
para. : /fonte
Gelatina , 15 bytes
Experimente online!
Explicação
Economizou 1 byte graças a caird coinheringaahing (lendo a segunda entrada de STDIN em vez de CLA).
fonte
Casca , 14 bytes
Ir com força bruta fazendo um loop sobre todas as sublistas, pois a divisão em partes positivas e negativas leva mais bytes. Experimente online!
Explicação
fonte
Python 2 ,
727170 bytesA saída é via presença / ausência de um erro .
Experimente online!
fonte