begin process at 2012 02 11 15:01:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > SUITE DE CONWAY (LOOK AND SAY SEQUENCE) - GENERATEUR

SUITE DE CONWAY (LOOK AND SAY SEQUENCE) - GENERATEUR


 Information sur la source

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths Classé sous :conway, suite, sequence, lookandsay, générateur Niveau :Débutant Date de création :12/08/2006 Date de mise à jour :17/08/2006 17:22:08 Vu / téléchargé :8 466 / 232

Auteur : japee

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (46)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Dans la rubrique on se détend, c'est l'été...
Ce code n'a qu'une prétention, c'est de vous divertir.
Il me semble que cette énigme est proposée par Bernard Werber dans son livre "Les fourmis", mais je n'arrive pas à la retrouver...

Bon.
Ceux qui connaissent déjà ne soufflent pas !
L'énigme se présente sous cette forme :

1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211
11131221133112 132113212221
3113112221232112111312211312113211
13 21132132111213122112311311222113111221131221

Il faut trouver la logique de cette succession de chiffres.

Il paraît qu'un enfant résoudra ce problème plus facilement qu'un adulte, surtout si cet adulte est trop calé en maths...
Bref, il faut essayer de renouer avec une certaine fraicheur de regard qui n'appartiennent qu'à l'enfance.
Mais quand on programme pour le plaisir, on est resté un enfant quelque part, non ?

Le code que je joins génère cette suite de chiffres. Il fournit donc forcément la clé de l'énigme... à regarder après avoir résolu le problème, donc.
Et ne trichez pas !

Zip joint pour mise en oeuvre facile.

Mise à jour du 17/08/06 :

Il s'agit en fait de la suite de Conway, Look and Say sequence en anglais, mais ça n'est plus une énigme dans ces conditions. Merci à CptPingu pour cette information.
J'ai revu le code afin qu'il soit un peu moins lent, mais il n'a pas la prétention de rivaliser avec ceux qui suivent sur cette page !
J'ai rajouté la possibilité de choisir le chiffre initial comme me le suggère Florenth.
Le nombre de lignes : c'est le nombre de lignes rajoutées à la ligne initiale, que ça soit clair.
Bonne continuation ;-)

Source

  • procedure GenerateConwaySequence(const TS: TStrings; const n: Word = 12;
  • const Init: Byte = 1);
  • var
  • i, j: Integer;
  • Line, Reading, Tmp: string;
  • begin
  • with TS do
  • begin
  • Clear;
  • BeginUpdate;
  • Add(IntToStr(Init));
  • for i := 0 to n -1 do
  • begin
  • Line := TS[i];
  • Reading := '';
  • Tmp := '';
  • for j := 1 to Length(Line) do
  • begin
  • Tmp := Format('%s%s', [Tmp, Line[j]]);
  • if (j = Length(Line)) or (Line[j + 1] <> Tmp[Length(Tmp)]) then
  • begin
  • Reading := Format('%s%d%s', [Reading, Length(Tmp), Tmp[1]]);
  • Tmp := '';
  • end;
  • end;
  • Add(Reading);
  • end;
  • EndUpdate;
  • end;
  • end;
procedure GenerateConwaySequence(const TS: TStrings; const n: Word = 12;
  const Init: Byte = 1);
var
  i, j: Integer;
  Line, Reading, Tmp: string;
begin
  with TS do
  begin
    Clear;
    BeginUpdate;
    Add(IntToStr(Init));
    for i := 0 to n -1 do
    begin
      Line := TS[i];
      Reading := '';
      Tmp := '';
      for j := 1 to Length(Line) do
      begin
        Tmp := Format('%s%s', [Tmp, Line[j]]);
        if (j = Length(Line)) or (Line[j + 1] <> Tmp[Length(Tmp)]) then
        begin
          Reading := Format('%s%d%s', [Reading, Length(Tmp), Tmp[1]]);
          Tmp := '';
        end;
      end;
      Add(Reading);
    end;
    EndUpdate;
  end;
