July 17, 2012

Ne zaman aralıkları bırakıp eşikler (tolerance) üzerinde gezinmeye başladık anlam veremedim...

Bunu şu yüzden söyledim; Ali'nin sözlerinde bir şeyi taşıracak bir imaya rastlamadığım halde Zafer niye böyle düşündü acaba? Bence her hafta bir kerede olsa başımıza gelen kötü günümüzde olma hadisesidir. Yani töleransın bu kadar aşağıda olma meselesi olmalı. Yoksa ben zannetmiyorum ki böyle bir gerilim olsun...

Zafer yazılanları tekrar okursa imadan çok mantık-veri ilişkisi dolu cümlelerle karşılaşacak. Ha keza Ali hocam yanlış anlaşılma ihtimalinden dolayı özür dilemiş ki biz onun küçükleri olarak bilmem ki kızılcak bir şey yok bea Zafer...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 17, 2012

Alıntı (Kadir Can):

>

Yine yanlış çıkıyor @Salih;
Sanırım find() ilk doğrudan sonra kontrol yapmıyor, 3 de asal olduğu için 3'ten büyük bütün tek sayıları gösteriyor.
filter() kullanırsak doğru sonucu veriyor.

Teşekkürler Salih ve Kadir Can: Evet, filter()'ı düşünüp find() yazmışım.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 17, 2012

Alıntı (zafer):

>

Alıntı (acehreli):

>

Aralıkların bir yararı, elemanlarını herhangi bir Phobos algoritması ile kullanabiliyor olmamız.

Ali burada tam olarak anlatmak istediğin nedir? Herhangi bir Phobos algoritmasından kasıt nedir? Bu örmekle ilişkili bir örnek vermen mümkün mü?

Elemanlarına nasıl erişildiğini soyutlayan aralıklar yazıyoruz. Örneğin tekSayılarKümesi aralığı bir sonraki elemana +=2 işlemi ile ilerliyor. Biz bunu bilmiyoruz.

Ek olarak, aralıkların bu soyutluklarından başka hiçbir şey bilmeleri gerekmeyen algoritmalar yazabiliyoruz. Örneğin find() ve filter() yalnızca empty(), front(), ve popFront() ile yetiniyorlar.

Böylece çok sayıda algoritmayı çok sayıda topluluk türü ile kullanabiliyoruz. Örneğin Salih'in tek yaptığı InputRange aralığı arayüzünü sunmak olduğu için tekSayılarKümesi aralığı InputRange ile işleyen bütün algoritmalarla kullanılabiliyor.

Alıntı:

>

Alıntı (acehreli):

>

Ve o açıdan bakınca aslında asal_Mı()'nın bu aralığın bir işlevi değil, serbest bir işlev olması daha yararlı olur.

Anlamak için soruyorum, tekSayılarKümesi(T) sınıfını sadece bir aralık yapısı olarak mı görüyorsun? Yani asal_Mı() metodunu dışarı alınca sınıfın egemenliğinin dışında bırakıyorsun

Sınıfın egemenliğinde olan işlemleri sınıfta bırakıyoruz ama. Dikkat edersen aralığın boşluğu kavramı 'xSay == T.max' işlemi ile belirli ve bir sonraki elemana geçmek için 'xSay += 2' yapılıyor.

Yani sınıf bütün üyelerine egemen. (Tabii aslında böyle küçük örneklerde private gibi erişim haklarını gözardı ediyoruz. Üyenin private olması iyi olur.)

Alıntı:

>

yanı bir çok sınıf özelliğini bu metot üzerinde kullanılamaz hale getiriyorsun.

Açıklar mısın? Çünkü söylediğinin karşıtı olan bir örneği zaten yukarıda gösterdik: asal_Mı() işlevin sınıfın dışına aldığımız zaman hiçbir işlevsellik kaybetmedik.

(Aslında 'asallar' üyesinden kurtulduğumuz için artık şu sorunun yanıtını veremiyoruz: "Acaba asal_Mı() çağrıldığında kaç kere asal çıktı." Pek de yararlı bir bilgi değil çünkü o andaki asal sayının üzerinde sonsuz kere çağırabiliriz.)

Şimdi Salih'in tekrar içeride tanımladığı asalsaYaz() işlevine bakalım: Ona verdiğimiz ve bu aralıkla doğrudan ilgisi olmayan bir sayının asal olması durumunda o sayıyı standart çıkışa yazdırıyor.

