Jump to page: 1 2
Thread overview
Aralıklar Üzerinde Gezinmek
Jul 16, 2012
Salih Dinçer
Jul 16, 2012
Salih Dinçer
Jul 16, 2012
Salih Dinçer
Jul 16, 2012
zafer
Jul 16, 2012
Salih Dinçer
Jul 16, 2012
Kadir Can
Jul 17, 2012
Salih Dinçer
Jul 17, 2012
zafer
Jul 17, 2012
erdem
Jul 17, 2012
Salih Dinçer
Jul 17, 2012
Salih Dinçer
Jul 17, 2012
Salih Dinçer
Jul 18, 2012
Salih Dinçer
July 16, 2012

Bugüne kadar Aralıklar (http://ddili.org/ders/d/araliklar.html) üzerinde özel bir çalışma tertiplememiştim. Yani, ne lüzumu var şimdi canım, dedim kendi kendime; altı üstü belli bir sınır çerçevesinde tekrar eden elemanlar, hepsi o kadar...:)

Pekala dizilerle de yapabileceğimiz şeyler gibiydi; bu aralıklar benim içim. Ancak 'foreach()' ile uyumlu çalışması gerçekten hoş. Beraberinde koşut işlemler (parallelization) sınıfı std.parallelism ile işbirliği yapması da ilgi çekici. Özetle basit gibi görünse de çok işe yarar olduğu tartışılmaz.

Örneğin aşağıda, tek sayılar kümesi içinde asal sayıları tarayan bir kod görülmekte. Elbette bunu iç içe basit bir döngü ile yapabilirdik. Ancak sahip olduğu esnekliği düşününce, bundan sonra aralıkların bir çok yazdığım programda eksik olmayacağını söyleyebilirim:

import std.stdio;

class tekSayılarKümesi(T) {
 T xSay;
 size_t asallar = 0;

 this (T başlangıç = 3) {
   xSay = başlangıç;
   if(başlangıç%2 == 0) xSay++;
 }

 bool empty() const {
   return xSay == T.max;
 }

 T front() const {
   return xSay;
 }

 void popFront() {
   xSay += 2;
 }

 void asal_Mı(T p) {
   bool asal = true;
   for(T n = 3; n * n <= p; n+=2) {
     if(p % n == 0) {
       asal = false;
       break;
     }
   }
   if(asal) {
     asallar++;
     if(asallar%100_000 == 0) p.write();
     //p.write("\t");
   }
   "\r".write;
 }
}
void main() {
   auto tekSayılar = new tekSayılarKümesi!uint;

   foreach(i; tekSayılar) tekSayılar.asal_Mı(i);
   writeln;
}

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

July 16, 2012

Bu daha güzel...:)

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

July 16, 2012

Gözlerimi güneşli bir İstanbul sabahına açtığım sırada bir iki düzenleme de ben yaptım; henüz yüzümü bile yıkamamışken...:)

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

class tekSayılarKümesi(T) {
 T xSay;
 size_t asallar = 0;

 this (T başlangıç = 1) {
   xSay = başlangıç;
   if(başlangıç%2 == 0) xSay++;
 }

 bool empty() const @property {
   return (xSay == T.max);
 }

 T front() const @property {
   return xSay;
 }

 void popFront() {
   xSay += 2;
 }

 void asalsaYaz(T p) {	// toString Benzeri
   if(asal_Mı(p)) {
     asallar++;
     //if(asallar%2 == 0) p.write();/*
     p.write("\t");//*/
   }
   //"\r".write;
 }
}

bool asal_Mı(T)(T p) {
   bool asal = p > 1 ? true : false;
   for(T n = 3; n * n <= p; n+=2) {
       if(p % n == 0) {
           asal = false;
           break;
       }
   }
   return asal;
}

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

   foreach(i; tekSayılar) tekSayılar.asalsaYaz(i);
   writeln;
}/* Çıktısı:
[3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
23	29	31	37	41	43	47	53	59	61	67	71	73	79	83	89	97
101	103	107	109	113	127	131	137	139	149	151	157	163	167	173	179	181
191	193	197	199	211	223	227	229	233	239	241	251
*/

Alıntı:

>
> void main() {
>     ulong xSınır;            // Tembellik işte, insan tek yerde
>     xSınır = xSınır.max-100; // tür değişimi yapmak istiyor...:)
>
>     auto tekSayılar = new tekSayılarKümesi!(typeof(xSınır))(xSınır);
>
>     find!asal_Mı(tekSayılar).take(10).writeln;
>     foreach(i; tekSayılar) tekSayılar.asalsaYaz(i);
>
>     writeln;
> }
> ```

>
Hemen yukarıda alıntıladığım ise konudan bağımsız, tembellik mi desem yoksa iyi programcı olmanın ön şartı (iyi programcı tembel olandır) mı desem bilemiyorum ('typeof' ve xSınır değişkenine dikkat!). Amacım sadece türün sınırlarındaki asalları listeletmekti ama ulong sonucunu henüz alamadım. Demek ki bilgisayarlar hala çok yavaş. Tabi algoritmanın basitliği buna doğrudan etkili...:)

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

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ü?

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 yanı bir çok sınıf özelliğini bu metot üzerinde kullanılamaz hale getiriyorsun. Örneğin sarma, miras alma, aşırı yükleme gibi birçok olanak devre dışı kalıyor diye düşünüyorum.

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

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

July 17, 2012

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.

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

July 17, 2012

Son verdiğim program çıktısın da bir şey dikkatinizi çekti mi?

/* Çıktısı:
[3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
23    29    31    37    41    43    47...

İlk satırda 9, 15 ve 21 asal say değil...:)

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

July 16, 2012

Çok güzel! :)

Aralıkların bir yararı, elemanlarını herhangi bir Phobos algoritması ile kullanabiliyor olmamız. 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.

Çünkü o zaman asal_Mı()'yı algoritmalarla da kullanabiliriz. Böylece aralık da çok daha basitleşir: Artık tek işi tek sayılar üretmektir.

  • @property ekliyorum

  • asal_Mı()'yı dışarıya çıkartıyorum; artık bool döndürüyor

import std.stdio;
import std.algorithm;

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

   this (T başlangıç = 3) {
       xSay = başlangıç;
       if(başlangıç%2 == 0) xSay++;
   }

   bool empty() const @property {
       return xSay == T.max;
   }

   T front() const @property {
       return xSay;
   }

   void popFront() {
       xSay += 2;
   }
}

bool asal_Mı(T)(T p) {
   bool asal = true;
   for(T n = 3; n * n <= p; n+=2) {
       if(p % n == 0) {
           asal = false;
           break;
       }
   }

   return asal;
}

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.

Ali

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

July 17, 2012

Tamam, şöyle olacakmış:

find!(asal_Mı)(tekSayılar.take(10)).writeln;

Ben de şuradan (http://dlang.org/phobos/std_algorithm.html#find) öğrendim:
Alıntı:

>

Range 'find'(alias pred, Range)(Range haystack);

Advances the input range haystack by calling haystack.popFront until either pred(haystack.front), or haystack.empty. Performs Ο(haystack.length) evaluations of pred. See also STL's find_if. (http://sgi.com/tech/stl/find_if.html)

To 'find' the last element of a bidirectional haystack satisfying pred, call 'find'!(pred)(retro(haystack)). See also std.range.retro (http://dlang.org/phobos/std_range.html#retro).

**Example:**
>     auto arr = [ 1, 2, 3, 4, 1 ];
>     assert(find!("a > 2")(arr) == [ 3, 4, 1 ]);
>
>     // with predicate alias
>     bool pred(int x) { return x + 1 > 1.5; }
>     assert(find!(pred)(arr) == arr);
> ```


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

Ali, bizim amacımız üzüm yemek, bağcıyı dövmek değil. Ben bilmediğim konuda soru sorarım, anlamadığım konudu soru sorarım. İsteyen cevap yazar, isteyen yazmadan geçer gider, sorun etmem. Ancak bir şeyler ima eden yazıları hiç sevmem, bir sorunu olan bunu bana direk söyleyebilir.

Alıntı (acehreli):

>

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

Eğer sen hala o konuda kaldıysan vay halimize. Bir şeylerden şüphelenmiyorum ama şüphelensem bile size niye ek bilgi vereyim ne alaka ? Konu aralıklar ve sarma olayı ise bunu o konudada belirttim ben aralıkların bu yönden sorunlu olduğunu düşünüyorum. Bunuda açık bir şekilde söylüyorum. Bu benim fikrim kimseninde kabul etmesi veya onaylaması gibi bir durum olamaz elbette.

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.

Alıntı (acehreli):

>

Eğer bize bir örnekle örneğin sarmanın nasıl ihlal edildiğini gösterir misin.

Bu cümleyi okuyana kadar hala sanırım benim sorumu tam anlamadı diye düşünüyordum ama bunu okuyunca anladım ki sen hala bir yerlerde takılmış kalmışsın Ali. Ben sadece bir metodu sınıf dışına çıkarınca artık o sınıfın üyesi olmaz ve sınıf üyesi olarak mevcut olan bir takım özelliklerini yitirir demiştim. Sarma ihlali ile ilgili bir metin yadığımı hiç hatırlamıyorum.

Ancak görüyorum ki, bazı şeyler düşündüğümden çok daha farklıymış. Anlaşılan farklı fikirde olmak cevaplarına kurnazca örnekler verilerek fikirlerini anlamsız kılmaya çalışmak, sorularında art niyet aranmakmış.

Son olarak Ali benimle ilgili bir sorunun varsa bunu bana e-posta ile iletebilirdin. Burada forumdaki arkadaşlarada rahatsızlık vermezdik. Bundan sonrası ancak laf yarışı olacağı için bir daha yazmayacağım. Bu mesajıda Ali'nin sorularına yanıt olması için ekliyorum. Salih'den konusunu böyle tatsız bir olayla dağıttığım içinde kendi adıma özür diliyorum.

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

July 17, 2012

Ben bu son mesajları okuyunca şaşırdım açıkçası :rolleyes:

Ben Ali'yi 2003-2004 yıllarından beri haber gruplarından, çeşitli forumlarda yaptığımız sohbetlerden tanıyorum. Örneğin C Dili grubunda, ceviz.net'te şimdi kapanan fazlamesai forumlarında teknik konularda hararetli tartışmalar olurdu.

Hatta sanırım fazlamesai gibi siteler bu tartışmalardan övgüyle bahsediyorlardı :-)

O günden bu güne Ali'nin hiç kimseye en ufak bir kırıcı sözünü bilmiyorum. Hatta benim gibi kafasız bir adamın sonu gelmez, bitmek tükenmez soruları karşısında aynı konuyu tekrar tekrar anlattı. Herkes bilgisini saklayıp, Türkçe forumlara girmeye tenezzül bile etmezken, Ali C++ ile ilgili sorulara her biri ders niteliğinde cevaplar yazdı.

Konuyla ilgili mesajları okuduğumda da gayet teknik konular konuşulduğunu görüyorum.

O yüzden Zafercim son mesajları yanlış yorumlamış olabilirmisin acaba :huh:

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

« First   ‹ Prev
1 2