end;

 Conclusion

A priori pas de bug, j'ai vaporisé au Raid action longue durée...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

17 août 2006 17:22:09 :
Optimisation du code. Interface plus conviviale ? Merci à CptPingu pour avoir rendu à Conway de qui lui appartenait. Merci à Florent pour ses suggestions (chiffre initial variable et RichEdit).

 Sources du même auteur

Source avec Zip Source avec une capture DEPLACER LES ITEMS D'UNE LISTBOX VERS UNE AUTRE PAR DRAG AND...
Source avec Zip Source avec une capture DÉMINEUR UTILISANT UNE TDRAWGRID ET AVEC LEQUEL ON PEUT TRIC...
Source avec Zip Source avec une capture SIGNIFICATION DES CODES D'ERREUR DE L'API WIN32 - UTILISATIO...
Source avec Zip Source avec une capture CONVERSION LITTÉRALE D'UN NOMBRE ENTIER OU FLOTTANT
Source avec Zip Source avec une capture TPULSEBUTTON - RÉPÉTITION PROGRESSIVE D'UN EVENT PENDANT ONK...

 Sources de la même categorie

Source avec Zip Source avec une capture RESOLUTION EQUATIONS DEGRE "N" + CALCULETTE SCIENTIFIQUE par pseudo3
Source avec Zip DEUX BIBLIOTHÈQUES POUR CALCULER AVEC DES ENTIERS TRÈS GRAND... par Rekin85
Source avec Zip Source avec une capture MOTEUR PHYSIQUE 2D CHIPMUNK.. EN DELPHI! par Bacterius
Source avec Zip Source avec une capture TABLEAU DE KARNAUGH par ADMR
Source avec Zip Source avec une capture FILTRAGE NUMÉRIQUE IIR par Pouillerot

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GÉNÉRATEUR DE NOMBRES PSEUDO-ALÉATOIRES par Bacterius
Source avec Zip GÉNÉRATEUR DE MOT DE PASSE par oliverdev
Source avec Zip GENERATEUR DE TEXTURE par aymenk
Source avec Zip Source avec une capture GÉNÉRATEUR DE FICHES HTML par MIchelProg
Source avec Zip Source avec une capture GÉNÉRATEUR DE CADAVRES EXQUIS par Matt 261

Commentaires et avis

Commentaire de cirec le 12/08/2006 16:34:51 administrateur CS

Ben ouais c'est d'une logique ...

Bon on me l'avais déjà fait :-)
mais c'est d'un "con"
si je ne suis pas trompé ce devrait être la ligne suivante :
11131221131211131231121113112221121321132132211331222113112211

bien :-)
@+

Commentaire de japee le 12/08/2006 17:02:23 administrateur CS

Tu ne t'es pas trompé, Cirec ;-) chut... laissons chercher les autres.
Florenth, bravo, mais c'est vrai que tu es un des plus jeunes d'entre nous (hormis moi, bien sûr, lol). J'ai lu ton MP, je vais étudier la question.

Commentaire de Forman le 12/08/2006 20:27:41

Je la connaissais aussi déjà celle là      ;)
Mais étudier la suite ainsi définie est un vrai casse-tête:
je m'étais posé des questions dessus il y a quelques années: peut-on exprimer la longueur du n-ième terme de la suite en fonction de n? Ou au moins trouver un équivalent vers l'infini?

La conclusion est: je ne sais ni démontrer que la suite est de longueur croissante (en effet, sans rien dévoiler, on peut imaginer des termes tels qu'en calculant le terme suivant la longueur obtenue est strictement inférieure, par exemple 111333) ni même qu'elle n'est pas périodique (il existe en effet par exemple un mot de 2 caractères tel que le mot suivant est le même: 22). Et pourtant, j'y ai passé du temps, mdr...

Les seules choses que je sais démontrer sur cette suite (et c'est très facile à faire, ce sont des propriétés immédiates) c'est:
-elle ne contient que les 3 chiffres 1,2 et 3
-la longueur du n-ième terme est plus petite que (ou égale à) 2^n

J'ai réécrit l'algorithme pour calculer un des termes à partir du précédant, de façon à ce qu'il aille plus vite (moins de réallocation de mémoire):

function f(s:string):string;
var
  p,q:PChar;
  c,d,e:Char;
begin
  SetLength(Result,2*Length(s));
  p:=PChar(s);
  q:=PChar(Result);
  c:=p^;
  repeat
    e:='0';
    repeat
      Inc(p);
      d:=p^;
      Inc(e);
    until d<>c;
    q^:=e;
    PChar(q+1)^:=c;
    q:=q+2;
    c:=d;
  until c=#0;
  SetLength(Result,Integer(q)-Integer(PChar(Result)));
end;

procedure FastGenereEnigme(const TS:TStrings;const n:Word=12);
var
  a:Integer;
begin
  TS.Clear;
  TS.Add('1');
  for a:=0 to n-1 do
    TS.Add(f(TS[a]));
end;

Ca fonctionne si on considère que calculer le terme suivant de la suite va au plus doubler la longueur (d'où l'explication du SetLength(Result,2*Length(s))). Pour calculer le 50ième terme, GenerateEnigme met 25 secondes alors que FastGenereEnigme met 32 millisecondes... Ca démontre encore, s'il en était besoin, que les allocations de mémoire cachées rallentissent énormément le code: lorsqu'on écrit a+b (où a et b sont des chaînes de caractères) il y a une réallocation de mémoire pour stocker le résultat de la concaténation.

L'algorithme à optimiser est un bon exemple: je propose le challenge de celui qui donnera un algorithme (pour la fonction f) calculant le plus vite possible le 71ième terme de la suite (à partir du 72ème, le terme devient trop grand et provoque une exception EOutOfMemory chez moi). Record à battre: 7062 millisecondes pour calculer le 71ième terme de la suite. Bien sûr, pour que ça compte, il faut que les 2 algo soient lancés sur la même machine!

A vos claviers       ;-)

Commentaire de japee le 12/08/2006 21:06:43 administrateur CS

Visiblement, Forman, tu es le gars qui aime aller au fond des choses.
J'avais pas réfléchi à toutes les implications mathématiques, toutes ces interrogations (et les angoisses) que ça soulève. Wouah...
Je trouve que ton code est plus beau que le mien (bouh).
Merci d'avoir amené un peu de grain à moudre à notre réflexion à partir de cette simple petite énigme.
Alors, quelqu'un relève le défi ?
(moi, j'ai comme un gros coup de fatigue, lol)

Commentaire de Forman le 12/08/2006 22:14:02

> Visiblement, Forman, tu es le gars qui aime aller au fond des choses.
Lol, ça doit être une déformation professionnelle, à force de faire des maths...

Commentaire de Delphiprog le 12/08/2006 23:03:48 administrateur CS

Mouais, ça va être très dur.
Décidément, il est trop fort ce Forman.
Mais il y a encore au moins une possibilité pour améliorer et faire mieux que 7062 millisecondes.
Défi relevé...

Commentaire de japee le 12/08/2006 23:26:52 administrateur CS

Un duel au lever du jour ?

Il était une fois à l'ouest de DelphiFr.com...
On dirait que les flingues vont parler.
Ames sensibles, passez votre chemin ! ;-)

Commentaire de Matt 261 le 13/08/2006 09:52:32

Ca y est ! Trouvé en 5 mn environ (avec un creveau à moitié endormit ! ).

Commentaire de Forman le 13/08/2006 11:49:51

Il suffit de faire Memo1.Lines.BeginUpdate avant de commencer à manipuler Memo1.Lines et ne pas oublier Memo1.Lines.EndUpdate après avoir fini de changer les lignes du mémo. De cette façon, tu empèches la fenêtre de se réafficher 50 fois de suite, ce qui gagne du temps.

Commentaire de DRJEROME le 13/08/2006 12:53:29

yâââh c'est trop mignon comme logique !

j'ai adoré...

Commentaire de Caribensila le 13/08/2006 14:21:33

Horreur!!!!  J'ai tout de suite trouvé la logique.
Et maintenant je suis tourmenté par une profonde angoisse quant à mon age mental ou mon incurie en math.
Et même, par moment, une tragique question me hante: et si c'était les deux?!
mdr
En tout cas, c'est bien plus rigolo et plus beau que la suite de Steinhaus...
( Qui a demandé: "c'est quoi la beauté en math"? ;)

Commentaire de Caribensila le 13/08/2006 14:28:10

--> Florenth  Où as-tu trouvé l'Eau de Jouvence?

Commentaire de f0xi le 13/08/2006 17:09:04 administrateur CS

WHOAAAAAA! J'ai compris!

en fait, chaque suite et le logarythme naturel exposant 4 au carré plus pi sinus 2 fois 16 divisé  par 666.

ch'est pa cha ?

@florenth : gettickcount ça pue. c'est aussi précis qu'un lancé de vache avec un train qui roule a 120Km/h

Commentaire de Caribensila le 13/08/2006 17:13:06

--> Foxi
Et que proposes-tu pour que la vache atteigne la cible?  mdr

Commentaire de japee le 13/08/2006 17:13:54 administrateur CS

"aussi précis qu'un lancé de vache avec un train qui roule a 120Km/h"
Ca a rapport avec la théorie relativité restreinte ? ptdr...

Commentaire de BruNews le 13/08/2006 17:17:59 administrateur CS

Me semble bien que depuis le Pentium, tous les CPUs fournissent de quoi faire tourner QueryPerformanceCounter.

Commentaire de Caribensila le 13/08/2006 18:17:57

Z'avez vu ça?

truc
1t1r1u1c
111t111r111u111c
311t311r311u311c
13211t13211r13211u13211c
111312211t111312211r111312211u111312211c
Mathématiquement parlant, c'est rigolo...
'sais pas quoi en conclure, mais certains matheux y trouveront certainement du grain à moudre... ;)

Commentaire de Caribensila le 13/08/2006 18:42:13

Ben ouais. Aussi pour optimiser la fonction, peut-être.

Enfin, 'sais pas. Je ne me suis pas pencher sur le problème...

Commentaire de Caribensila le 13/08/2006 18:49:43

Plus clair comme ça, peut-être:




truc
1t 1r 1u 1c
111t 111r 111u 111c
311t 311r 311u 311c
13211t 13211r 13211u 13211c
111312211t 111312211r 111312211u 111312211c

Commentaire de Caribensila le 13/08/2006 19:02:46

...Une autre idée: un calcul en base 3

( j'espère que je ne dis pas trop de c..ies! :)

Commentaire de japee le 13/08/2006 19:17:54 administrateur CS

Il semblerait que là non plus on ne puisse pas dépasser le chiffre 3.
Mais à mon goût, la progression est trop régulière et prévisible à des kilomètres... ;-)

Commentaire de japee le 13/08/2006 19:21:07 administrateur CS

Plus intéressant sans doute :
1CAFE, en hexadécimal...
Mais là, faut que je sorte la calculette microsoft, lol.

Commentaire de f0xi le 13/08/2006 19:23:04 administrateur CS

bon, je participe au defi :

Delphi 7,
Atlhon XP 2700+ 2166Mhz (13x167) Thoroughbred-B,
MSI KT4VL chip VIA Apollo KT400,
DDR PC2700 @ 333Mhz 2.5-3-3-7 CR2T
Windows XP Pro SP1, 23 processus, CPU Load 0-2%, Avast/Firefox/Delphi 7

Compteur de temps : HPC millisecondes
Taille du buffer  : 2048 bytes

40 Wakygneuts / Temps : 1,9776 ms / Taille : 7,87 Ko
70 Wakygneuts / Temps : 3,4915 ms / Taille : 17,79 Ko
140 Wakygneuts / Temps : 7,0836 ms / Taille : 40,95 Ko
280 Wakygneuts / Temps : 14,0205 ms / Taille : 87,24 Ko
560 Wakygneuts / Temps : 28,5095 ms / Taille : 179,86 Ko
1120 Wakygneuts / Temps : 56,6877 ms / Taille : 365,06 Ko
2240 Wakygneuts / Temps : 115,0914 ms / Taille : 735,48 Ko

Commentaire de japee le 13/08/2006 19:23:42 administrateur CS

Bof, non, aucun intérêt... vais m'en servir un, tiens, de café, ça va me réveiller.

Commentaire de Caribensila le 13/08/2006 19:31:40

J'ai rien dit, ok?  lol

Commentaire de f0xi le 13/08/2006 19:37:12 administrateur CS

@Florenth : oui c'est effectivement grace a toi si je connais tout ce que je connais de l'optimisations, des pointeurs et j'en passe. ^^ merci en passant.

sinon tout les CPU de moins de 5 ans supporte PerformanceCounter au moins chez AMD et Intel, si je ne m'abuse.

Commentaire de f0xi le 13/08/2006 19:51:31 administrateur CS

par contre y'a deux choses amusantes dans cette enigme,
non seulement ça ne compte que jusque 3,
mais en plus la taille des reponses ne peu pas depasser 350 chiffres.
ce qui permet d'ajuster mon buffer a 351 au lieu de 2048 ...

5000 Wakygneuts / Temps : 254,7406 ms / Taille : 1648,29 Ko

quelques diziemes de millisecondes en moins ...


procedure MakeWakyStrings(const AStrings : TStrings; const ACount : integer = 70);
   function GetNextWaky(const SFrom : string) : string;
   var
     PResult : PChar;
     c, e    : Char;
     i       : byte;
   begin
     SetLength(Result,351);
     PResult := PChar(Result);
     i := 1;
     c := SFrom[i];
     repeat
       e:='0';
       repeat
         Inc(i);
         Inc(e);
       until c <> SFrom[i];
       PResult[0] := e;
       PResult[1] := c;
       inc(PResult,2);
       c := SFrom[i];
     until c = #0;
     SetLength(Result,Integer(PResult)-Integer(PChar(Result)));
   end;
var
  i : Integer;
begin
  with AStrings do begin
       Clear;
       BeginUpdate;
       Add('1');
       for i := 0 to ACount-2 do
           add(GetNextWaky(Strings[i]));
       EndUpdate;
  end;
end;

Commentaire de Kenavo le 14/08/2006 19:33:12

Salut à tous !
Bravo ! Vous profitez que j'ai le dos tourné pour jouer!
Amusant! Je ne sais pas combien de temps j'aurai cherché si Caribensila n'avait pas "donné" la solution !

@Foreman : 111333 que tu donnes en exemple n'est pas valide ! (tout du moins si j'ai bien compris)

@fOxi : 350 chiffres max, c'est par expérience ou par par calcul ?

Ken@vo

Commentaire de japee le 14/08/2006 20:15:38 administrateur CS

Salut Kenavo,

Ouais, bien vu : 111333 ne peut être valide ou je n'ai rien compris non plus...

Bon, on dirait que l'ambiance est un peu retombée depuis hier. Ils sont tous partis en laissant la lumière allumée. ;-)

Commentaire de Kenavo le 14/08/2006 21:08:20

Salut mon bon Jappee,
Eh oui ! Et il semble que l'algo de Foreman tienne la route plus que certains ne le souhaiteraient.
La vapeur est retombée ! (Mais Delphiprog doit être en train de bouillir quelque part)
Laisse donc la lumière allumée !
Ken@vo

Commentaire de japee le 14/08/2006 21:28:05 administrateur CS

"Laisse donc la lumière allumée !"
Mais bon, tu comprends, déjà ils rentrent sur la page, ils s'essuient même pas les pieds. Premièrement.
Et puis on fait la fête, tout ça, on rigole bien, mais je sais déjà qui va se taper le ménage, hein ?
Enfin, je râle, mais je suis bonne pâte, dans le fond. Oh, ils le savent bien va !
Et y'en a qui en profitent. Qui abusent, quoi...

