String Kombinasyon Algoritması

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
powertrk
Üye
Mesajlar: 27
Kayıt: 01 Eki 2008 12:02

String Kombinasyon Algoritması

Mesaj gönderen powertrk »

Merhaba Arkadaşlar,
Bir konu hakkında kafa yoruyorum fakat bir çözüm oluşturamadım.
Bir string değer içindeki karakterleri kendisi de dahil olmak üzere tanımlı bazı değerlerle kombinasyona sokarak bir çıktı elde etmeye çalışıyorum.
Örnek vermek gerekirse:
Aşağıda karakter ve karşısında da alabileceği değerler var.
A : Y,1,I
B : E,8
D : O,0
...
Bu şekilde devam eden bir karakter tablom var. Her birini ayrı değişkenlerde saklıyorum. Bu tabloya göre örnek BACA değerinden nasıl aşağıdaki gibi uzayıp giden bir çıktı elde edebilirim.
BACA
BYCA
BYCY
BYC1
BYCI
B1CA
B1CY
B1C1
B1CI
...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: String Kombinasyon Algoritması

Mesaj gönderen mrmarman »

Aslında çok basit bir işlem ama iç içe (recursive) yapı konusunda takılmışsın. :idea:
Resim

Kullanımı :

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Kombinasyon( Edit1.Text, Memo1.Lines[0], Memo2.Lines );
end;
Procedure: :bravo:

Kod: Tümünü seç

procedure Kombinasyon( strAnahtar, strKarsilik: String; Liste:TStrings );
Var
  dizi      : array of Char;
  strSatir,
  strUretim : String;
  i, j      : Integer;
  c         : char;
begin
  // Faz 1 : Karsilik karakterleri diziye alıyoruz... A : Y,1,I
  strSatir := Trim(strKarsilik) + ',';
  c := strSatir[1];
  system.Delete( strSatir, 1, Pos( ':', strSatir ) );
  i := 0;
  while pos(',', strSatir) > 0 do
  begin
    inc(i);
    if High(dizi) < i then SetLength( dizi, i );
    dizi[i-1] := trim(strSatir)[1];
    system.Delete( strSatir, 1, Pos(',', strSatir ) );
    strSatir := Trim(strSatir);
  end;

  // Faz 2 : Anahtar karakterleri sirayla dolaşıp dizidekileri sırayla uyguluyoruz...
  strUretim := strAnahtar;
  for i := 1 to Length(strUretim) do
  begin
    if strUretim[i] = c then
    begin
      for j := low(dizi) to high(dizi) do
      begin
        strUretim[i] := dizi[j];
        Liste.Add( strUretim );
        // Üretilen liste elemanın da sorgulanması gerek
        // Recursive olması için kendi procedure'ünü
        // Üretilen kelime ile sorgulayarak iç içe üçüncü/dördüncü/.... seviye
        // döngüler kendiliğinden hayata geçmiş oluyor.
        Kombinasyon( strUretim, strKarsilik, Liste );
      end;
    end;
  end;
end;
Resim
Resim ....Resim
powertrk
Üye
Mesajlar: 27
Kayıt: 01 Eki 2008 12:02

Re: String Kombinasyon Algoritması

Mesaj gönderen powertrk »

Elinize sağlık Muharrem Bey.
Evet haklısınız içiçe yapıda takıldım. Bir daha kendi içinde kombinasyona almadığım için çözümsüz kaldım.
Ben fikre bile razıydım. Siz zahmet edip kodu bile yazmışsınız. Teşekkür ederim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: String Kombinasyon Algoritması

Mesaj gönderen mrmarman »

Memnun oldum,

(-) Üretilen kelimeleri Liste içerisine almadan önce IndexOf ile kontrol edip "listeye daha önce eklenmişse aynısı tekrar eklenmesin" kontrolünü koymayı ihmal etmişim, sizin gözünüzden kaçmaz ama ben yine de bir hatırlatayım istedim. Şimdi bakınca gördüm listenin en altındaki üç satır daha önce eklenmişler ile benzer olmuş.

Başarılar.
Resim
Resim ....Resim
powertrk
Üye
Mesajlar: 27
Kayıt: 01 Eki 2008 12:02

Re: String Kombinasyon Algoritması

Mesaj gönderen powertrk »

Evet Muharrem Bey, o çok mühim değil.
Pc başına yeni geçtiğim için şimdi detaylı inceleme şansı buldum.
Gönderilen anahtar kelimelerle güzel bir şekilde kombinasyon yapıyor.
Fakat aslında yapmak istediğim tüm anahtar kelimelerle kombine edebilmek.
Bunun için sanırım her bir karakter için oluşan değerleri, diğer karakterler için de kodumuzu çalıştırmak.
Açıkça belirtmem gerekirse bu işlemin kullanım alanı olarak düşündüğüm OCR sonucu ortaya çıkan kelimelerde imla hatalarını düzeltmek.
Aşağıda kendimce tespit ettiğim karakter tablosunun tümünü belirtiyorum. Başlarında bulunan AA dikkate alınmasın, değişken olarak tanımlayabilmek için kullanıldı.
Belki bu konuda doğru yolu izlemiyor da olabilirim. Belki de daha hızlı ve pratik bir yöntem geliştirilebilinir.
Değerli fikirlerinizi paylaşırsanız sevinirim.

AAA = '4I';
AAB = '8E';
AAC = '';
AAD = 'O0';
AAE = 'B8';
AAF = 'E';
AAG = '6';
AAH = 'R';
AAI = '1LVY';
AAJ = '1L';
AAK = '';
AAL = '1I';
AAM = 'N';
AAN = 'M';
AAO = '0D';
AAP = '';
AAR = 'B8H';
AAS = '5';
AAT = '7';
AAU = '';
AAV = 'YI';
AAY = 'VI';
AAZ = '2';
AAX = '';
AAQ = '';
AAW = '';
AA1 = 'ILJ';
AA2 = 'Z';
AA3 = '';
AA4 = 'A';
AA5 = 'S';
AA6 = 'G';
AA7 = 'T';
AA8 = 'B';
AA9 = '';
AA0 = 'OD';
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: String Kombinasyon Algoritması

Mesaj gönderen mrmarman »

- Bir döngü ile A'dan Z'ye yürüyüp listeye eklenmesini sağlaycaksınız işte. Ben mi yanlış anladım bilemedim.

Kod: Tümünü seç

  Kombinasyon( 'BACA', 'A:4,I', Memo2.Lines );
  Kombinasyon( 'BACA', 'B:8,E', Memo2.Lines );
  Kombinasyon( 'BACA', 'D:O,0', Memo2.Lines );
Döngü sonunda bunlar listede alt alta eklenecek.. Ya da ben yanlış anladım.
Resim
Resim ....Resim
powertrk
Üye
Mesajlar: 27
Kayıt: 01 Eki 2008 12:02

Re: String Kombinasyon Algoritması

Mesaj gönderen powertrk »

Yanlış anlamadınız. Ben en başta eksik anlattığımı farkettim.
BACA kelimesinden yola çıkarsak:
A : 4,I
B : 8,E
değerlerini kullanarak sonuç dönmesi gerekiyor. Bu durumda çıktı aşağıdaki gibi olacaktır.
B4CA
B4C4
B4CI
BICA
BIC4
BICI
8ACA
EACA
Fakat bu veriler yeterli değil. Ben aşağıdaki sonuçlarıda almak istiyorum.
84C4
84CA
8AC4
E4C4
E4CA
EAC4
Bunu elde edebilmek içinde yukarıdaki sonuçları tekrardan döngüden geçirmemiz gerekiyor sanırım.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: String Kombinasyon Algoritması

Mesaj gönderen mrmarman »

Evet aynen öyle. Ama çok zaman almaz, captcha ocr ile uğraşıyorsanız harf sayısı az çünkü.
Resim
Resim ....Resim
powertrk
Üye
Mesajlar: 27
Kayıt: 01 Eki 2008 12:02

Re: String Kombinasyon Algoritması

Mesaj gönderen powertrk »

Evet captcha basit, doküman yönetimi ile ilgili birşeyler geliştirmeye çalışıyorum.
İlgi ve alakanız için teşekkürler.
Cevapla