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.)