Forum: D Programlama Dili RSS
1 dizginin başka dizgiyi içermesi ile ilgili soru
kerdemdemir #1
Üye Eyl 2013 tarihinden beri · 109 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: 1 dizginin başka dizgiyi içermesi ile ilgili soru
Merhaba,

Bu birazcık daha zorumsu bir soru.

Şöyleki iki tane dizgimiz var örneğin "abc" ve "asdabe"

Bizden istenilen ikinci dizginin içinde hangi posizyonda birinci dizgi ile en cok harfin aynı olduğu.

asd(abe)
     (abc) --> bu posizyonda iki harf aynı ve en büyük korrelasyon 2.

Bizden istenilen en büyük korelasyon olan posizyonda kaç tane harfin değişmesi gerektiği ve bu harflerin ilk dizgideki posizyonları.

Ben çözümümden önce sorularımla başlayım:

1 - Ben nedense dizileri nasıl ekleme yaptığımızı unutup duruyorum. D'nin array bağlantısında https://dlang.org/spec/arrays.html herşey yazıyor ama "=~" belirtilmemiş. Bu yeni başlıyan insanlar için daha gerekli ama sayfa biraz daha havalı şeylerden bahsetmeyi tercih etmiş gibi. Ali Abinin kitabı var iyiki. Ben mi gözden kaçırıyorum acaba?

2 -     Aşağıdaki kodda 2 şeyden memnun değilim bir pos,max olarak state tutmak istemiyorum. İkincisi ise for döngülerini sevmiyorum. Acaba CompareToStrings( s, t[i..i+s.length]) 'ın yaptığı işi "i" index olmadan yapabilen bir fonksiyon varmı. Ve diyelimki var bana bir range verdi ben bu range'in posizyonu sonradan öğrenebilirmiyim yine index kullanmadan .

for ( int i = 0; i <= t.length - s.length; i++ )
    {
        int curVal = CompareToStrings( s, t[i..i+s.length]);
        if ( curVal > max )
        {
            pos = i;
            max = curVal;
        }
    }

3 - Genel bir tavsiyeniz olurmu acaba, bu arada genel tavsiyeleriniz arasında şu kitabın bölümünü oku gibi tavsiyeler çok işime yarayabilir.

import std.stdio;
import std.string;
import std.algorithm;
import std.exception;
import std.conv;
import std.array;
import std.range;
import std.math;
 
int CompareToStrings ( dstring first, dstring second )
{
    //writeln(first, second);
    int returnVal = 0;
    zip(first, second).each!( a => a[0] == a[1] ? returnVal++ : returnVal );
    //writeln(returnVal);
    return returnVal;
}
 
int[] FindDiffPositions ( dstring first, dstring second )
{
    int[] returnVal;
    for ( int i = 0; i < first.length; i++ )
    {
        if ( first[i] != second[i] )
            returnVal ~= (i + 1);
    }
    return returnVal;
}
 
void main() 
{
    auto ilkSatir = stdin.readln.strip.split().map!(a => to!int(a)).array();
    auto s = stdin.readln.strip.to!dstring;
    auto t = stdin.readln.strip.to!dstring;
    
    int pos = 0;
    int max = 0;
    for ( int i = 0; i <= t.length - s.length; i++ )
    {
        int curVal = CompareToStrings( s, t[i..i+s.length]);
        if ( curVal > max )
        {
            pos = i;
            max = curVal;
        }
    }
 
    auto curList = FindDiffPositions( s, t[pos..pos+s.length]);
    writeln( s.length - max );
    curList.each!(a => write(a, " "));
}

Erdemdem
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4481 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
kerdemdemir on 2017-07-08, 04:59:
1 - ama "=~" belirtilmemiş.

Ararken de öyle yanlış mı yazırsun acaba? ;) Ama haklısın, ayrı bir başlık altında değil, Array Concatenation'ın altında "the ~= operator means append" diye belirtmişler.

Ali Abinin kitabı var iyiki. Ben mi gözden kaçırıyorum acaba?

Ona bakarsan benim dizi bölümlerinde de diziden eleman çıkartma bilgisi eksik :) çünkü o iş için çok daha sonra sonra gelecek olan aralık (range) bilgisi gerekiyor. Bu konu geçende gündeme gelince henüz yayınlamadığım ve ezberden kullanılacak olan bir ek yaptım:
import std.stdio;
import std.algorithm;
 
void main() {
    int[] array = [ 10, 42, 20, 30, 42, 40 ];
    array = array.remove!(a => a == 42);
    writeln(array);
}
Orada remove satırında tekrar array'e atamak önemli...

