Le code 39 , développé en 1974, est l'une des symbologies ou types de codes-barres les plus couramment utilisés, bien que ce soit le système UPC / EAN qui soit le plus souvent utilisé dans les ventes au détail. Les codes à barres du code 39 peuvent coder des lettres majuscules, des chiffres et certains symboles et sont faciles à imprimer à partir d'un logiciel informatique à l'aide d'une police spéciale. Cela a conduit à leur utilisation commerciale et industrielle généralisée (par exemple, badges d'identification d'entreprise, suivi des actifs, automatisation des usines).
Créez le programme ou la fonction la plus courte pour lire un code-barres Code 39 dans n'importe quelle orientation à partir d'une image en niveaux de gris de 512 x 512 pixels; le code-barres peut ne pas être aligné horizontalement ou verticalement.
- Votre programme doit accepter un format de fichier image standard et produire les données encodées dans le code-barres comme sa sortie standard ou sa valeur de retour (n'incluant aucun caractère de début / fin).
- Aucune image ne contient plus d'un code-barres Code 39 valide, et aucun code-barres ne code un caractère espace (ASCII 32).
- Si aucun code à barres Code 39 valide n'est affiché dans l'image, le programme doit générer un seul point d'interrogation (
?
).
J'ai préparé une implémentation de référence JavaScript et une suite de tests d'images au format PNG, avec et sans codes-barres valides. L'implémentation de référence, qui ne réussit que 3 des 46 cas de test dans les navigateurs Web les plus récents, est destinée à montrer un algorithme de décodage possible, non strictement conforme à la spécification ci-dessus.
Une soumission valide passe au moins 80% de ces tests (37/46) et ne prend pas plus d'une minute pour le faire pour chaque image sur un processeur raisonnablement rapide (par exemple quad-core 2,6 GHz). Mon implémentation de référence passe 93% des tests et traite chaque image en 10 secondes (sur mon ordinateur de bureau exécutant Google Chrome).
(Cette question a été proposée sur Meta le 28 mai 2011.)
Réponses:
Python, 899 caractères
Ce code prend une image au format pnm en entrée, donc je l'exécute normalement comme:
Le code lui-même choisit simplement de nombreuses lignes de balayage aléatoires et essaie de faire correspondre les pistes en noir et blanc sur cette ligne de balayage aux modèles de code39. Il est aléatoire de sorte qu'il peut parfois ne pas trouver de codes-barres. (J'obtiens un taux d'échec de faux négatifs d'environ 20% sur les images de test.) Quand il échoue, cela prend environ une minute pour fonctionner, quand il réussit, il le fait souvent beaucoup plus rapidement que cela. Je n'ai jamais vu de faux positif.
la source
M=dict(zip('UK.-RQA+HGYXON*TEDJ1/87$%540WVML SCBIZPF3296',[385,259,...]))