Suite de conway (look and say sequence) - generateur

Description

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
11131221133112132113212221
3113112221232112111312211312113211
1321132132111213122112311311222113111221131221

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 / Exemple :


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

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.