Senin kodda CompareToStrings'in ismine takıldım. To yerine Two demek istemiş olabilir misin?

bu range'in posizyonu sonradan öğrenebilirmiyim yine index kullanmadan

Sanırım bu durumda maxElement'i ve onun bir örneğinde geçen enumerate'i kullanabilirsin:

  https://dlang.org/library/std/algorithm/searching/max_elem…

Ali
kerdemdemir #3
Üye Eyl 2013 tarihinden beri · 109 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Abi hakikaten ararken "=~" diye bakmış olabilirim. Birde appender diye bir sınıf vardı galiba veya onun gibi bir şey. Aklımda veri yapılarına birşey eklemek zor diye kalmış. Appender daha çok output rangeler ile ilgiliydi sanırım. Ben kitabın o kısmını bir daha okuyayım en iyisi.

Evet bu ara  "int CompareToStrings ( dstring first, dstring second )" derken "Two" demek istemiştim.
Ben burda paylaştığım için türkçe isimler kullanmaya çalışıyorum fakat o kadar çürümüşümki Türkçe konusunda fonksiyonların ismini ingilizce vermişim.

Şu enumarate e bakıyım şimdi.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4481 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Appender çok basit. Daha etkin bir yöntemle ara bellek kullandığından bir şeyler ekleyerek dizi oluştururken daha hızlı:
import std.stdio;
import std.array;
 
void main() {
    auto a = appender!(int[]);
    foreach (i; 0 .. 10) {
        a ~= i;
    }
    writeln(a.data);
}
Ali
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1908 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Herkese merhaba,

Basit şeyleri seviyorum; her ne kadar basit olsun diye çabalarken biraz karmaşık işlerle uğraşsak da :D

Şurada bir kod (BitSearch) var ve biz bunu vakti zamanında forumda geliştirmiştik. Özel bir kütüphaneye ihtiyaç duymadan bitler üzerinde verinin pozisyonunu bulup değiştirebiliyor. Arama bölümü şöyle:
        data_t find(data_t xBit) {
            data_t xHead, xMask, x, xSay = xBit;
            
            for (x = 0; x <= bl; ++x, xSay >>= 1) if (xSay == 0) {
                xMask = mask(0, 0, x);
                for (auto bs = 0; bs < (xData.length * bl); ++bs, xHead <<= 1) {
                    if ((xData[bs / bl] & (lb >> bs % bl)) != 0) xHead |= 1;
                    xHead &= xMask;
                    if (xHead == xBit) return cast(data_t)(bs - x + 1);
                }
            }     
            return 0// not found!
        }
Tamamen maskeleme üzerine çalışıyor ve basit bir kaskat döngü içinde her şey olup bitiyor. Basit yani, ama sözlerimin başında dediğim gibi karmaşık gelebilir. Biraz dijital elektronik bilgisi gerektiriyor. Dilersen, yapıyı 64 bit kurmak yerine konsol ekran daha sıkışık sonuçları gösterecek şekilde*  inşaa edebilirsin.

* Kod Satırı:
bitDerle.BS!(uint) bit;
Şu an için kodu geliştirecek çok vaktim yok ama pekala bu çekirdek kullanılarak (3. bir döngü ile) ve veriler de azalan uzunlukta aranarak benzeyen pozisyon bulunabilir. Ancak aradığınız şeyi veri yapılarını (örneğin kodda ulong) birleştirerek tek bir veri bütünü gibi arar!

O yüzden bitSearch'ü belki byteSearch mantığına çevirmelisin. Tıpkı biz insanlar, yazı okurken harf harf değilde gözlermizin cümleler üzerinde atlayarak gezinmesi gibi. Dediğim gibi basit güzeldir!

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2017-07-10, 20:49.
kerdemdemir #6
Üye Eyl 2013 tarihinden beri · 109 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih Hocam cevabın için teşekkür ederim.

Daha çok yazmamız gerekiyor birbirimize foruma renk gelir valla.
Integer-bit, String-char benzetmen gerçekten hoşuma gitti farklı gözüksede aynı şekilde kullanılabilir algoritma zaten jenerik programlama bunun için değil mi? Vaktim olursa mutlaka deniyeceğim.

Ne yazık ki, for döngüleri bana karışık geliyorlar içlerinde kayboluyorum onların.

Ama dediğim gibi deneyeceğim  fırsat bulduğumda o fonksiyonu şablonlu hale cevirmeye.

Saygılarımla
Erdem
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-09-26, 07:41:53 (UTC -07:00)