Forum: Ders Arası RSS
Çok işlemli bir reduce() örneği
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ı: Çok işlemli bir reduce() örneği
dlang.org'a gidince rastgele seçildiği söylenen küçük D kodları var:

#!/usr/bin/rdmd
// Computes average line length for standard input.
import std.stdio;
 
void main() {
    ulong lines = 0;
    double sumLength = 0;
    foreach (line; stdin.byLine()) {
        ++lines;
        sumLength += line.length;
    }
    writeln("Average line length: ",
        lines ? sumLength / lines : 0);
}

Çok basit ama yine de Türkçeleştirirsek:

// Girişteki satırların ortalama uzunluğunu hesaplar
import std.stdio;
 
void main()
{
    ulong adet = 0;
    double toplam = 0;
 
    foreach (satır; stdin.byLine()) {
        ++adet;
        toplam += satır.length;
    }
 
    writeln("Ortalama satır uzunluğu: ", adet ? toplam / adet : 0);
}

Aynı işi hiç gerekmese de :-p şöyle de gerçekleştirebiliriz:

// Girişteki satırların ortalama uzunluğunu hesaplar
import std.stdio;
import std.algorithm;
import std.typecons;
 
void main()
{
    auto sonuçlar = reduce!("a += b.length", "++a")(tuple(0.0, size_t.init),
                                                    stdin.byLine());
 
    auto toplam = sonuçlar[0];
    auto adet = sonuçlar[1];
 
    writeln("Ortalama satır uzunluğu: ", adet ? toplam / adet : 0);
}

Orada 'toplam' ve 'adet' değişkenlerine gerek yok ama okumayı kolaylaştırıyorlar. Yoksa şöyle daha kısa da olur:

import std.stdio;
import std.algorithm;
import std.typecons;
 
void main()
{
    auto sonuçlar = reduce!("a += b.length", "++a")(tuple(0.0, size_t.init),
                                                   stdin.byLine());
 
    writeln("Ortalama satır uzunluğu: ",
            sonuçlar[1] ? sonuçlar[0] / sonuçlar[1] : 0);
}

Ben reduce'un birden fazla işlemle çağrılabildiğini yeni farkettim. reduce, şablon parametresi olarak bildirilen bütün işlemleri bütün elemanlara uyguluyor ve sonuçları çokuzlu (tuple) olarak döndürüyor. Çokuzlunun ilk elemanı ilk işlemin sonucu oluyor, ikincisi ikinci işlemin, vs.

Çokuzlulara yabancı olanlar için:

  http://ddili.org/ders/d/cokuzlular.html

reduce'a yabancı olanlar için de kısa açıklama:

  • İlk işlev parametresinin değerinden başlar. (Yukarıda 0.0 ve size_t.init değerlerinden oluşan bir çokuzlu.) Bu değerler şablon parametrelerinde 'a' ile ifade edilen kavramlardır.

  • İkinci parametresi olarak verilen elemanları kullanır. (Yukarıdaki stdin.byLine() aralığı (range); yani girişin satır satır okunmasından oluşan aralık.) Bu elemanlar şablon parametrelerinde 'b' ile ifade edilen kavramlardır.

  • Şablon parametresi olarak verilen işlemleri o elemanlara uygular. (Yukarıda o işlemler şunlar: Elemanların .length niteliklerini 0.0 ile başlayan değişkene eklemek ve size_t.init ile başlayan değişkenin değerini bir arttırmak.)

  • Sonuç olarak da her işlemin 'a' değerlerinden oluşan çokuzluyu döndürür.

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:
Forum: Ders Arası RSS
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:30:55 (UTC -08:00)