La tâche consiste à trouver un moyen de tracer une ligne horizontale dans un tableau d'entiers 16 bits.
Nous supposons un tableau de 256x192 pixels avec 16 pixels par mot. Une ligne est une suite contiguë de bits set (1). Les lignes peuvent commencer au milieu de n'importe quel mot, chevaucher tout autre mot et se terminer par n'importe quel mot; ils peuvent également commencer et se terminer par le même mot. Ils ne peuvent pas passer à la ligne suivante. Astuce: les mots du milieu sont faciles - écrivez simplement 0xffff, mais les bords seront délicats, tout comme la gestion de la casse pour le début et la fin dans le même mot. Une fonction / procédure / routine doit prendre une coordonnée x0 et x1 indiquant les points de départ et d'arrêt horizontaux, ainsi qu'une coordonnée y.
Je m'en exclue car j'ai moi-même conçu un algorithme presque identique pour un processeur intégré, mais je suis curieux de savoir comment les autres s'y prendraient. Points bonus pour l'utilisation d'opérations relativement rapides (par exemple, une opération de multiplication ou de virgule flottante 64 bits ne serait pas rapide sur une machine intégrée mais un simple décalage de bits le serait.)
la source
Réponses:
Ce code suppose que x0 et x1 sont des points de terminaison inclusifs et que les mots sont peu endiens (c'est-à-dire que le pixel (0,0) peut être défini avec
array[0][0]|=1
).la source
Python
L'astuce principale consiste à utiliser une table de recherche pour stocker les masques de bits des pixels. Cela permet d'économiser quelques opérations. Une table de 1 Ko n'est pas si grande, même pour une plate-forme intégrée de nos jours
Si l'espace est vraiment restreint, pour le prix de quelques & 0xf, la table de recherche peut être réduite à seulement 64B
Ce code est en Python, mais serait simple à porter vers n'importe quel langage qui prend en charge les opérations sur les bits.
Si vous utilisez C, vous pouvez envisager de dérouler la boucle à l'aide
switch
de l'appareil de Duff . Étant donné que la ligne a une largeur maximale de 16 mots, je voudrais étendre la ligneswitch
à 14 lignes et me passer duwhile
tout.la source
Voici une version C de ma réponse Python utilisant l'instruction switch au lieu de la boucle while et une indexation réduite en incrémentant un pointeur au lieu de l'index du tableau
La taille de la table de recherche peut être considérablement réduite en utilisant T [x1 & 0xf] et U [x2 & 0xf] pour quelques instructions supplémentaires
la source
Scala,
lignes 7s / 1M lignes4.1s / 1Mpremière mise en œuvre:
Après avoir éliminé l'appel de méthode interne et remplacé le for- par une boucle while, sur mon Single Core 2Ghz avec Scala 2.8, il absout 1 Mio. Lignes en 4.1s sec. au lieu des 7 initiaux.
Code de test et invocation:
Test de performance:
Testé avec le temps de l'outil unix, en comparant le temps utilisateur, y compris le temps de démarrage, le code compilé, pas de phase de démarrage JVM.
L'augmentation du nombre de lignes montre que pour chaque nouveau million, il a besoin de 3,3 secondes supplémentaires.
la source