Commentaire de japee le 15/08/2006 00:28:38 administrateur CS

Attention, Florenth, certaines lignes sont affectées d'office d'un retour à la ligne dans le memo, passé une certaine longueur je suppose, et ce malgré le WordWrap.
Mais je ne crois pas qu'il y ait de bug, enfin je vais vérifier, mais j'étais sur un autre coup, là, je balance un code qui traite de différence de dates, et je reviens.

Commentaire de japee le 15/08/2006 01:20:37 administrateur CS

Oui, j'avais commencé un programme de test plus élaboré que celui que j'ai envoyé ici, mais qui n'est pas terminé.
Il apparaît que la ligne 25 est tronquée, sans doute un problème de longueur, mon programme de test vérifiera ça quand il sera achevé :
ligne 25 : 13211321
"fausse" ligne 26 : 13112221
ligne 27 (en fait la ligne 26) : 111312211312
Pfff... en fait, je suis complètement paumé, je crois que je vais voir ça demain... ça a l'air moins simple que je ne le pensais au premier abord.
A +

Commentaire de Forman le 15/08/2006 22:38:05

Japee: je me plaçais dans l'ensemble des mots du langage {1,2,3}* (c'est à dire toutes les chaînes de caractères composées des 3 caractères 1, 2 et 3). La fonction f qui permet de passer d'un terme de la suite à l'autre est définie sur presque tout ce langage (en fait sur tous les mots formés d'au plus 3 lettres identiques successives). Par exemple,
f(22)=22
f(111333)=3133
C'est pour ça que je disais que lorsqu'on restreint l'étude de cette fonction sur les termes de la suite, rien ne nous dit que la longueur de la suite est croissante (même si l'étude des 100 premiers termes semble le confirmer), ni même que la suite n'est pas périodique...

