Jump to page: 1 2
Thread overview
July 02, 2012

Merhaba,

Dilimler konusunda çok sevdiğim bir Palindrom kodunu (önceden şurada (http://ddili.org/forum/thread/511) da paylaşılmış) örnek cümleler ile birlikte aşağıya nakletmek istiyorum. Başka bir amacım da dilim örneklerini tek başlıkta toplamak için bir girişim veya başlangıç yapmak. Hatta şu Palindrom olayı bir oyuna dönüştürülüp KelimeMatik (http://ddili.org/forum/forum/16) için kullanılabilir, ne dersiniz?

import std.array:replace;
import std.stdio;

bool Palindrom_mu(string p) {
   for(int i = 0; i <p.length/2; i++) {
       if(p[0] != p[$ - 1]) {
           return false;
       }
       p = p[1..$ - 1];
   }
   return true;
}/*
bool Palindrom_mu(string p) {
   for(int i = 0; i < p.length/2; i++) {
       if(p[i] != p[$ - 1 - i]) {
           return false;
       }
   }
   return true;
}//*/

void main() {
   // Aslında aşağıdaki örneklerin hepsi bir Palindrom cümle.
   // Ama "ç" harfi UTF'de bir kaç karakter ile temsil edilmekte.
   // Dilim kullanmazsak bu sorun ortaya çıkmakta.
   string[] örnekler = [ "az ye be beyza",
                         "firar eder arif",
                         "ilaç iç ali",
                         "zam yok koymaz",
                         "zam lokumu yumuk olmaz",
                         "zaman yok oynamaz"
                       ];

   foreach(s; örnekler) {
       s.writeln(replace(s, " ", "").Palindrom_mu ?
                            "<--Bu bir Palindrom" : "(x)");
   }
}
/* Başka örnek sözcükler için:
http://www.ustunalsac.com/lang/tr/oyunlar/palindromlar/palindrom-ornekleri-1
*/

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

July 02, 2012

Ankara'daki etkinlik sonrası Can'dan öğrendim bir başka örneği de nakletmeliyim! Temelde bir 'replace()' işlevi ama çok hoş ve de bu mantık üzerine yapılabilecek şey çok...:)

void main() {
   char[] s1 = "12345".dup;
   char[] s2 = "abcde".dup;

   writeln(s1[1..4], "~", s2[1..4]);

   s2.writeln;
   s2[1..4] = s1[1..4];
   s2.writeln;
} /* Çıktısı:
234~bcd
abcde
a234e
*/

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

July 02, 2012

Polindrom ne bilmediğimiz zamanlarda(ilkokul çağları :-) ) "ey edip adanada pide ye" derdik. Boşlukları katınca dahi polindrom oluyor. Çok güzel bir örnek :-)Alıntı:

>

Ankara'daki etkinlik sonrası Can'dan öğrendim bir başka örneği de nakletmeliyim!
Şİmdi dinamik diziler ve dilimleri iyi anlatamadığımı anladım. Asıl olay bu örnekte yok :-D Asıl olay Alinin çevirdiği makalede var. Makaleyi boşverip örneği biraz incelemek yeterli:

import std.stdio;

void main()
{
   int[] a;             // a bir dilimdir

   a = new int[5];      // en az 5 elemanı bulunan dinamik
                        // bir tamsayı dizisi için yer ayır
                        // ve bana ilk 5 tanesine eriştiren
                        // bir dilim ver.  D'de bütün veriler
                        // ilklenirler; int'lerin ilk
                        // değerleri 0'dır; o yüzden bu
                        // dizide beş tane 0 vardır

   int[] b = a[0..2];   // Bu bir 'dilimleme' işlemidir. b,
                        // a'nın ilk iki elemanına erişim
                        // sağlamaktadır. D'de sınırın sağ
                        // tarafı "açıktır"; bu yüzden a[2]
                        // dilime dahil değildir.

   int[] c = a[$-2..$]; // c, a'nın son iki elemanına erişim
                        // sağlamaktadır; $, dilimleme ve
                        // indeksleme işleminde uzunluk
                        // anlamına gelir

   c[0] = 4;            // bu a[3]'ü de değiştirir
   c[1] = 5;            // bu a[4]'ü de değiştirir

   b[] = c[];           // a[]'nın ilk iki elemanına son iki
                        // elemanının değerlerini (4, 5) atar

   writeln(a);          // "[4, 5, 0, 4, 5]" yazar

   int[5] d;            // d, program yığıtında duran sabit
                        // uzunluklu bir dizidir
   b = d[0..2];         // dilimler sabit uzunluklu dizilere
                        // de erişim sağlayabilirler!
}