Peki standart çıkışa değil de herhangi başka FILE'a yazdıran işlev gerektiğinde ne yapacağız? Bu sınıfa bir de FILE alan bir asalsaYaz() mı ekleyeceğiz? Veya asalsaVe1000ile10000ArasındaysaYaz() mı?

Görüyor musun? Algoritmaların sayısı sonsuz.

Alıntı:

>

Örneğin sarma, miras alma, aşırı yükleme gibi birçok olanak devre dışı kalıyor diye düşünüyorum.

Bunu daha önce de konuştuk. Bir şeyden şüphelendiğin açık ama bize anlamamız için ek bilgi vermiyorsun. Çünkü:

  • Yukarıda değindiğimiz ve yalnızca örnek olduğu için gözardı edilmiş olan 'private'ı eklersek sarma devre dışı kalmıyor. Veya: sarmanın devre dışı kalmasında bunun bir aralık olmasının bir etkisi yok.

  • Miras alma devre dışı kalmıyor. İsteyen bu sınıftan türetebilir veya bu sınıfı başka sınıftan türetebilir. (?)

  • Aşırı yükleme devre dışı kalmıyor. Ne düşündüğünü gerçekten anlamıyorum.

Benim anladığım o. Biraz daha açıklarsan ve örnekler gösterirsen belki anlaşabileceğimiz bir nokta buluruz.

Alıntı:

>

Ancak seninde belirttiğin gibi haklı sebeblerin var. Ben bunları anlamaya çalışıyorum. Yardımcı olursan tabi ;)

Bu noktada bizim senden bilgiye ihtiyacımız var. Eğer bize bir örnekle örneğin sarmanın nasıl ihlal edildiğini gösterir misin.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 17, 2012

Kendimi doğru ifade edememişim. Özür dilerim.

Alıntı:

>

Konu aralıklar ve sarma olayı ise bunu o konudada belirttim ben aralıkların bu yönden sorunlu olduğunu düşünüyorum.

Benim sorunum şu: "Düşünüyorum" yeterli gelmiyor ve neden öyle düşündüğünü anlamaya çalışıyorum.

Alıntı:

>

Bunuda açık bir şekilde söylüyorum. Bu benim fikrim kimseninde kabul etmesi veya onaylaması gibi bir durum olamaz elbette.

Fikrine çok değer veriyorum ama neden öyle düşündüğünü anlayamıyorum.

Alıntı:

>

Alıntı (acehreli):

>

Miras alma devre dışı kalmıyor. İsteyen bu sınıftan türetebilir veya bu sınıfı başka sınıftan türetebilir. (?)

Sen bir sınıf içinde tanımlamadığın bir metodu o sınıftan miras alarak başka bir sınıfa geçirebiliyorsan zaten bana diyecek bir şey kalmamıştır Ali.

Ne demek istediğini şimdi anlıyorum. Ne yazık ki hiç öyle düşünmemişim. Ben miras alma düzeneğinin kendisine takılmışım. Haklısın: asal_Mı() işlevi sanal olsa, yani alt sınıflar onun davranışını kendilerine göre değiştirebilseler o zaman sınıfın üyesi olmalı.

Alıntı:

>

bir metodu sınıf dışına çıkarınca artık o sınıfın üyesi olmaz

Doğru. Ama dışarı almanın daha iyi olduğu kabul edilir. Eğer bir metodu sınıfın dışına çıkarırsak o metodu tek başına veya başka türlerle de birlikte kullanabiliriz. Ayrıca sınıf küçülmüş ve basitleşmiş de olur.

Tabii eğer o metod gerçekten o tür ile doğrudan ilgiliyse veya hız konusunda şartsa üye olması yeğlenir. Bunun bir örneği olarak bir bağlı listenin length() işlevini verebiliriz. length() işlevi olması şart değildir çünkü uzunluğunu bulmak için baştan sona doğru ilerlemek gerekir ama tabii ki yavaş kalabilir. Üye işlev olsa içerideki bir üyenin değerini döndürür ve çok hızlıdır.

Alıntı:

>

Sarma ihlali ile ilgili bir metin yadığımı hiç hatırlamıyorum.

Sen "sarma, miras alma, aşırı yükleme gibi birçok olanak devre dışı kalıyor diye düşünüyorum" yazınca ben en çok sarma sözcüğüne takılmışım; kusura bakma... :/

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 17, 2012

Dikkatlerinizi bir noktaya daha doğrusu parantezlerin bulunduğu yere çekmeliyim! Hani okuldaki bazı matematik hocalarımız, kullandığımız notasyona göre parantez ve işlem sıralarının önemi üzerine defalarca ve defalarca durur ya! İşte bu konuda belki en az o kadar önemli ve hatta Zafer'in, TÜTEV/Ankara sunumunda bahsettiği programcı hatalarının hayati önem arz edeceği bir durum da olabilirdi...:)
Alıntı (acehreli:1342478866):