Commentaire de CptPingu le 16/08/2006 03:47:28 administrateur CS

Cette suite s'appelle la suite de Conway.

De nombreuse informations sont présente ici:
http://fr.wikipedia.org/wiki/Suite_de_Conway

Commentaire de Bidou le 16/08/2006 09:05:09 administrateur CS

Voilà voilà, il me semblait bien que cette suite portait un nom, mais impossible de mettre la main dessus !
Merci PINGU pour le lien :-)

Commentaire de japee le 16/08/2006 10:32:23 administrateur CS

Merci, CptPingu, je rajouterai cette information dans la présentation (et dans le titre).

Commentaire de Forman le 16/08/2006 12:23:21

Cool j'ai pu trouver la démonstration (du moins le début, la suite étant évidente mais "calculatoirement compliquée" à partir de là) des propriétés de la suite:
http://www.math.temple.edu/~zeilberg/mamarim/mamarimPDF/horton.pdf
C'est une pure preuve informatique  ;-)

Commentaire de Forman le 16/08/2006 16:48:37

Joli et élégant! (même si à la fin le code devient difficilement compréhensible...)

Commentaire de f0xi le 16/08/2006 18:03:21 administrateur CS

TMemo : limité a 1024 octet par ligne
TRichEdit : limité a 4095 octet par ligne
TListBox : illimités

avec la tlistbox, reglage de mon bug de compteur (variable i) qui etait en byte (donc rotation a 255 --> 0...255 --> 0) changé en cardinal.

je tiens a préciser que les temps donnés sont les temps mis pour calculer de la premiere (1) a la Neme solution et non en partant de celle d'avant (N-1).

