aide urgent - Algo - Programmation
Marsh Posté le 02-11-2014 à 13:24:37
Je te donne un indice: utiliser la différence entre deux chiffres successifs.
A+,
Marsh Posté le 02-11-2014 à 19:21:33
Bonjour,
Je ferais plutôt une comparaison de grandeur avec > et < tant que les chiffre sont < ou > c'est décroissant ou croissant.
Marsh Posté le 03-11-2014 à 10:48:58
par l'anneau de l'ia a écrit : Bonjour, |
Ca revient globalement au même de faire la différence et de regarder le signe du résultat
Marsh Posté le 03-11-2014 à 12:32:57
Surtout qu'en plus, au niveau du code assembleur ou micro-processeur, une comparaison, ça a de forte chances d'être implémenté comme une différence suivi d'une comparaison à 0.
A+,
Marsh Posté le 03-11-2014 à 15:58:40
rufo a écrit : |
gilou a écrit : Surtout qu'en plus, au niveau du code assembleur ou micro-processeur, une comparaison, ça a de forte chances d'être implémenté comme une différence suivi d'une comparaison à 0. |
Peut-être mais ça demande probablement d'avantage d'instructions.
Marsh Posté le 03-11-2014 à 22:47:11
Oui mais ca te le sais pas, le seul qui sait ca c'est ton compilateur (si tu sais pas exactement vers quel plateforme tu compile).
Donc comme tu sais pas, bah t'écris if(x>y), et ton compilateur feras probablement le boulot mieux que toi.
Sauf si tu t'appelle John Carmack. Dans ce cas, toute mes excuses.
Marsh Posté le 04-11-2014 à 00:20:16
Les nombres sont représentés comment : chaîne de caractère, décimal codé binaire, voire une liste?
on peut convertir le nombre en chaîne et s'amuser à comparer directement les caractères entre eux en tenant compte du fait que l'ordre est le même dans les caractères ASCII
en tout cas cela paraît facile et l'intérêt doit être de ne boucler qu'une fois, en s'arrêtant avant la fin quand ça ne sert plus à rien.
on doit aussi pouvoir faire un truc sympa en récursif?
Marsh Posté le 04-11-2014 à 03:43:44
blazkowicz a écrit : on peut convertir le nombre en chaîne et s'amuser à comparer directement les caractères entre eux en tenant compte du fait que l'ordre est le même dans les caractères ASCII |
Il y a rien de risible la dedans, c'est le plus générique, car tu peux bosser avec des nombres de taille quelconque, plus grands que ton maxint, comme 111122223333444455556666777788889999. Et ça marche encore si c'est un nombre en hexadecimal.
A+,
Marsh Posté le 04-11-2014 à 12:15:31
khoyo a écrit : Oui mais ca te le sais pas, le seul qui sait ca c'est ton compilateur (si tu sais pas exactement vers quel plateforme tu compile). |
Là n'été pas mon idée.
Je pensais au code que nous allons écrire vous et moi pour réaliser ce programmme dans deux méthode différente.
Marsh Posté le 04-11-2014 à 13:16:41
Code :
|
Résultat :
|
Non, je ne compterai pas les instructions.
Edit : je corrige mon code, enfin, ce que je sais faire.
Marsh Posté le 04-11-2014 à 14:30:49
par l'anneau de l'ia a écrit : |
Mouais, dans ce cas on compare if(machin - truc < 0) par rapport a if(machin<truc)
La différence est pas énorme...
Marsh Posté le 04-11-2014 à 14:37:00
khoyo a écrit : |
pour un nombre d'un chiffre non, juste 1, mais pour un nombre de 10 chiffre ça fait déjà 10.
C'est pas le même poin de vue, je te l'accorde.
Marsh Posté le 04-11-2014 à 14:46:15
J'ai oublié un truc.
Pour les nombre avec des répétition de chiffre, tel 1122333444 il suffis d'ajouté un '=' aux comparaison pour tester "<=" (inférieur ou égal) et suppérieur ou égal.
Marsh Posté le 04-11-2014 à 14:51:29
Une petite version à la con faite en caml (à copier-coller dans l'interpréteur interactif ocaml, au rythme que vous voulez, à chaque ;; une évaluation)
Par fainéantise, les nombres sont des listes de int. (sinon il faudrait fouiller pour trouver une fonction de conversion ou la faire soi-même)
Par simplicité tant pis on boucle deux fois.
C'est accidentellement polymorphique à tous éléments qui auraient une relation d'ordre, en tout cas du <=.
/edit : je crois que les récursions s'arrêtent toutes seules en cas de faux? (lazy evaluation)
Code :
|
Bonus : même mon type "progressivity" accepte de se faire mouliner par les fonctions , avec comme ordre l'ordre dans lequel j'ai déclaré les quatre valeurs possibles (ce qui n'a pas trop de sens dans l'état où c'est)
return_progressivity [Progressive];;
return_progressivity [Degressive];;
return_progressivity [Progressive;Degressive];;
return_progressivity [None;Degressive;Progressive;Both];;
return_progressivity [None;Both];;
/edit : plagiat sur internet d'une fonction qui transforme une chaîne de caractères en liste de caractères,
Code :
|
ensuite
Code :
|
Marsh Posté le 04-11-2014 à 15:46:25
par l'anneau de l'ia a écrit : |
Justement non, puisque un bon compilateur optimise ça et produit probablement un binaire identique.
Donc la seul différence est dans le code source... Et comme si tu code bien, tu n’écris cette comparaison qu'une seule fois, bah la différence...
Marsh Posté le 04-11-2014 à 15:53:52
khoyo a écrit : |
T'as pas comme une incohérence dans tes propos ?
Marsh Posté le 04-11-2014 à 15:59:50
Depend du compilo, dépend du langage. Quel version est la plus efficace qui sait ?
En général ca va être la même chose.
Et de toute façon, "Premature optimization is the root of all evil"
Marsh Posté le 04-11-2014 à 16:06:45
par l'anneau de l'ia a écrit :
|
Je me demande si le return False dans la boucle fait se retourner Dijsktra dans sa tombe? (sorte de goto déguisé)
Cela dit je trouve ça bien pour faire ça et le langage est vraiment clair et net avec les end, end if, end loop etc.
Ca change de la soupe d'accolades.
Marsh Posté le 04-11-2014 à 16:24:32
blazkowicz a écrit : |
Tu peux même coder A* en une centaine de ligne il me semble (hors logistique).
J'aime beaucoup ce langage ; j'ai trop rien pour comparer, mais le C me casse la tête par exemple, alors qu'avec Ada, j'écris comme je pense.
Marsh Posté le 04-11-2014 à 22:39:31
gilou a écrit : Il y a rien de risible la dedans, c'est le plus générique, car tu peux bosser avec des nombres de taille quelconque, plus grands que ton maxint, comme 111122223333444455556666777788889999. Et ça marche encore si c'est un nombre en hexadecimal. |
Voici un code Ada corepondant :
Code :
|
Edit : correction faite, ma réflexion à changé, ici il est indispensable de comparer avec 0.
Peut-être que dans le code précédent c'est pareil.
Marsh Posté le 04-11-2014 à 23:28:27
Moi je ferais ainsi en Perl:
Code :
|
A+,
Marsh Posté le 02-11-2014 à 12:46:36
un algo qui permet de lire un entier N strictement positif et qui vérifie si les chiffres de N forment une suite (progression) croissante, décroissante ou aucune des deux
Exemple:
Le nombre 5789 a des chiffres en progression croissante
Le nombre 744 a des chiffres en progression décroissante
Le nombre 187 a des chiffres qui ne forment pas une progression ni croissante ni décroissante.