Bu örneği üç günde bir bakmak gerek :-P

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

July 02, 2012

Bu örnekler basit ve hoşmuş, öyleyse soru&cevap şeklinde devam ettirelim:

   int[] a;            // Bu bir dilim midir, yoksa dizi midir?
   a = new int[5];     // a, bellekteki 5 adet int değerini gösterir...
   a ~= 5;             // 6. bir eleman eklediğimize göre dizi mi, acaba!
   a.writeln;          // öyle görünüyor ama acele etmeyelim...:)

   auto b = a[$-2..$]; // b, a'nın son iki elamanını gösteriyor ve
   b.writeln;          // bu bir dilimdir!

   a = a[0..0];        // a, birazdan hiç bir elemanı göstermecek!
   a.writeln;          // evet öyle, peki bellekteki son iki eleman gitti mi?
   b.writeln;          // tabii ki hayır, orada ama diğerleri GC'ye emanet...:)

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

July 02, 2012

Alıntı (canalpay):

>

Alıntı:

>
> >     writeln(&a," --- ",&b)      // evet öyle, peki bellekteki son iki eleman gitti mi?
> > ```

> >
> Sayesinde benim anladığım evet gitti. (uzunluklarına da baktım.)b ise a gidince kendini başka bir alana kopyaladı. dilimden dinamik diziye terfi etti. Yanlış anlamışta olabiilrim yalnız :-D
>
Ben farklı düşünüyorum.Son iki eleman yerlerinde duruyorlar.Gitmeleri için onlara erişim olmaması gerekirdi.Oysa b onlara erişim sağlıyor.Yani dört eleman gitti(GC ne zaman gelirse diye hatırlıyorum, değer türlerinde GC hemen devreye giriyordu sanırım.) ama son iki eleman duruyor.
b'nin kendini başka bir alana kopyaladığını sanmıyorum, sonuçta referans türleri de değişkendir, kendi adresleri vardır ama işleri başka değişkenlerin değerlerine erişmektir.Aşağıdaki program bunu doğruluyor:

import std.stdio;
void main()
{
int[] a = new int[5];
auto b = a;
writeln(&a);
writeln(&b);
a = a[0 .. 0];
writeln(&b);
}
/* Çıktı:
18FE60
18FE68
18FE68
*/



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

Bence Ali Beyin yazdığı kodlar yanlış. Çok iyi kodlanmasada doğru sayyılabilecek kodlar:import std.array;

import std.string;
import std.stdio;
bool palindrom_mu(dstring dizgi)
{
   dizgi = strip(dizgi);

   if (dizgi.length < 2) {
       return true;

   } else if (dizgi.front == dizgi.back) {
       dizgi.popFront();
       dizgi.popBack();
       return palindrom_mu(dizgi);

   } else {
       return false;
   }
}

void dene()
{
   dstring[] örnekler = [ "az ye be beyza"d,
                         "firar eder arif"d,
                         "ilaç iç ali"d,
                         "zam yok koymaz"d,
                         "zam lokumu yumuk olmaz"d,
                         "ç"
                       ];

   foreach (örnek; örnekler) { örnek.length.writeln;
       assert(palindrom_mu(örnek),cast(char[])( örnek ~ " palindrom çıkmadı"d));
   }
}

void main()
{dene();}

Ali Beyin kodlarının yanlış olma nedenleri:Alıntı:

>
if (dizgi.length <= 2) {

yani dizgi "al" olsa palindrom mu olacak. Eğer olacaksa ben bilmiliyorum. Zaten palindrom adını buradan duydum ancak mantıken olmamalı. AyrıcaAlıntı:

string[] örnekler = [ "az ye be beyza",
kodlaması yanlış. Çünkü ç ne olursa olsun 2 karakterli sayılıyor. İf işlevinin doğru işlemesi için bir karakter saymalı. bundan dolayı dstring olmalı.(Doğrusu string ilede karakter sayısını doğru alabiliyorduk. Ancak nasıl olduğunu unuttum. Zaten şuanki yönteme doğru ancak iyi olmayan yöntem demeliyim.)

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

July 02, 2012

Alıntı (acehreli):

>

Alıntı (Salih Dinçer):

>
// Ama "ç" harfi UTF'de bir kaç karakter ile temsil edilmekte.

O yüzden en iyisi dizgileri BidirectionalRange olarak kullanmak. Bunun için std.array modülünü eklemek yeterli. Şu kod boşlukları gözardı ediyor
Hocam, tüm olasılıkları denemedim ama dilimde sanki bu sorun yok. Gizlediğim alternatif işlev sıkıntılı gibi görünüyor. Bu arada aralıklar ile ilgili İngilizce forumda şu alternatif örneği buldum da gerçekten sadelikle muhteşem görünüyor:

bool Palindrom_mu(string p) {
   for (; !p.empty; p.popFront(), p.empty || p.popBack())
   {
       if (p.front != p.back) return false;
   }
   return true;
}

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

July 02, 2012

Alıntı:

>
int[] a;            // Bu bir dilim midir, yoksa dizi midir?

dinamik diziAlıntı:

int[] b = new int[5];     // a, bellekteki 5 adet int değerini gösterir...

Dinamik dizi. Şöylede yazabilirdik:

int[] b;  b.length=5;

Biz şimdiden uzunluğu 5 olarak ayarlıyoruz ki şimdiden işletim sistemi bize bellekten uzunluğun 5 olduğunda sığacak iyi bir yer ayarlasın diye. Biraz performans için yani. Ayrıca dizinin içindeki 5 elemanda int.init ile ilklenmiş durumda sonraki örnekte olduğu gibi sonuna ekleme işleci kullanırsak 6. eleman olarak devam edecektir.Alıntı:

>
a ~= 5;             // 6. bir eleman eklediğimize göre dizi mi, acaba!

Hala dinamik diziAlıntı:

auto b = a[$-2..$]; // b, a'nın son iki elamanını gösteriyor ve

çok güzel dilim.Alıntı:

a.writeln;          // evet öyle, peki bellekteki son iki eleman gitti mi?
writeln(&a," --- ",&b)

Sayesinde benim anladığım evet gitti. (uzunluklarına da baktım.)b ise a gidince kendini başka bir alana kopyaladı. dilimden dinamik diziye terfi etti. Yanlış anlamışta olabiilrim yalnız :-D

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

July 02, 2012

Doğru söylüyorsun.(ben bir yerde b dizisine ekleme yapıldığını düşünmüşüm galiba yazarken) **b'nin kendini başka bir yere kopyalaması için **sanırım iki şart var:

  1. **b'ye yeni eleman eklemek ancak **(b a'nın dilimi olduğunu varsayıyorum) b'ye eklenen elemanın a'ya da eklenmesi için yeterli kapasite olmaması. Bu durumda b kendini başka bir yere kopyalıyor.) (çok saçma b'yi başka yere taşıyacağına a'yı taşısa ve b'yi yine yeni taşıdığı alan için dilim yapsa daha tutarlı olmaz mı? Hızdan dolayı mı yapmıyor?)

  2. b dilimi a'nın sonuncu değişkenine erişmiyorsa b'ye yeni eleman eklendiğinde derleyici a için nereye ekleyeceğini bilmiyor ve yine b'yi dilimden dinamik diziye terfi ettirerek başka yere kopyalıyor. Yani b'ye eklenilen eleman a'nın sonuna eklenmiyorsa birbirlerine veda ediyorlar.(Mantıklı.)

Tutarlı ancak kontrol edilmesi zor, ilginç davranışlar?

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

July 02, 2012

Alıntı (Salih Dinçer):

>
// Ama "ç" harfi UTF'de bir kaç karakter ile temsil edilmekte.

O yüzden en iyisi dizgileri BidirectionalRange olarak kullanmak. Bunun için std.array modülünü eklemek yeterli. Şu kod boşlukları gözardı ediyor:

import std.array;
import std.string;

bool palindrom_mu(string dizgi)
{
   dizgi = strip(dizgi);

   if (dizgi.length <= 2) {
       return true;

   } else if (dizgi.front == dizgi.back) {
       dizgi.popFront();
       dizgi.popBack();
       return palindrom_mu(dizgi);

   } else {
       return false;
   }
}

unittest
{
   string[] örnekler = [ "az ye be beyza",
                         "firar eder arif",
                         "ilaç iç ali",
                         "zam yok koymaz",
                         "zam lokumu yumuk olmaz",
                         "zaman yok oynamaz"
                       ];

   foreach (örnek; örnekler) {
       assert(palindrom_mu(örnek), örnek ~ " palindrom çıkmadı");
   }
}

void main()
{}

Ali

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

« First   ‹ Prev
1 2