30

Y a un problème de priorité là ? confus
(je comprends pas trop de quoi tu parles, certes ma fonction est très crade trilove mais je ne comprends pas cette critique précise...)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

31

Ben chais pas je trouve ça moche, stout hehe
avatar
I'm on a boat motherfucker, don't you ever forget

32

Ah c'est laid, certes
mais je ne vois pas le rapport avec les priorités hehe
Bon voici une seconde proposition (le cas des listes vides est chiant à gérer, c'est un peu du bidouillage là mais bon) :
class ['a] element_liste (valeur: 'a) = object method valeur = valeur val mutable suite = None method ajoute_apres (lasuite: 'a element_liste) = suite <- Some lasuite method suite = suite end
class ['a] liste_avec_fin = object val mutable liste = None val mutable fin = None
method ajoute_apres (valeur: 'a) = let elt = new element_liste valeur in (match fin with Some fin -> fin#ajoute_apres elt | None -> liste <- Some elt); fin <- Some elt
method ajoute_avant valeur = let elt = new element_liste valeur in (match liste with Some liste -> elt#ajoute_apres liste | None -> fin <- Some elt); liste <- Some elt
method tete = match liste with Some liste -> liste#valeur
method queue = match liste with Some liste -> {<fin = if liste#suite = None then None else fin; liste = liste#suite>}
method est_vide = liste = None
end

(ouais, flemme d'aller à la ligne et d'indenter toussa zzz)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

33

Bon je vais y réfléchir, mais c'est dur en connaissant que le camllight happy
avatar
I'm on a boat motherfucker, don't you ever forget

34

erf...
ben en camllight tu peux faire un truc avec des records comme j'ai montré avant a priori, mais par contre faudrait éviter le mélange mutable/fonctionnel que j'ai fait (ie faire des fonctions qui *soit* renvoient une valeur (autre que unit), *soit* modifient leur argument et éviter celles qui renvoient un résultat en bousillant leur argument par effet de bord trilove)
tu peux presque transformer mes objets en records en fait...
type 'a element_liste = {valeur: 'a; mutable suite: 'a element_liste option}
let elt_ajoute_apres elt suite = elt.suite <- Some suite
type 'a liste_avec_fin = {mutable liste: 'a element_liste option; mutable fin: 'a element_liste option}
let ajoute_apres liste valeur...
etc.
bonne nuit happy
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

35

Bon en fait *moi* j'ai la flemme d'aller à la ligne et d'indenter correctement mais après tout suffit de copier-coller dans machin.ml pis faire camlp4o pr_o.cmo -- machin.ml et voilà le travail :
class ['a] element_liste (valeur : 'a) =
  object
    method valeur = valeur
    val mutable suite = None
    method ajoute_apres (lasuite : 'a element_liste) = suite <- Some lasuite
    method suite = suite
  end
class ['a] liste_avec_fin =
  object
    val mutable liste = None
    val mutable fin = None
    method ajoute_apres (valeur : 'a) =
      let elt = new element_liste valeur in
      begin match fin with
        Some fin -> fin#ajoute_apres elt
      | None -> liste <- Some elt
      end;
      fin <- Some elt
    method ajoute_avant valeur =
      let elt = new element_liste valeur in
      begin match liste with
        Some liste -> elt#ajoute_apres liste
      | None -> fin <- Some elt
      end;
      liste <- Some elt
    method tete =
      match liste with
        Some liste -> liste#valeur
    method queue =
      match liste with
        Some liste ->
          {< fin = if liste#suite = None then None else fin;
             liste = liste#suite >}
    method est_vide = liste = None
  end 

ptêt que vous préférez cheeky
Edit : c'est incroyable comme du coup j'ai l'impression d'avoir écrit beaucoup plus de code triso
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

36

merci smile
avatar
I'm on a boat motherfucker, don't you ever forget

37

camlp4, l'ami des feignants love
Y a encore des effets pervers mais je crois qu'ils sont inévitables, faut juste y faire gaffe...
en fait si tu fais ça :
let machin = new liste_avec_fin;;
machin#ajoute_apres 5;;
machin#ajoute_apres 3;;
let queue = machin#queue;;
queue#ajoute_apres 15;;
tu obtiens :
# machin#queue#queue#tete;;
- : int = 15
# machin#queue#queue#est_vide;;
- : bool = false

en fait une façon de les gérer, ce serait de dire que la fin c'est obligatoirement ce qui est indiqué par le champ fin et qu'il n'est pas garanti que fin#suite = None, mais du coup la méthode queue que j'ai proposée est incorrecte, il faudrait gérer le cas :

method queue = if fin = liste then {<liste = None; fin = None >} else match liste with Some liste -> {<liste = liste#suite>}
bon du coup cette méthode se met à marcher même pour la liste vide, à toi de voir si c'est un problème (avant elle déclenchait un Match_failure, comme tete)
mais il me semble que ça devrait mieux marcher comme ça... je fais quelques essais
avec le même exemple :
# queue#queue#tete;;
- : int = 15
# machin#queue#queue#tete;;
Exception: Match_failure ("", 61, 6).
# machin#queue#tete;;
- : int = 3
# machin#queue#queue#est_vide;;
- : bool = true
C'est beaucoup plus cohérent smile
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

38

Oui enfin en fait y a toujours ce problème évidemment triso :
# machin#ajoute_apres 17;;
- : unit = ()
# queue#queue#tete;;
- : int = 17
y a pas trop de solution je crains :-\... faudrait tout cloner mais tu perds l'avantage du truc pour l'ajout en queue :-\
enfin bref tu peux sûrement faire une structure de données qui te sera utile, mais ça ne se comportera jamais vraiment comme les listes "normales"...
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

39

type 'a liste_lecture_seule = <tete : 'a; queue : 'a liste_lecture_seule; est_vide : bool>
et dans la classe liste_avec_fin :
method queue =
  let queue = if fin = liste then {<liste = None; fin = None>} else match liste with Some liste -> {<liste = liste#suite>} in
  (queue :> 'a liste_lecture_seule)

pourrait être une solution pour empêcher les incohérences...
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

40

En C, ça marche bien, et c'est facile à coder sad
avatar
I'm on a boat motherfucker, don't you ever forget

41

Euh, tu m'expliques comment en C tu n'as pas les problèmes que je cite ? confus
ça m'intéresse...
pis mon code marche sûrement bien et il était pas dur à trouver d'abord embarrassed
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

42

C'est un problème intrinsèque : si t'as des listes modifiables et que tu prends la queue d'une liste sans tout recopier, que tu modifies ladite queue et que tu veux encore te servir de la liste de départ, ça génère forcément des incohérences non ? ou alors c'est pas facile à coder... ou alors je vois pas comment on fait smile (et quel que soit le langage de programmation ^^)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

43

euh une liste je la représente par un triplet donnée, pointeur vers le prochain élément, booléen pour savoir si c'est la fin de la liste. Et la liste en O(1) par la queue, je la représente par un couple liste, pointeur vers le dernier élément de cette liste.
avatar
I'm on a boat motherfucker, don't you ever forget

44

Moumou :
euh une liste je la représente par un triplet donnée, pointeur vers le prochain élément, booléen pour savoir si c'est la fin de la liste. Et la liste en O(1) par la queue, je la représente par un couple liste, pointeur vers le dernier élément de cette liste.

Oki (c'est aussi ce que je fais, sauf que je vois pas trop l'intérêt du booléen il suffit de regarder si ton pointeur pointe vers quelque chose ou pas non ?), mais donc si tu prends la queue de la liste (ie la liste sans son premier élément), et que tu modifies cette queue de liste (en lui ajoutant un élément en queue), tu as donc modifié le pointeur vers la suite qui est associé au dernier élément de la liste n'est-ce pas ? donc en modifiant la queue tu as *aussi* modifié la liste initiale, et tu l'as rendue incohérente puisque le pointeur vers la fin est toujours le même mais l'élément final a un élément suivant !
C'est à cet inconvénient que j'essayais de pallier depuis 4 posts (au moins)... et c'est à cause de ça que je proposais que la fonction queue renvoie une liste en lecture seule (ainsi on ne peut pas rendre la structure incohérente), ça me paraît la solution la plus simple. Éventuellement on pourrait aussi faire une méthode decapite qui modifie la liste en lui enlevant la tête (ainsi on a la queue et elle est modifiable, la cohérence est alors assurée par le fait que l'ancienne liste n'est plus disponible...)
Bon évidemment si tu sais comment ça marche et que tu ne fais pas n'importe quoi, rien ne t'oblige à forcer la cohérence dans la structure elle-même, il suffit que tu en prennes soin dans l'utilisation que tu en fais (auquel cas le premier truc que j'avais proposé marche aussi...) mais bon c'est moins propre hehe
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

45

Ben euh quand j'ajoute un élément en queue, je fais deux trucs : je vais au dernier élément de la liste et je le modifie de façon à ce qu'il pointe vers le nouveau dernier élément, *et* je modifie le pointeur dans mon couple (liste, pointeur vers la fin). C'est cohérent ça nan ?

(le booléen c'était juste pour être sûr, mais si on peut effectivement pointer vers rien du tout, alors on fait ça smile (enfin en caml on peut, mais en C on pointe forcément vers un endroit dans la mémoire (qui donc lui aussi contient qqch qu'on peut assimiler à une adresse), nan ?))
avatar
I'm on a boat motherfucker, don't you ever forget

46

Oui c'est cohérent si tu n'utilises toujours qu'un seul couple (liste, pointeur vers la fin), mais en fait comme tu parlais de listes chaînées j'ai aussi fait les fonctions classiques tete qui renvoie la première valeur et queue qui renvoie la liste sans la première valeur, avec la même structure (liste, pointeur vers la fin). Cette dernière pose problème si tu veux à la fois que la queue en question soit modifiable et continuer par ailleurs à utiliser la liste initiale puisque tu as alors *deux* couples (liste, pointeur vers la fin) qui risquent de ne plus être en cohérence l'un avec l'autre. Mais si tu ne fais pas ça, alors il n'y a pas de problème ^^

Et normalement en C le pointeur NULL (adresse 0) ne peut jamais pointer vers quoi que ce soit de légal (il pointe effectivement à un endroit de la mémoire bien sûr, mais un endroit où tu n'as pas le droit d'accéder, donc il tient lieu de None en fait)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

47

Ben je parcours la liste, puis je lui ajoute un élément, puis je la reparcours, etc ...
(Recherche de nombres premiers cheeky)
avatar
I'm on a boat motherfucker, don't you ever forget

48

Ah ben si tu n'utilises qu'une seule liste et en en faisant qu'ajouter tu peux utiliser une structure plus légère (mais quel est l'intérêt d'ajouter en queue plutôt qu'en tête alors ?)
tu recherches les nombres premiers par le crible ?
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

49

Nop, par le test de diviseurs, mais en ne gardant que les nombres premiers. Et y a pas vraiment d'intérêt à ajouter en queue, en fait, viens-je de me rendre compte (enfin si, ça optimise un peu parce qu'on commence par les tests de divisibilité par les ptits diviseurs, mais si peu ...). J'ajoute rien en tête neutral
avatar
I'm on a boat motherfucker, don't you ever forget

50

Ah si en fait l'intérêt c'est de pouvoir s'arrêter quand on dépasse racine(n) et donc pas parcourir toute la liste. Donc ça optimise quand même smile
avatar
I'm on a boat motherfucker, don't you ever forget

51

ça ?
type 'a liste_mutable = {tete : 'a ; mutable queue : 'a liste_mutable option}
type 'a liste_avec_fin = {debut : 'a liste_mutable; mutable fin : 'a liste_mutable}
let ajoute_en_queue a l = let nouveau = {tete = a; queue = None} in l.fin.queue <- Some nouveau; l.fin <- nouveau
let rec est_non_premier n racinen listepremiers = if listepremiers.tete > racinen then false else (n mod listepremiers.tete = 0 || match listepremiers.queue with None -> false | Some suite -> est_non_premier n racinen suite)
let rec premier_suivant n listepremiers = if est_non_premier n (int_of_float(sqrt(float_of_int n))) listepremiers then premier_suivant (n+1) listepremiers else n
let ajoute_premier_suivant listepremiers_avecfin = ajoute_en_queue (premier_suivant (listepremiers_avecfin.fin.tete + 1) listepremiers_avecfin.debut) listepremiers_avecfin
let rec list_of_liste_mutable liste_mutable = liste_mutable.tete :: match liste_mutable.queue with None -> [] | Some l -> list_of_liste_mutable l
let premierspremiers n = let listepremiers_avecfin = let listepremiers = {tete = 2; queue = None} in {debut = listepremiers; fin = listepremiers}
in for i = 1 to n - 1 do ajoute_premier_suivant listepremiers_avecfin done; list_of_liste_mutable listepremiers_avecfin.debut
bon je vais le camlp4 - iser love
type 'a liste_mutable = { tete : 'a; mutable queue : 'a liste_mutable option }
type 'a liste_avec_fin =
  { debut : 'a liste_mutable; mutable fin : 'a liste_mutable }
let ajoute_en_queue a l =
  let nouveau = {tete = a; queue = None} in
  l.fin.queue <- Some nouveau; l.fin <- nouveau
let rec est_non_premier n racinen listepremiers =
  if listepremiers.tete > racinen then false
  else
    n mod listepremiers.tete = 0 ||
    (match listepremiers.queue with
       None -> false
     | Some suite -> est_non_premier n racinen suite)
let rec premier_suivant n listepremiers =
  if est_non_premier n (int_of_float (sqrt (float_of_int n))) listepremiers
  then
    premier_suivant (n + 1) listepremiers
  else n
let ajoute_premier_suivant listepremiers_avecfin =
  ajoute_en_queue
    (premier_suivant (listepremiers_avecfin.fin.tete + 1)
       listepremiers_avecfin.debut)
    listepremiers_avecfin
let rec list_of_liste_mutable liste_mutable =
  liste_mutable.tete ::
    (match liste_mutable.queue with
       None -> []
     | Some l -> list_of_liste_mutable l)
let premierspremiers n =
  let listepremiers_avecfin =
    let listepremiers = {tete = 2; queue = None} in
    {debut = listepremiers; fin = listepremiers}
  in
  for i = 1 to n - 1 do ajoute_premier_suivant listepremiers_avecfin done;
  list_of_liste_mutable listepremiers_avecfin.debut
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

52

ça a l'air de marcher
# premierspremiers 100;;
- : int list =
[2; 3; 5; 7; 11; 13; 17; 19; 23; 29; 31; 37; 41; 43; 47; 53; 59; 61; 67; 71;
73; 79; 83; 89; 97; 101; 103; 107; 109; 113; 127; 131; 137; 139; 149; 151;
157; 163; 167; 173; 179; 181; 191; 193; 197; 199; 211; 223; 227; 229; 233;
239; 241; 251; 257; 263; 269; 271; 277; 281; 283; 293; 307; 311; 313; 317;
331; 337; 347; 349; 353; 359; 367; 373; 379; 383; 389; 397; 401; 409; 419;
421; 431; 433; 439; 443; 449; 457; 461; 463; 467; 479; 487; 491; 499; 503;
509; 521; 523; 541]
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

53

mais euh je voulais le faire moi même, je voulais juste le typage moua ^^
avatar
I'm on a boat motherfucker, don't you ever forget

54

ben :
type 'a liste_mutable = {tete : 'a ; mutable queue : 'a liste_mutable option}
type 'a liste_avec_fin = {debut : 'a liste_mutable; mutable fin : 'a liste_mutable}
et tu lis pas la suite cheeky
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

55

avatar
I'm on a boat motherfucker, don't you ever forget

56

Edit : chais pas pourquoi j'ai dit ça
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

57

chuis content, j'ai fait un programme de fractales en caml (en tp, jcrois être le seul à avoir fini et pis j'ai eu le temps de rajouter le zoom et tt ça)
je commence à programmer naturellement avec les bases de ocaml, faut que je me mette aux trucs un peu plus complexes (objets,...) now

(* fractal.ml *)

type complex = {re : float ; im : float} ;;

let zero_c = {re = 0.0 ; im = 0.0} ;;

let add_c c1 c2 = {re = c1.re +. c2.re ;
im = c1.im +. c2.im}
;;

let mult_c c1 c2 = {re = c1.re *. c2.re -. c1.im *. c2.im ;
im = c1.re *. c2.im +. c2.re *. c1.im}
;;

let norm_c c = sqrt (c.re*.c.re +. c.im*.c.im) ;;

let largeur = 400 and hauteur = 400
and icon_size=50
and xmin = ref 0.0
and xmax = ref 1.0
and ymin = ref 0.0
and ymax = ref 0.1
;;

let pas_x () = (!xmax -. !xmin) /. float_of_int (largeur - 1) ;;

let pas_y () = (!ymax -. !ymin) /. float_of_int (hauteur - 1) ;;

let c_de_p l h =
{re = !xmin +. float_of_int (l) *. pas_x () ;
im = !ymin +. float_of_int (h) *. pas_y ()}
;;

let julia p z c n =
let rec julia_internal p z c k =
if norm_c (p z) > norm_c c +. 1. then k
else
if k = n then n
else julia_internal p (p z) c (k + 1)
in
julia_internal p z c 0
;;

let couleur x y norme =
let julia_i = julia (function x -> add_c (mult_c x x) norme) (c_de_p x y) norme 255 in
Graphics.rgb ((julia_i*64) mod 256) ((julia_i*16) mod 256) julia_i;;

let fract const reset =
if reset then
begin
xmin := 0. -. (norm_c const) -. 1.;
xmax := (norm_c const) +. 1.;
ymin := 0. -. (norm_c const) -. 1.;
ymax := (norm_c const) +. 1.;
end;
for x = 0 to largeur - 1 do
if x < largeur then
begin
Graphics.set_color Graphics.red;
Graphics.moveto (x+1) 0;
Graphics.lineto (x+1) (hauteur-1);
end;
for y = 0 to hauteur - 1 do
Graphics.set_color ((couleur x y const));
Graphics.plot x y;
done
done
;;

let draw_icon i =
begin
for x = 0 to icon_size - 2 do
for y = 1 to icon_size - 1 do
Graphics.set_color ((Graphics.point_color (x*largeur/icon_size) (y*hauteur/icon_size)));
Graphics.plot ((x+i*icon_size) mod largeur) (y+hauteur);
done
done;
Graphics.set_color Graphics.red;
Graphics.moveto 0 hauteur;
Graphics.lineto (largeur-1) hauteur;
Graphics.moveto ((i+1)*icon_size-1) (hauteur-1);
Graphics.lineto ((i+1)*icon_size-1) (hauteur+icon_size-1);
end
;;


Graphics.open_graph (" "^(string_of_int largeur)^"x"^(string_of_int (hauteur+icon_size)));

type rect = {p1:bool;p2:bool;x1:float;x2:float;y1:float;y2:float}
let rect_sort r =
if r.x1<r.x2 then
if r.y1<r.y2 then
r
else
{p1=r.p1;p2=r.p2;x1=r.x1;x2=r.x2;y1=r.y2;y2=r.y1}
else
if r.y1<r.y2 then
{p1=r.p1;p2=r.p2;x1=r.x2;x2=r.x1;y1=r.y2;y2=r.y1}
else
{p1=r.p1;p2=r.p2;x1=r.x2;x2=r.x1;y1=r.y2;y2=r.y1}

let r = ref {p1=false;p2=false;x1=0.0;x2=0.0;y1=0.0;y2=0.0};;
type window = {wx1:float;wx2:float;wy1:float;wy2:float}
let icon_ind = ref 1;;
let save_win = Array.create (largeur/icon_size) {wx1=0.0;wx2=0.0;wy1=0.0;wy2=0.0};;

let cplex={re=0.3;im=0.5};;

let main()=
try
begin
fract cplex true;
draw_icon 0;
Array.set save_win 0 {wx1=(!xmin);wx2=(!xmax);wy1=(!ymin);wy2=(!ymax)};
while not (Graphics.key_pressed()) do
let s = Graphics.wait_next_event [Graphics.Button_down] in
begin
if (snd (Graphics.mouse_pos()))>hauteur then
let num = (fst(Graphics.mouse_pos()))/icon_size in
begin
if num<(!icon_ind) then
begin
r:={p1=false;p2=false;x1=0.0;x2=0.0;y1=0.0;y2=0.0};
xmin:=(Array.get save_win num).wx1;
ymin:=(Array.get save_win num).wy1;
xmax:=(Array.get save_win num).wx2;
ymax:=(Array.get save_win num).wy2;
print_string "state restored.\n";
print_string (" zooming in ("
^(string_of_float !xmin)^","
^(string_of_float !xmax)^") to ("
^(string_of_float !ymin)^","
^(string_of_float !ymax)^")\n");
flush stdout;

fract cplex false;
end;
end;
else
if (((!r).p1)) then
let p = (c_de_p (fst (Graphics.mouse_pos())) (snd (Graphics.mouse_pos()))) in
begin
print_string "second point set.\n";
print_string (" zooming in ("
^(string_of_float !xmin)^","
^(string_of_float !xmax)^") to ("
^(string_of_float !ymin)^","
^(string_of_float !ymax)^")\n");
flush stdout;
Graphics.set_color Graphics.red;
Graphics.moveto 0 (snd (Graphics.mouse_pos()));
Graphics.lineto largeur (snd (Graphics.mouse_pos()));
Graphics.moveto (fst (Graphics.mouse_pos())) 0;
Graphics.lineto (fst (Graphics.mouse_pos())) hauteur;
let px,py = (!r).x1,(!r).y1 in
r:=rect_sort {p1=false;p2=false;x1=px;y1=py;x2=p.re;y2=p.im};
xmin:=(!r).x1;
xmax:=(!r).x2;
ymin:=(!r).y1;
ymax:=(!r).y2;
fract cplex false;
draw_icon !icon_ind;
icon_ind:=!icon_ind+1;
Array.set save_win (((!icon_ind) -1) mod (largeur/icon_size)) {wx1=(!xmin);wx2=(!xmax);wy1=(!ymin);wy2=(!ymax)};
end;
else
let p = (c_de_p (fst (Graphics.mouse_pos())) (snd (Graphics.mouse_pos()))) in
begin
r:={p1=true;p2=false;x1=p.re;y1=p.im;x2=0.0;y2=0.0};
print_string "first point set.\n";
Graphics.set_color Graphics.red;
Graphics.moveto 0 (snd (Graphics.mouse_pos()));
Graphics.lineto largeur (snd (Graphics.mouse_pos()));
Graphics.moveto (fst (Graphics.mouse_pos())) 0;
Graphics.lineto (fst (Graphics.mouse_pos())) hauteur;
flush stdout;
end;
end;
done;
end
with
Graphics.Graphic_failure _ -> print_string "exception attrapée, ça suce\n"
;;

main();;
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

58

180px-Julia.PNG
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

59

Sally :
type 'a liste_mutable = { tete : 'a; mutable queue : 'a liste_mutable option }
type 'a liste_avec_fin =
  { debut : 'a liste_mutable; mutable fin : 'a liste_mutable }
let ajoute_en_queue a l =
  let nouveau = {tete = a; queue = None} in
  l.fin.queue <- Some nouveau; l.fin <- nouveau
let rec est_non_premier n racinen listepremiers =
  if listepremiers.tete > racinen then false
  else
    n mod listepremiers.tete = 0 ||
    (match listepremiers.queue with
       None -> false
     | Some suite -> est_non_premier n racinen suite)
let rec premier_suivant n listepremiers =
  if est_non_premier n (int_of_float (sqrt (float_of_int n))) listepremiers
  then
    premier_suivant (n + 1) listepremiers
  else n
let ajoute_premier_suivant listepremiers_avecfin =
  ajoute_en_queue
    (premier_suivant (listepremiers_avecfin.fin.tete + 1)
       listepremiers_avecfin.debut)
    listepremiers_avecfin
let rec list_of_liste_mutable liste_mutable =
  liste_mutable.tete ::
    (match liste_mutable.queue with
       None -> []
     | Some l -> list_of_liste_mutable l)
let premierspremiers n =
  let listepremiers_avecfin =
    let listepremiers = {tete = 2; queue = None} in
    {debut = listepremiers; fin = listepremiers}
  in
  for i = 1 to n - 1 do ajoute_premier_suivant listepremiers_avecfin done;
  list_of_liste_mutable listepremiers_avecfin.debut


Caml suuuuuuuuuuuuuuuuuuuxxxxxxxxxxx ! sick

En Ruby, avec le parsing de la ligne de commande, l'affichage et tout et tout :
class InfiniteRange
    include Enumerable
    def initialize(n)
        @n=n
    end
    def each(&block)
        i=@n
        while true
            yield i+=1
        end
    end
end

primes=[2]
(ARGV.shift.to_i-1).times {
    primes << InfiniteRange.new(primes[-1]).find{|n|
        !primes.find{|p| n%p==0 } && n
    }
}
p primes

lovelovelove

OO pawa love


EDIT : et on n'a même pas besoin de InfiniteRange, en fait :
infinity=1.0/0
primes=[2]
n=ARGV.shift.to_i
(n-1).times {
    primes << (primes[-1]+1..infinity).find{|n|
        !primes.find{|p| n%p==0 } && n
    }
}
p primes

tongue

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

60

euh à part que je comprends rien (<< je suppose que c'est pas un shift logique ? cheeky), je te rappelle juste que si on a fait tout ce bidouillage c'est dans l'unique but d'optimiser en s'arrêtant à racine(n), ce que tu n'as pas l'air de faire. Bon peut-être que ça ne compliquerait pas beaucoup ton code de le faire j'en sais rien mais voilà quoi ^^
parce que sinon moi je peux faire ça aussi :
let rec est_non_premier n = function [] -> false | p :: suite -> n mod p = 0 || est_non_premier n suite
let ajoute_prochain_premier = function [] -> [2]
  | p::suite as liste -> let rec aux n liste = if est_non_premier n liste then aux (n + 1) liste else n in aux (p + 1) liste :: liste
let premiers_premiers n = let liste = ref [] in for i = 1 to n do liste := ajoute_prochain_premier !liste done; !liste

ce qui est déjà plus compréhensible que ton charabia cheeky
et on peut peut-être faire plus court avec des fonctions de la lib standard, je vais regarder ça tiens
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#