N-PN White-Hat Project
[Mini-challenge] Normaliser la sortie d'une comparaison. - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Communauté (https://dev.n-pn.fr/forum/forumdisplay.php?fid=10)
+--- Forum : Le bistrot (https://dev.n-pn.fr/forum/forumdisplay.php?fid=17)
+--- Sujet : [Mini-challenge] Normaliser la sortie d'une comparaison. (/showthread.php?tid=3767)



[Mini-challenge] Normaliser la sortie d'une comparaison. - b0fh - 27-09-2014

Dans la libc, la fonction strcmp(a,b) compare deux strings, et retourne une valeur négative, nulle ou positive suivant que a est plus petit, égal, ou plus grand que b.

Cette convention a été choisie parce qu'elle donne lieu a une implémentation très efficace, qui consiste a retourner la différence entre la première paire de caractères non-égaux:

Code :
int strcmp(char *a, char *b) {
    while(*a && *a == *b) {++a; ++b; }
    return *a - *b;
}

Dans certains cas, il peut être désirable de normaliser la sortie de cette fonction, c'est a dire de transformer toutes les valeurs positives en +1, et toutes les valeurs négatives en -1.

Challenge: réalisez cette transformation sans utiliser de structures de contrôle, ni opérateurs impliquant des sauts (&&, ||, ?: ) ! Le code doit marcher quelle que soit la taille effective du type int.

EDIT: corrigé une typo, c'était *a - *b et pas a - b évidemment, merci Kiwazaru

Résolu par:
(personne pour l'instant)


RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - wapiflapi - 27-09-2014

Code :
(s > 0) - (s < 0)

Exemple de cas ou c'est utile ?


RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - Atlas - 27-09-2014

ça aurait été mieux que tu réponde la solution par mp , ça nous aurait permis de chercher par nous même .


RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - Kiwazaru - 27-09-2014

En théorie, la solution de wapiflapi ne fonctionne pas dans le cadre autorisé (c-à-d aucun jumps).
En effet, la solution d'obtenir le retour d'une vérité dynamiquement pour obtenir le résulat voulu fait appel a une instruction x86 nommée SET+G (SETG), qui vérifie si c'est supérieur (pour la première vérité dans le cas donné).
Ainsi, avec un peu de recherche on remarque que l'algorithme utilisé pour mener à bien cette instruction est le suivant:
Code :
SI condition ALORS
   DEST ← 1
SINON
   DEST ← 0
FIN SI

Bien sûr, la solution reste très intelligente, mais ne respecte théoriquement pas les demandes. Tu peux donc continuer à chercher une solution, (MacYavel en a une autre), et moi je suis sur une piste. Il n'existe pas qu'une seule solution Smile


RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - gruik - 29-09-2014

(27-09-2014, 17h45)Kiwazaru a écrit : le résulat voulu fait appel a une instruction x86 nommée SET+G (SETG)

ce serait pas JG (jump if greater) et son pendant JB (jump if below) plutôt ?


RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - wapiflapi - 29-09-2014

(29-09-2014, 07h30)gruik a écrit :
(27-09-2014, 17h45)Kiwazaru a écrit : le résulat voulu fait appel a une instruction x86 nommée SET+G (SETG)

ce serait pas JG (jump if greater) et son pendant JB (jump if below) plutôt ?

Non ca fait bien appel a setg. Par contre ce n'est pas un branchement, c'est pas parce-que l'explication d'une instruction inclue un if que l'instruction fait un branchement. Sinon n'importe quelle instruction ferais des branchement, eg: XOR 1 si l'un ou l'autre mais pas les deux SINON 0.


RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - b0fh - 29-10-2014