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
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply