aide urgent

aide urgent - Algo - Programmation

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.

Reply

Marsh Posté le 02-11-2014 à 12:46:36   

Reply

Marsh Posté le 02-11-2014 à 13:24:37    

Je te donne un indice: utiliser la différence entre deux chiffres successifs.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Marsh Posté le 03-11-2014 à 10:48:58    

par l'anneau de l'ia a écrit :

Bonjour,
 
Je ferais plutôt une comparaison de grandeur avec > et < tant que les chiffre sont < ou > c'est décroissant ou croissant.


Ca revient globalement au même de faire la différence et de regarder le signe du résultat ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

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+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-11-2014 à 15:58:40    

rufo a écrit :


Ca revient globalement au même de faire la différence et de regarder le signe du résultat ;)


 

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.
A+,


 
Peut-être mais ça demande probablement d'avantage d'instructions.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

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.

Reply

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 :D
 
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? :o

Reply

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 :D

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+,
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-11-2014 à 11:53:45    

Convertir en char*, c'est pas non plus le plus efficace du monde pour faire autre chose que de la comparaison avec après.
 
Si vraiment tu veux des gros nombres, y'a GMP

Reply

Marsh Posté le 04-11-2014 à 11:53:45   

Reply

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


 
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.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Marsh Posté le 04-11-2014 à 13:16:41    

Code :
  1. -- Logical_Number --
  2. with Text_Io;
  3. with Ada.Characters.Handling;
  4. use Ada.Characters.Handling;
  5. procedure Logical_Number is
  6.  
  7.   -- Return the string value of any positive.
  8.   function Image_Number (Number : in Positive) return String is
  9.      
  10.      Img : String := Positive'Image(Number);
  11.   begin
  12.  
  13.      return Img;
  14.   end Image_Number;          
  15.  
  16.   -- Return positive value of decimal digit value.
  17.   function Value_Char (Char : in Character) return Positive is
  18.      
  19.   begin
  20.      
  21.      if not Is_Decimal_Digit(Char) then
  22.      raise Constraint_Error;
  23.      end if;
  24.      return Positive'Value(Char & "" );
  25.   end Value_Char;
  26.  
  27.   -- Return True if the number is progressive.
  28.   function Is_Progressive (Number : in Positive) return Boolean is
  29.  
  30.      Char_Index : Positive := 2;
  31.   begin    
  32.      
  33.      for Char_Pos in 3..Image_Number(Number)'Last loop
  34.      if not (((Value_Char(Image_Number(Number)(Char_Pos)) - Value_Char(Image_Number(Number)(Char_Index)))) >= 0)  then
  35.         return False;
  36.      end if;
  37.      Char_Index := Char_Pos;
  38.      end loop;
  39.      return True;
  40.   end Is_Progressive;
  41.  
  42.   -- Return true if the number is depressive.
  43.   function Is_Depressive (Number : in Positive) return Boolean is
  44.  
  45.      Char_Index : Positive := 2;
  46.   begin    
  47.      
  48.      for Char_Pos in 3..Image_Number(Number)'Last loop
  49.      if not (((Value_Char(Image_Number(Number)(Char_Pos)) - Value_Char(Image_Number(Number)(Char_Index)))) <= 0) then
  50.         return False;
  51.      end if;
  52.      Char_Index := Char_Pos;
  53.      end loop;
  54.      return True;
  55.   end Is_Depressive;
  56.  
  57.  
  58.  
  59.   -- Testing values.
  60.   Progressive_Number : Positive := 123456789;
  61.   Depressive_Number  : Positive := 987654321;
  62.   Other_Number      : Positive := 573194628;          
  63. begin
  64.   if Is_Progressive(Progressive_Number) then
  65.      Text_Io.Put_Line("Progressive_Number is progressive number." );
  66.   end if;
  67.  
  68.   if Is_Depressive(Depressive_Number) then
  69.      Text_Io.Put_Line("Depressive_Number is depressive number." );
  70.   end if;
  71.      
  72.   if Is_Progressive(Other_Number) then
  73.      Text_Io.Put_Line("Other_Number is progressive number." );
  74.   elsif Is_Depressive(Other_Number) then
  75.      Text_Io.Put_Line("Other_Number is depressive number." );
  76.   else
  77.      Text_Io.Put_Line("Other_Number is not logical number." );
  78.   end if;
  79. end Logical_Number;


 
Résultat :
 


Progressive_Number is progressive number.
Depressive_Number is depressive number.
Other_Number is not logical number.


 
Non, je ne compterai pas les instructions.
 
 
Edit : je corrige mon code, enfin, ce que je sais faire.

Message cité 2 fois
Message édité par par l'anneau de l'ia le 04-11-2014 à 23:06:35

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Marsh Posté le 04-11-2014 à 14:30:49    

par l'anneau de l'ia a écrit :


 
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.


 
Mouais, dans ce cas on compare if(machin - truc < 0) par rapport a if(machin<truc)
 
La différence est pas énorme...

Reply

Marsh Posté le 04-11-2014 à 14:37:00    

khoyo a écrit :


 
Mouais, dans ce cas on compare if(machin - truc < 0) par rapport a if(machin<truc)
 
La différence est pas énorme...


 
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.

Message cité 1 fois
Message édité par par l'anneau de l'ia le 04-11-2014 à 14:38:25

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

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.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

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 :
  1. let a1 = [1;2;2;3;4;5;6;6;7;8;9];;
  2. let a2 = [9;5;2;2;];;
  3. let a3 = [1;4;9;3;7;3;2];;
  4.  
  5. let rec is_progressive l = match l with
  6.           | [] -> true
  7.           | [x]-> true
  8.           | [x;y]-> x<=y
  9.           | (h1::h2::t) -> (h1<=h2) && is_progressive (h2::t);;
  10.          
  11.  
  12. let rec is_degressive l = match l with
  13.           | [] -> true
  14.           | [x]-> true
  15.           | [x;y]-> x>=y
  16.           | (h1::h2::t) -> (h1>=h2) && is_degressive (h2::t);;
  17.  
  18. is_progressive a1;;
  19. is_progressive a2;;
  20. is_progressive a3;;
  21.  
  22. is_degressive a1;;
  23. is_degressive a2;;
  24. is_degressive a3;;
  25.  
  26.  
  27. type progressivity = Progressive|Degressive|Both|None;;
  28.  
  29. let return_progressivity n =
  30.   let prog = is_progressive n and degr = is_degressive n in
  31.     if (prog && degr) then Both else
  32.     if prog then Progressive else
  33.     if degr then Degressive else
  34.     None;;
  35.  
  36. return_progressivity a1;;
  37. return_progressivity a2;;
  38. return_progressivity a3;;
  39. return_progressivity [0;0;0;0;0;0;0;0];;
  40.  
  41. return_progressivity ['a';'c';'f';'f';'g';'h'];;
  42.  
  43. return_progressivity [true;true;false;false];;
  44. return_progressivity [true;false;true];;
  45. return_progressivity [false;true];;
 


Bonus : même mon type "progressivity" accepte de se faire mouliner par les fonctions :lol:, 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 :
  1. let explode s =
  2.  let rec exp i l =
  3.    if i < 0 then l else exp (i - 1) (s.[i] :: l) in
  4.  exp (String.length s - 1) [];;
 

ensuite

Code :
  1. let number_progressivity n = return_progressivity(explode(string_of_int n));;
  2.  
  3. number_progressivity 13423423;;
  4. number_progressivity 87774;;


Message édité par blazkowicz le 04-11-2014 à 15:29:17
Reply

Marsh Posté le 04-11-2014 à 15:46:25    

par l'anneau de l'ia 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.


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

Reply

Marsh Posté le 04-11-2014 à 15:53:52    

khoyo a écrit :


 
Justement non, puisque un bon compilateur optimise ça et produit probablement un binaire identique.


 
 
T'as pas comme une incohérence dans tes propos ?


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

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"

Reply

Marsh Posté le 04-11-2014 à 16:06:45    

par l'anneau de l'ia a écrit :


Non, je ne compterai pas les instructions.

 

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.

Message cité 1 fois
Message édité par blazkowicz le 04-11-2014 à 16:14:20
Reply

Marsh Posté le 04-11-2014 à 16:24:32    

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


 
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.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

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.  
A+,
 
 


 
 
Voici un code Ada corepondant :
 

Code :
  1. -- Logical String --
  2. -- Entrez un entier et appuyez sur Entree.
  3. with Text_Io;
  4. procedure Logical_String is
  5.   Number : String := Text_Io.Get_Line;
  6.   Pro : Boolean := false;
  7.   Dep : Boolean := False;
  8. begin
  9.   for I in 1..Number'Last-1 loop
  10.      if (Character'Pos(Number(I)) - Character'Pos(Number(I+1))) < 0 then         
  11.      if Dep then
  12.         Text_Io.Put_Line("le nombre " & Number & "est incertain." );        
  13.         return;
  14.      else
  15.         Pro := True;
  16.      end if;
  17.      elsif (Character'Pos(Number(I)) - Character'Pos(Number(I+1))) > 0 then    
  18.      if Pro then                    
  19.         Text_Io.Put_Line("le nombre " & Number & "est incertain." );        
  20.         return;
  21.      else
  22.         Dep := True;
  23.      end if;
  24.      end if;      
  25.   end loop;  
  26.   if Pro then
  27.      Text_Io.Put_Line("le nombre " & Number & " est croissant." );
  28.   elsif Dep then
  29.      Text_Io.Put_Line("le nombre " & Number & " est decroissant." );
  30.   end if;
  31.   Text_Io.Put("Appuyez sur Entree" );
  32.   Text_Io.Skip_Line;      
  33. end Logical_String;


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


Message édité par par l'anneau de l'ia le 04-11-2014 à 23:00:39

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Marsh Posté le 04-11-2014 à 23:28:27    

Moi je ferais ainsi en Perl:
 

Code :
  1. use v5.14;
  2. use bigint;
  3. use List::Util qw(reduce);
  4.  
  5. sub checknum {
  6.  $_ = shift;
  7.  if (/^\d*$/) {
  8.    no bigint;
  9.    my @v = (0, 0, 0);
  10.    reduce { $v[($a<=>$b)+1] = 1; $b } (/\d/g);  # l'essentiel du travail est condensé en cette ligne
  11.    given (4*$v[0]+2*$v[2]+$v[1]) {
  12.      when(0) {print "Entree vide\n";}
  13.      when(1) {print "Suite de chiffres constante\n";}
  14.      when(2) {print "Suite de chiffres strictement decroissante\n";}
  15.      when(3) {print "Suite de chiffres decroissante\n";}
  16.      when(4) {print "Suite de chiffres strictement croissante\n";}
  17.      when(5) {print "Suite de chiffres croissante\n";}
  18.      default {print "Suite de chiffres ni croissante ni decroissante\n";}
  19.    }
  20.  }
  21.  else {
  22.    print "Entree invalide\n";
  23.  }
  24. }
  25.  
  26. # Test avec un grand nombre et un grand nombre en texte
  27. checknum(333444444444444444455556666777788899);
  28. print "\n";
  29. checknum("998887777666655554444444444444444333" );


 
A+,


Message édité par gilou le 04-11-2014 à 23:34:37

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed