String Kombinasyon Algoritması
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
String Kombinasyon Algoritması
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
...
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
...
Re: String Kombinasyon Algoritması
Aslında çok basit bir işlem ama iç içe (recursive) yapı konusunda takılmışsın.

Kullanımı :
Procedure:


Kullanımı :
Kod: Tümünü seç
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Kombinasyon( Edit1.Text, Memo1.Lines[0], Memo2.Lines );
end;

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;
Re: String Kombinasyon Algoritması
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.
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.
Re: String Kombinasyon Algoritması
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.
(-) Ü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.
Re: String Kombinasyon Algoritması
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';
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';
Re: String Kombinasyon Algoritması
- 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.
Döngü sonunda bunlar listede alt alta eklenecek.. Ya da ben yanlış anladım.
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 );
Re: String Kombinasyon Algoritması
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.
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.
Re: String Kombinasyon Algoritması
Evet aynen öyle. Ama çok zaman almaz, captcha ocr ile uğraşıyorsanız harf sayısı az çünkü.
Re: String Kombinasyon Algoritması
Evet captcha basit, doküman yönetimi ile ilgili birşeyler geliştirmeye çalışıyorum.
İlgi ve alakanız için teşekkürler.
İlgi ve alakanız için teşekkürler.