Forum: D Programlama Dili RSS
Küme işlemleri
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Küme işlemleri
std.algorithm'da aşağıdaki küme işlevleri var. Doğal olarak her tür aralıkla, örneğin dizilerle kullanılabiliyorlar. Parametre olarak iki aralık alıyorlar. Bu aralıkların sıralanmış olmaları şart.

setDifference: birinci aralıkta olan ama ikincide olmayan elemanları veriyor (fark)

setIntersection: her ikisinde de olan elemanları veriyor (kesişim)

setSymmetricDifference: yalnızca birisinde bulunan elemanları veriyor (simetrik fark)

setUnion: iki dizideki bütün elemanları veriyor (birleşim)

Bu işlevlerin dönüş türleri ağıza alınamayacak kadar karmaşık. :) Örneğin setDifference'ın dönüş türü SetDifference isminde bir yapı şablonu. Onun için ya auto ile kullanmalı, ya da doğrudan aralık bekleyen başka bir işleve göndermeli...

Küçük örnek:

import std.stdio;
import std.algorithm;
 
void main()
{
    writeln(setIntersection([ 0, 1, 5, 7, 10], [ 1, 2, 10 ]));
}

Çıktısı iki aralıkta da bulunan elemanları içeriyor:

[1, 10]

Hepsini deneyen bir de gereksizce uzun :) bir program yazdım:

import std.stdio;
import std.algorithm;
import std.random;
import std.conv;
import std.algorithm;
import std.string;
 
immutable sayı_sınırı = 10;
 
int[] sıralı_sayılar()
{
    int[] sonuç;
 
    foreach (sayı; 0 .. sayı_sınırı) {
        // %75 olasılıkla ekle; %25 olasılıkla atla
        if (uniform(0, 4) > 0) {
            sonuç ~= sayı;
        }
    }
 
    return sonuç;
}
 
void boşluklu_göster(Aralık)(const dchar[] isim, Aralık sayılar)
{
    string isim_düzeni = "\n%25s: ";
    string sayı_düzeni = "%3s";
 
    writef(isim_düzeni, isim);
 
    // Verilen aralıktaki sayıların yerini boş gösterir
    void boş_göster(int baş, int son)
    {
        foreach (ara_sayı; baş .. son) {
            writef(sayı_düzeni, "-");    // boş anlamında "-"
        }
    }
 
    int boş_baş = 0;    // boş gösterilecek sayıların başı
 
    foreach (sayı; sayılar) {
        boş_göster(boş_baş, sayı);
        boş_baş = sayı + 1;
        writef(sayı_düzeni, sayı);
    }
 
    // Dizide bulunmayan sondaki sayıları boş gösterelim
    boş_göster(boş_baş, sayı_sınırı);
}
 
// İşlevin isminin parametre listesinden önceki kısmını döndürür
dstring işlev_ismi(alias işlev)()
{
    string tam_isim = işlev.stringof;
    auto parametre_listesi = std.algorithm.find(tam_isim, '(');
    return dtext(tam_isim[0 .. $ - parametre_listesi.length]);
}
 
void işlem(alias işlev)(const int[] a, const int[] b)
{
    boşluklu_göster("birinci dizi", a);
    boşluklu_göster("ikinci dizi", b);
 
    auto sonuç = işlev(a, b);
    boşluklu_göster(işlev_ismi!işlev, sonuç);
 
    writeln();
}
 
void main()
{
    const int[] a = sıralı_sayılar();
    const int[] b = sıralı_sayılar();
 
    // Birincide olan ama ikincide olmayan elemanlar
    işlem!setDifference(a, b);
 
    // Her ikisinde de olan elemanlar
    işlem!setIntersection(a, b);
 
    // Yalnızca birisinde bulunan elemanlar
    işlem!setSymmetricDifference(a, b);
 
    // İki dizideki bütün elemanlar
    işlem!setUnion(a, b);
}

a ve b dizilerini rastgele seçiyor. Örnek çıktı:

             birinci dizi:   0  -  2  3  -  5  -  7  8  9
              ikinci dizi:   0  1  2  3  4  5  6  -  8  9
            setDifference:   -  -  -  -  -  -  -  7  -  -

             birinci dizi:   0  -  2  3  -  5  -  7  8  9
              ikinci dizi:   0  1  2  3  4  5  6  -  8  9
          setIntersection:   0  -  2  3  -  5  -  -  8  9

             birinci dizi:   0  -  2  3  -  5  -  7  8  9
              ikinci dizi:   0  1  2  3  4  5  6  -  8  9
   setSymmetricDifference:   -  1  -  -  4  -  6  7  -  -

             birinci dizi:   0  -  2  3  -  5  -  7  8  9
              ikinci dizi:   0  1  2  3  4  5  6  -  8  9
                 setUnion:   0  0  1  2  2  3  3  4  5  5  6  7  8  8  9  9


Ali
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-11-21, 19:23:17 (UTC -08:00)