>> buffer 1Mo
10 Wakygneuts / Temps : 0,11 ms / Taille : 0,09 Ko / Le plus long 20 caracteres
15 Wakygneuts / Temps : 0,15 ms / Taille : 0,34 Ko / Le plus long 78 caracteres
20 Wakygneuts / Temps : 0,23 ms / Taille : 1,27 Ko / Le plus long 302 caracteres
25 Wakygneuts / Temps : 0,36 ms / Taille : 4,89 Ko / Le plus long 1 182 caracteres
30 Wakygneuts / Temps : 0,96 ms / Taille : 18,60 Ko / Le plus long 4 462 caracteres
35 Wakygneuts / Temps : 3,69 ms / Taille : 70,32 Ko / Le plus long 16 774 caracteres
40 Wakygneuts / Temps : 16,26 ms / Taille : 264,79 Ko / Le plus long 63 138 caracteres
45 Wakygneuts / Temps : 56,70 ms / Taille : 996,99 Ko / Le plus long 237 746 caracteres
50 Wakygneuts / Temps : 217,97 ms / Taille : 3.75 Mo / Le plus long 894 810 caracteres
55 out of buffer...

>> up du buffer a 4Mo pour calculer le 55eme
55 Wakygneuts / Temps : 838,85 ms / Taille : 14.13 Mo / Le plus long 3 369 156 caracteres

>> up du buffer a 16Mo pour calculer le 60eme
60 Wakygneuts / Temps : 3.179 sec / Taille : 53.18 Mo / Le plus long 12 680 852 caracteres
- taille du processus en memoire : 109Mo!

juste pour le fun aprés j'arrete d'augmenter le buffer

>> up du buffer a 32Mo pour calculer le 70eme
mon dieu ça rame ... ça attaque carrement le swap disque ...
han ... erreur ... 32Mo ça suffit pas ...

buff a 64Mo ... out of resources ...

donc j'inscrit mon record du calcul de la 1ere a la 60eme solution avec TListBox et Buffer de 16Mo :
Temps : 3.179 sec / Taille (items.text) : 53.18 Mo / 12 680 852 caracteres

je dois redemarrer mon pc ... ça rame ...

Commentaire de f0xi le 16/08/2006 18:09:58 administrateur CS

procedure MakeWakyStrings(const AStrings : TStrings; const ACount : byte = 1);
   function GetNextWaky(const SFrom : string) : string;
   var
     PResult : PChar;
     c, e    : Char;
     i       : Cardinal;
   begin
     SetLength(Result,65536 shl 9);
     PResult := PChar(Result);
     i := 1;
     c := SFrom[i];
     repeat
       e:='0';
       repeat
         Inc(i);
         Inc(e);
       until c <> SFrom[i];
       PResult[0] := e;
       PResult[1] := c;
       inc(PResult,2);
       c := SFrom[i];
     until c = #0;
     SetLength(Result,Integer(PResult)-Integer(PChar(Result)));
   end;
var
  n : Integer;
begin
  if ACount > 60 then exit;
  with AStrings do begin
       Clear;
       BeginUpdate;
       //HPC := ExtSystem.GetHPClock;
       Add('1');
       for n := 0 to ACount-2 do begin
           add(GetNextWaky(Strings[n]));
       end;
       //HPC := ExtSystem.GetHPClock - HPC;
       EndUpdate;
       //waket := 0;
       //for n := 0 to Count-1 do
       //    if Length(Strings[n]) > Waket then Waket := Length(Strings[n]);
  end;
end;

Commentaire de JulioDelphi le 16/08/2006 20:10:27 administrateur CS

@japee : "Merci, CptPingu, je rajouterai cette information dans la présentation (et dans le titre)."

Que tes désirs soient réalisés. ;)

Commentaire de japee le 16/08/2006 20:46:23 administrateur CS

Salut, JulioDelphi.

And my dream comes true...
Y'en a qui vont penser que je suis pistonné, lol ;-)
Faudra aussi que je rajoute un BeginUpdate et EndUpdate à mon pauvre code poussif, ça améliore gravement la vitesse.
Même si ça n'était pas mon but initial, mais bon, il commence à avoir l'air minable, le pauvre...

Commentaire de f0xi le 17/08/2006 04:52:44 administrateur CS

@florenth : mmm bizarre en effet ...
version de Delphi ?
AMD ? Intel HyperThreadé ?
type de memoire ?

j'ai remarqué aussi une augmentation des temps quand on execute le prog hors session delphi ...


pour la verification des limites c'est etrange aussi car active sur ma session delphi ... etrange etrange ...

Commentaire de japee le 17/08/2006 22:51:14 administrateur CS

Ca m'a l'air net et sans bavures, avantage Florenth.
Mon code est largué, mais alors très très loin derrière.
Je laisse à ceux qui ont des configs musclées le soin d'analyser finement.
Chez moi, à partir de 40 lignes, mon proc' est à deux doigts de l'infarctus...

Commentaire de f0xi le 19/08/2006 19:25:33 administrateur CS

chiffre disponible unique 1 2 et 3

le type string est trés lents.

si on code en hexa dans un byte array en exluant les 0 on pourrait non seulement raccourcirs la taille en octets et surrement gagner en vitesse.

en hexa ce la ferais donc :
01
11
21
12 11
11 12 21
31 22 11
13 11 22 21
11 13 21 32 11
31 13 12 11 13 12 21
13 21 13 11 12 31 13 11 22 11
11 13 12 21 13 31 12 13 21 13 21 22 21
31 13 11 22 21 23 21 12 11 13 12 21 13 12 11 32 11

en gros on as toujours une paire de chiffre et une longeur paire.

la ligne
1113213211
aurait pour valeur en char* :
31313133323133323131
soit deux fois plus longue (en memoire)

donc avec un array of byte ça devrait pouvoir passer.

ça te tente flo?



 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Lancer une sequence video [xx(] [ par Gysmo ] J'aimerai lancer une sequence video 'film.avi' par exemple en passant par un lecteur video (koi de plus normal...). Mais... Voici les code ke j'ai ess Intercepter touche entrée suite saisie [ par nonobiker ] Bonjour,Je souhaite savoir comment intercepter un clic sur la touche entrée suite à une saisie dans une zone Edit. L'objectif est de ne pas avoir à al Générateur [ par losc ] Salut, a tousJ'aimerai créer un générateur de phrasesPar ex : avec un Edit1 - 2 boutons ( Génerer - Ok )J'ai essayé de me renseigner & fo utiliser des Création d'applications skinnées avec FreeMedia (aka MediaPack) [ par maxabbey ] Salut à tous,Sur SourceForge.net, il y a une suite de composants Delphi, FreeMedia (http://sourceforge.net/projects/ksfreemedia), gratuite et avec sou Enrensitrement d'une sequence video [ par blue71 ] Blue71Blue71Blue71Voila, j'aimerai enrengister une sequence video qui se trouve dans un Timage, (c'est la webcam qui est en marche dans le Timage), ma Enrensitrement d'une sequence video. [ par blue71 ] Blue71Blue71Blue71Hello tout le monde, voilà j'ai une question. J'aimerai mettre du texte dans un Timage par exemple la date, cependant je sais pas co TCheckListBox Suite... [ par MAsterC ] Merci!Sa marche! Mais cependant en écrivant mon message j'ai oublié de m'ensionné:Comment fait-on pour coché un item quel qu'onque..Ex.: J'ai un bouto Ptit problème d'affichage... [ par hectorticoli ] Bonjour, Voila mon problème, lors du clic d'un bouton, je fais afficher une nouvelle Form, avec plateau de Jeu et qqs zones d'options. Le fond s'affi Générateur de documentation Delphi [ par RXG ] Bonjour,J'ai besoin de générer rapidement une documentation (RTF ou PDF) pour un projet développé en Delphi. Quelqu'un connait-il un freeware complet


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales