La distance de Hamming entre deux chaînes de longueur égale est le nombre de positions auxquelles les symboles correspondants sont différents.
Soit P
une chaîne binaire de longueur n
et T
une chaîne binaire de longueur 2n-1
. Nous pouvons calculer les n
distances de Hamming entre P
et chaque n
sous-chaîne de longueur T
dans l'ordre de gauche à droite et les mettre dans un tableau (ou une liste).
Exemple de séquence de distance de Hamming
Soit P = 101
et T = 01100
. La séquence des distances de Hamming que vous obtenez de cette paire est 2,2,1
.
Définition de proximité
Considérons maintenant deux de ces séquences de distances de Hamming. Dites x = (0, 2, 2, 3, 0)
et y = (2, 1, 4, 4, 2)
comme exemples. Nous disons cela x
et y
sommes close
si y <= x <= 2*y
ou si x <= y <= 2*x
. Ici, la multiplication scalaire et l'inégalité sont prises élément par élément. C'est - à - dire pour deux séquences A
et B
, A <= B iff A[i] <= B[i]
pour tous les indices i
.
Notez que les séquences de distances de Hamming forment un ordre partiel sous cette façon de les comparer. En d'autres termes, de nombreuses paires de séquences ne sont ni supérieures ni égales ni inférieures ou égales les unes aux autres. Par exemple (1,2)
et (2,1)
.
Donc, en utilisant l'exemple ci-dessus, (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)
mais (0, 2, 2, 3, 0)
n'est pas plus grand que (2, 1, 4, 4, 2)
. N'est (2, 1, 4, 4, 2)
pas non plus inférieur ou égal à 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)
. En conséquence x
et y
ne sont pas proches les uns des autres.
Tâche
Pour augmenter à n
partir de n=1
, considérez toutes les paires possibles de chaînes binaires P
de longueur n
et T
de longueur 2n-1
. Il existe de 2^(n+2n-1)
telles paires et donc de nombreuses séquences de distances de Hamming. Cependant, bon nombre de ces séquences seront identiques. La tâche consiste à trouver la taille du plus grand ensemble de séquences de distance de Hamming afin qu'il n'y ait pas deux séquences proches l'une de l'autre.
Votre code doit afficher un nombre par valeur de n
.
But
Votre score est globalement le plus élevé n
atteint par votre code sur ma machine en 5 minutes (mais lisez la suite). Le timing est pour le temps de fonctionnement total, pas le temps juste pour cela n
.
Afin de donner des scores pour les réponses non optimales, parce que trouver des réponses optimales est probablement difficile, nous aurons besoin d'un système de notation légèrement subtil. Votre score est la valeur la plus élevée n
pour laquelle personne d'autre n'a publié de réponse correcte plus élevée pour toute taille inférieure ou égale à celle-ci. Par exemple, si vous sortez 2, 4, 21
et que quelqu'un d'autre sort, 2, 5, 15
vous ne marquerez 1
que si quelqu'un d'autre a une meilleure réponse pour n = 2
. Si vous produisez, 2, 5, 21
vous obtiendrez un score, 3
peu importe ce que quelqu'un d'autre produit car ces réponses sont toutes optimales. De toute évidence, si vous avez toutes les réponses optimales, vous obtiendrez le score le plus élevé que n
vous publiez. Cependant, même si votre réponse n'est pas optimale, vous pouvez toujours obtenir le score si personne d'autre ne peut le battre.
Exemples de réponses et d'exemples fonctionnels
(Ces réponses ne sont pas encore vérifiées. Une vérification indépendante serait grandement appréciée.)
Merci à ETHproductions:
- n = 1 donne 2.
- n = 2 donne 5.
- n = 3 donne 21.
Regardons n = 2
plus en détail. Dans ce cas, la liste complète des séquences de distance de Hamming (représentées ici par des tuples) est:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Nous pouvons voir que ce (0,0)
n'est pas proche de tout autre tuple. En fait , si nous prenons (0, 0)
, (0, 1)
, (1, 0)
, (2, 1)
, (1,2)
alors aucun de ces tuples sont proches de l' un des autres. Cela donne un score de 5
pour n = 2
.
Pour n = 3
la liste complète des séquences distinctes de distance de Hamming:
[(0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 3, 2), (3, 3, 3)]
De ces 48
séquences, nous pouvons choisir un ensemble de taille 21
afin qu'aucune paire de cet ensemble ne soit proche l'une de l'autre.
Langues et bibliothèques
Vous pouvez utiliser toutes les langues et bibliothèques disponibles que vous aimez. Dans la mesure du possible, il serait bon de pouvoir exécuter votre code, veuillez donc inclure une explication complète sur la façon d'exécuter / compiler votre code sous Linux si possible.
Ma machine Les temporisations seront exécutées sur ma machine 64 bits. Il s'agit d'une installation Ubuntu standard avec 8 Go de RAM, processeur AMD FX-8350 à huit cœurs et Radeon HD 4250. Cela signifie également que je dois pouvoir exécuter votre code.
Réponse principale
- Score de 4 pour 2, 5, 21, 83, 361 par Christian Sievers. C ++
- Score de 5 pour 2, 5, 21, 83, 372 par fəˈnɛtɪk. Javascript