>
> void main() {
>     auto tekSayılar = new tekSayılarKümesi!uint;
>
>     writeln(find!asal_Mı(tekSayılar).take(10));
> }
> ```

> Son satırda tek sayı elemanların asal olanlarının 'ilk 10 tanesini' elde ediyoruz.
Tamam, find/filter benzerliğini ve karışıklığını giderdik. Hatta üzerinde durmaya bile gerek yokmuş çünkü insanlık hali bu. Ancak doğru sonucu tutturmak için parantezlerin kullanımındaki incelik dikkatimi çekti. Böylece ilk hata başka bir hatanın düzeltilmesine vesile oldu. Çok söze gerek yok, aşağıda kodlarda her şeyi anlatıyorum:

void main() {
int xİlk = 100, xSon = 10; /* Dikkat anlam karmaşası !!!
Aslında xSon 119'u ifade eder...:) */
auto tekSayılar = new tekSayılarKümesi!(typeof(xİlk))(xİlk);

// Sadece tek sayılar kümesinden 10 adet (xSon kadar) sayı çıkarır:
tekSayılar.take(xSon).writeln;
tekSayılar.set(xİlk);

// Tek sayılar kümesinden 10 adet (xİlk'den itibaren) asal sayı çıkarır:
filter!asal_Mı(tekSayılar).take(xSon).writeln;
tekSayılar.set(xİlk);

// Tek sayılar kümesinden 5 adet (xSon'nun gösterdiği yere kadar) asalları çıkarır:
filter!asal_Mı(tekSayılar.take(xSon)).writeln;
tekSayılar.set(xİlk);
/* Yukarıdaki bu ifadeler,
xİlk değerinden itibaren
xSon değeriyle ilişkili
olarak sayılar çıkarır...
*/
}


**Çıktısı:**
'[101, 103, 105, 107, 109, 111, 113, 115, 117, 119]
[101, 103, 107, 109, 113, 127, 131, 137, 139, 149]
[101, 103, 107, 109, 113]'

Ayrıca eklemeliyim; 'asal_Mı()' işlevini filter! ifadesinden sonra parantez içine almak veya almamakta serbestiz. Çünkü derleme hatası dahil hiç bir fark olmuyor. Bu arada **set** diye yeni bir üye işlev ekledim. Bununla birlikte sınıfın son hali ve ihtiyaç duyulan diğer sınıflar ile birlikte şu şekildedir:

import std.algorithm, std.range, std.stdio;

class tekSayılarKümesi(T) {
T xSay;

this (T başlangıç = 1) {
set(başlangıç);
}
void set(T set) @property {
xSay = set;
if(set%2 == 0) xSay++;
}
bool empty() const @property {
return (xSay == T.max);
}
T front() const @property {
return xSay;
}
void popFront() {
xSay += 2;
}
}


Sevgiyle kalın...:)

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
July 17, 2012

Yazışmanın azizliği. :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 17, 2012

Evet bu şekilde daha temiz görünüyor, teşekkürler...

Son olarak benim bir düzeltme daha yapmam gerekiyor...:)

'asal_Mı()' işlevi tekSayılarKümesi sınıfında yer aldığı için o sınıfa özeldi. Dolayısıyla çift sayılar kümesinde hatalı sonuç döndürecektir. Eğer bu işlevi herhangi bir kod parçacığında kullanacaksanız şu hali daha güzel:

void main() {
   bool asal_Mı(T)(T p) {
       if(p < 2) return false;
       if(p != 2 && p % 2 == 0) return false;
       for(T n = 3; n * n <= p; n+=2) {
           if(p % n == 0) return false;
       }
       return true;
   }

   auto notPrime = [ -1, 0, 1, 4, 6, 117, 700];
   foreach(i; notPrime) assert(asal_Mı(i) == false);

   auto isPrime = [ 2, 3, 5, 777777722155555333];
   foreach(i; isPrime) assert(asal_Mı(i) == true);
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 18, 2012

Peki biraz da palindromlar (artık sözle dilim sürçmeden telafuz edebiliyorum...:)) üzerinde gezelim. Böylece aralıkları yapı içinde tanımlamadan bir döngü içine nasıl gömeceğimizi göreceğiz. Şu güzel işleve bakar mısınız: (!)

bool palindrom_Mu(T)(T x) {
   string p = std.conv.to!string(x);

   for (; !p.empty; p.popFront(), p.empty || p.popBack())
   if (p.front != p.back) return false;

   return true;
}

Sanırım bu string yapısının (öyle ya bu aslında bir dizi!) özelliği. Yani dil içerisinde kaynamış ve string türüne entegre edilmiş bir aralık ki bunu ilk gördüğümde ben de anlam verememiştim. Zaten yabancı forumda ustalardan birinden naklettim/çaldım...:)

Peki, şimdi de hem asal hem de palindrom olan sayıları ekrana yazmak istesek nasıl bir filter kıstası belirleyeceğiz? Bunu bulmak benim için biraz zor oldu ama hemen cevabı vereceğim. Sonra cevabı bulmamda yardımcı olan aşamaları tersten sıralayacağım. Böylece burada lambda ('=>') şettirmesini daha iyi anlayacağız:
''
'filter'!('(a)' '=>' asal_Mı'(a)' '&&' palindrom_Mu'(a)')(tekSayılar.'take'(xSon)).writeln;
''
Yukarıdaki en basit lambda şettirmelerinden. Olay basit, lambdanın solundaki ifadeler (evet, virgülle ayrılarak birden fazla da olabilirdi!) sağdakine geçiyorlar ve oradaki ifade işlendikten sonra sanki sağında gizli bir return varmış gibi geri dönüyor. Hepsi bu kadar...
''
'bool' function('uint') asalpalindrom = '(a)' '=>' asal_Mı'(a)' '&&'
palindrom_Mu'(a)';
''
Temel olarak diğerinden bir farkı yok. Belki tek farkı bu işlevi başka yerde de kullanabilecek olmamız olabilirdi.

'''bool' asalpalindrom(T)(T 'a)' {
return asal_Mı'(a)' '&&' palindrom_Mu'(a)';
}''

Son olarak naklettiğim benim ilk denediğim. Burada işlevin diğerlerinden bir farkı da Type(Tür) şablonu kullanabilmiş olmam. Açıkçası diğerlerinde bunu uyarlamayı başaramadım.

Sevgiler, saygılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 17, 2012

Parantezler önemli. :)

Alıntı (Salih Dinçer):

>
>     auto tekSayılar = new tekSayılarKümesi!(typeof(xİlk))(xİlk);
> ```


