function GetFirst0(text: string): Byte; var I: byte; begin for I := 1 to Length(text) do if Text[i] = '0' then begin Result := i; exit end; end; function GetLast0(text: string): Byte; var I: Byte; begin for I := Length(text) downto 1 do if text[i] = '0' then begin result := i; exit end; end; procedure TForm1.Button1Click(Sender: TObject); var I: Byte; Pinterval: Byte; interval: Byte; count0: Byte; begin for I := GetFirst0(Edit1.Text) to GetLast0(Edit1.Text) do begin if Edit1.Text[i] = '0' then begin inc(Count0); if Count0 = 2 then Pinterval := interval else if interval <> Pinterval then begin ShowMessage('irregulier'); Exit end; interval := 0 end else inc(interval); end; ShowMessage('Regulier'); end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in ['_','0',#8]) then key := #0 end;
if Count0 = 2 then Pinterval := interval
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionuses StrUtils; function IsPeriodic(S: string): Integer; var Count,Index: Integer; SubStr: string; begin Result := -1; for Count := 2 to Length(S) div 2 do begin for Index := 1 to Length(S) div 2 do begin SubStr:= Copy(S,Index,Count); if (PosEx(SubStr,S,Index+Count)=Index+Count) and (PosEx(SubStr,S,Index+Count+Count)=Index+Count+Count) then begin result := Count; exit; end; end; end; end;
for Count := 2 to Length(S) div 2 do begin for Index := 1 to Length(S) div 2 do begin
Form1.Memo1.Lines.Add(SubStr);
SubStr:= Copy(S,Index,Count);
uses StrUtils; const TabC : array [0..2] of string = ('0__','00__','0_0__'); var Tab : array of string; function Search(Value: string): Boolean; var I : Integer; N : Integer; V : Integer; J : Integer; NewV : string; begin Result := True; N := Length(Value); for I := 0 to High(Tab) do begin V := Length(Tab[I]); NewV := Value; for J := 1 to Trunc(N div V) do begin if Pos(Tab[I], NewV) = 1 then begin Result := False; NewV := Copy(NewV, V+1, N); end else begin Result := True; Break; end; end; if not Result then begin if Length(NewV) <= 1 then begin if I = High(Tab) then MessageDlg('Nouvelle sorte de Constante '+Tab[I], mtInformation, [mbOK], 0); Break; end else Result := True; end; end; end; procedure List0_(Value, SubStr1, SubStr2: string; List1, List2: TStringList; Trie: Boolean); var A : Integer; B : Integer; SubStr : string; begin List1.Clear; List1.Sorted := Trie; List1.Duplicates := dupIgnore; List2.Clear; List2.Sorted := Trie; List2.Duplicates := dupIgnore; SubStr := Value; while (Pos(SubStr1, Substr) <> 0)and (Pos(SubStr2, Substr) <> 0) do begin A := Pos(SubStr1, Substr); B := PosEx(SubStr2, Substr, A); List1.Add(Copy(Substr, A-1, B-1)); Substr := Copy(Substr, B, Length(SubStr)); A := Pos(SubStr1, Substr); if A <> 0 then List2.Add(Copy(Substr, 0, A-1)); Substr := Copy(Substr, A, Length(SubStr)); end; end; function SearchReg(Value: string): string; var I : Integer; C : Integer; D : Integer; List0 : TStringList; List_ : TStringList; SubStr : string; SubStr1 : string; SubStr2 : string; begin List0 := TStringList.Create; List_ := TStringList.Create; try if Pos('0',Value) = 1 then begin SubStr1 := '0'; SubStr2 := '_'; end else begin SubStr1 := '_'; SubStr2 := '0'; end; SubStr := Value; List0_(Value, SubStr1, SubStr2, List0, List_, True); C := List0.Count; D := List_.Count; List0_(Value, SubStr1, SubStr2, List0, List_, False); if D > C then C := D; SubStr := EmptyStr; for I := 0 to C - 1 do SubStr := SubStr + List0[I] + List_[I]; Result := SubStr; finally List0.Free; List_.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); var I : Integer; begin SetLength(Tab, High(TabC)+ 2); Tab[High(Tab)] := SearchReg(Edit1.Text); for I := 0 to High(TabC) do Tab[I] := TabC[I]; if Search(Edit1.Text)then ShowMessage('Irrégulier') else ShowMessage('Régulier'); end;
function Recherche_Sequence_la_plus_grande(Fuite: String; MaxSequence: Integer): String; // Cette sous-fonction vérifie que cette séquence se répète dans la fuite :) function SequenceValide(UneSequence: String): Boolean; var posSequence: Integer; Reste_a_analyser: String; PosOk: Boolean; begin Reste_a_analyser := fuite; // Recherche de la 1ere occurence de la séquence: posSequence := pos(UneSequence, Reste_a_analyser); PosOk := posSequence <> 0; while posOk do begin Delete(Reste_a_analyser, posSequence, length(UneSequence)); posSequence := pos(UneSequence, Reste_a_analyser); posOk :p 1; end; Result := length(Reste_a_analyser) < length(UneSequence); // La séquence s' est bien répétée jusqu' à la fin ... end; var i, s: Integer; EtudierSequence: String; begin Result := ''; for i := 1 to length(Fuite) do for s:= 1 to Length(MaxSequence) do begin EtudierSequence := Copy(Fuite, i, s); if SequenceValide(EtudierSequence) then if Length(EtudierSequence) > Length(Result) then Result := EtudierSequence; end; end;
procedure Tform1.cySpeedButton2Click(Sender: TObject); function Recherche_Sequence_la_plus_petite(Fuite: String; MaxSequence: Integer): String; // Cette sous-fonction vérifie que cette séquence se répète dans la fuite :) function SequenceValide(UneSequence: String): Boolean; var posSequence: Integer; Reste_a_analyser: String; PosOk: Boolean; begin Reste_a_analyser := fuite; // Recherche de la 1ere occurence de la séquence: posSequence := pos(UneSequence, Reste_a_analyser); PosOk := posSequence <> 0; while posOk do begin Delete(Reste_a_analyser, posSequence, length(UneSequence)); posSequence := pos(UneSequence, Reste_a_analyser); posOk :posSequence 1; end; Result := length(Reste_a_analyser) < length(UneSequence); // La séquence s' est bien répétée jusqu' à la fin ... end; var i, s: Integer; EtudierSequence: String; begin Result := ''; for i := 1 to length(Fuite) do for s:= 1 to MaxSequence do begin EtudierSequence := Copy(Fuite, i, s); if SequenceValide(EtudierSequence) then if (Result = '') or (Length(EtudierSequence) < Length(Result)) then Result := EtudierSequence; end; end; var fuga: String; begin fuga := '_0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________'; cySpeedButton2.Caption := Recherche_Sequence_la_plus_petite(Fuga, length(fuga)); end;