Considérez toutes les 2^n
différentes chaînes binaires de longueur n
et supposez n > 2
. Vous êtes autorisé à supprimer exactement les b < n/2
bits de chacune des chaînes binaires, en laissant des chaînes de longueur n-b
restantes. Le nombre de chaînes distinctes restantes dépend des bits que vous supprimez. En supposant que votre objectif est de laisser le moins de chaînes différentes restantes possible, ce défi consiste à écrire du code pour calculer combien vous pouvez en laisser en fonction de n
.
Exemple, n=3
et b = 1
. Vous ne pouvez laisser que les deux chaînes 11
et 00
.
Pour n=9
et b = 1,2,3,4
nous avons70,18,6,2
Pour n=8
et b = 1,2,3
nous avons40,10,4
Pour n=7
et b = 1,2,3
nous avons20,6,2
Pour n=6
et b = 1,2
nous avons12,4
Pour n=5
et b = 1,2
nous avons6,2
Cette question a été posée à l'origine par moi en 2014 sous une forme différente sur MO .
Entrée et sortie
Votre code doit prendre un entier n
et produire un seul entier pour chaque valeur de b
départ b = 0
et d'augmentation.
But
Votre score est le plus élevé n
pour lequel votre code se termine pour tous b < n/2
en moins d'une minute sur mon PC basé sur Linux. En cas de bris d'égalité, le plus gros de b
votre code arrive pour les plus gros n
gains communs . En cas de bris d'égalité sur ce critère aussi, le code le plus rapide pour les plus grandes valeurs de n
et b
décide. Si les temps sont dans une seconde ou deux l'un de l'autre, la première réponse publiée l'emporte.
Langues et bibliothèques
Vous pouvez utiliser n'importe quelle langue de bibliothèque que vous aimez. Parce que je dois exécuter votre code, cela aiderait s'il était gratuit (comme dans la bière) et fonctionnait sous Linux.
la source
b > 0
tant qu'exigence d'entrée supplémentaire? Ou serait-n=3
ilb=0
simplement sorti2^n
comme résultat?2^n
effet sortir .n
et un seulb
, mais le score est le plus élevén
pour lequel le code se termineb < n/2
en moins d'une minute. Ne serait-il pas préférable d'avoir une seule entréen
dans ce cas et de produire tous les résultats pour0 <= b < n/2
? Ou devrions-nous fournir deux programmes / fonctions: l'un prenant deux entréesn
etb
, et l'autre ne prenant que l'entréen
et la sortie de tous les résultats dans la plage0 <= b < n/2
?Réponses:
Python 2.7 / Gurobi n = 9
Cette solution est une utilisation très simple du solveur ILP de Gurobi pour les problèmes booléens à nombres entiers (MIP).
La seule astuce consiste à supprimer la symétrie dans le complément à 1 pour réduire de moitié la taille des problèmes.
En utilisant la licence "gratuite" à durée limitée de Gurobi LLC, nous sommes limités à 2000 contraintes, mais résoudre 10 del 1 est bien en dehors du délai de 60 secondes de toute façon sur mon ordinateur portable.
MISE À JOUR + CORR: 10,2 a une taille de solution optimale 31 (voir par exemple) Gurobi montre qu'aucune solution symétrique de taille 30 n'existe (retourne un problème irréalisable). modèles d'entiers
0 7 13 14 25 28 35 36 49 56 63 64 95 106 118 128 147 159 170 182 195 196 200 207 225 231 240 243 249 252 255
ou0 7 13 14 19 25 28 35 36 49 56 63 64 95 106 118 128 159 170 182 195 196 200 207 225 231 240 243 249 252 255
la source
C ++, n = 6
Force brute avec quelques petites optimisations.
Exécutez localement:
la source