Pour un autre défi que j'écris, je dois vérifier que les cas de test peuvent être résolus avec des entiers bornés. Plus précisément, je dois vérifier les éléments suivants, pour un tableau non vide d'entiers A
et une largeur de bit entière n
:
- Tous les entiers
a
dansA
satisfont-2**(n-1) <= a < 2**(n-1)
(représentables avecn
des entiers complémentaires à deux bits). - La longueur de
A
est inférieure à2**n
. - La somme de
A
satisfait-2**(n-1) <= sum(A) < 2**(n-1)
. - Toutes les combinaisons d'éléments
A
satisfont à toutes les conditions ci-dessus.
Naturellement, j'ai décidé de vous sous-traiter ce problème!
Étant donné un tableau d'entiers A
et une largeur de bit entière positive n
, vérifiez qu'il A
satisfait aux conditions ci-dessus.
Cas de test
[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
Implémentation de référence (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))
Réponses:
Wolfram Language (Mathematica) , 40 octets
Essayez-le en ligne!
La condition 1 est implicite en vérifiant la condition 3 pour tous les sous-ensembles, y compris ceux à un élément. Nous prenons donc le maximum de
et vérifiez si c'est inférieur à
2^#2
(où#2
est l'entrée de largeur de bit).Au prix de seulement 6 octets supplémentaires, nous pouvons le remplacer
Subsets@#
parGatherBy[#,Arg]
, ce qui est beaucoup plus efficace car il ne calcule que les deux sous-ensembles les plus défavorables: le sous-ensemble de toutes les valeurs non négatives et le sous-ensemble de toutes les valeurs négatives. (Cela fonctionne carArg
a une valeur0
sur les premiers etπ
sur les seconds.)la source
Gelée , 19 octets
Essayez-le en ligne!
Il suffit de vérifier qu'il se
mapped sum of powerset + length of set
trouve dans la plage requise.la source
ÆẸ
place de2*$
(non testé)05AB1E ,
131211 octets1 octet enregistré grâce à M. Xcoder
Essayez-le en ligne!
Explication
la source
±
)JavaScript (ES6),
756358 octetsLa somme de n'importe quel sous-ensemble de
a
mensonges se situe entre les sommes des éléments négatifs et non négatifs, donc vérifier les deux sommes suffit pour tout sauf le cas 2. Edit: économisé1217 octets grâce à @Arnauld.la source
[-2, -2], 3
devrait être vrai, non?Gelée ,
2120 octetsEssayez-le en ligne!
Solution de complexité temporelle linéaire. Il s'avère que j'ai surestimé la complexité du temps
parce que maintenant je réalise que trier le tableau est complètement inutile.
Explication:
la source
~2¦
possible;~
. EDIT: Terminé.;~$
fonctionnera quand même.JavaScript (ES6), 114 octets
Prend des entrées dans la syntaxe de curry
(A)(n)
. Renvoie un booléen.Cas de test
Afficher l'extrait de code
la source
Pyth , 20 octets
Essayez-le ici!
la source
Clojure,
121117 octetsEh bien, c'était un peu stupide, la division en valeurs positives et négatives est beaucoup mieux que le tri. Original, mais étonnamment pas beaucoup plus long:
Cela fonctionne en vérifiant les sommes de préfixe de la séquence dans l'ordre croissant et décroissant, je pense qu'il n'est pas nécessaire de générer toutes les combinaisons d'éléments dans
A
.(into () S)
est en fait identique à(reverse S)
, car les listes s'élèvent de la tête. Je ne pouvais pas trouver un moyen d'utilisercons
au lieu deconcat
quand il y a deux listescons
à. : /la source
Gelée , 15 octets
Essayez-le en ligne!
Explication
1 octet sauvé grâce à caird coinheringaahing (lecture de la deuxième entrée de STDIN au lieu de CLA).
la source
Husk , 14 octets
Aller avec la force brute en bouclant sur toutes les sous-listes, car la division en parties positives et négatives prend plus d'octets. Essayez-le en ligne!
Explication
la source
Python 2 ,
727170 octetsLa sortie se fait par présence / absence d'erreur .
Essayez-le en ligne!
la source