typeof kullanman iyi olmuş çünkü ileride xİlk'in türü değiştirilse bile doğru çalışır. Ancak, o satır daha temiz hale getirilebilir. Orada 'typeof(xİlk)' kullanmamızın nedeni, yapı ve sınıf şablonlarında tür çıkarsaması olmaması.

Bu *kısıtlama* geleneksel olarak bir işlev şablonuyla aşılır. Türün ismini büyük harfle başlatalım ve o türden nesne döndüren bir işlev şablonu yazalım. Şimdi kod daha temiz olur:


// Sınıfın baş harfi büyük
class TekSayılarKümesi(T) {
// ...
}

// O sınıftan nesne döndüren bir kolaylık işlevi
TekSayılarKümesi!T tekSayılarKümesi(T...)(T parametreler)
{
return new TekSayılarKümesi!T(parametreler);
}

// ...

// Artık program içindeki kullanımları çok daha temiz olur
auto tekSayılar = tekSayılarKümesi(xİlk);



Alıntı:
> filter! ifadesinden sonra parantez içine almak veya almamakta serbestiz. Çünkü derleme hatası dahil hiç bir fark olmuyor.

O olanağı çok seviyorum. Şablon listesinde tek anahtar sözcük (veya "atom"?) bulunduğunda parantezsiz yazılıyor ve 'to!string(42)'de olduğu gibi güzel okunuyor.

Ali

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
July 18, 2012

Alıntı (Salih Dinçer):

>

Son olarak naklettiğim benim ilk denediğim. Burada işlevin diğerlerinden bir farkı da Type(Tür) şablonu kullanabilmiş olmam. Açıkçası diğerlerinde bunu uyarlamayı başaramadım.

O sonuncusu bir işlev şablonu; herhangi bir tür için kullanılmaya hazır olduğu için çok yararlı.

Düşününce, diğerlerinde şablon kullanılamıyor olması şaşırtıcı gelmiyor çünkü hemen orada tanımlanan isimsiz bir işlevin başka türler için çağrılabilmesi zaten mümkün değil. Yani şablon olsa zaten yalnızca a'ya karşılık gelen ve elimizde bulunan tür ile kullanılabilir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

1 2
Next ›   Last »