Forum: D Programlama Dili RSS
Thor'un oyunu
kerdemdemir #1
Üye Eyl 2013 tarihinden beri · 79 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Thor'un oyunu
Şöyle bir oyunu D ile çözdüm tam anlatım "http://codeforces.com/contest/705/problem/C" dan bulunabilir.

Sıkıcı gelebiliceğinden D ile ilgili sorulara geçeceğim 

1  - Aşagıdaki güzel aralık zincirinde ne yazıkki sort yapmak zorunda kaldım. İsteğimse aynı elemanlardan kaçar tane olması idi fakat group methodu sadece artarda gelen elemanların sayısını veriyor.
eventDizisi.take(kacTaneOkundu).sort.group.each!( a => uygulamaEventDizisi[a[0].uygulamaNumarasi].biraziniOku(a[1]));

Sort yapmadan verimlilik acısından daha iyi bir çözüm olabilirmiydi?

2 - Yukardaki zincir çalışmasına rağmen aynı işi yapmasını beklediğim aşağıdaki zincir çalışmadı
eventDizisi.take(kacTaneOkundu).sort!((a,b) => a.uygulamaNumarasi == b.uygulamaNumarasi).group!( (a,b) => a.uygulamaNumarasi == b.uygulamaNumarasi ).each!( a => uygulamaEventDizisi[a[0].uygulamaNumarasi].biraziniOku(a[1]));
Bu çalışmadığı için opEqual yazmak durumunda kaldım güzelde oldu gerçi. Acaba beklentim niye gerçekleşmedi?

3 - Her zamanki gibi başka tavsiyeniz olurmu ?

Belki ilgi çekebilir diye soruyu biraz açayım.

Thor dünyaya gönderilirken Loki ona bir akıllı telefon alıyor. Thor telefonu pek kullanmayı bilmiyor. Bir sürü program bir sürü bildiri gönderiyor ve thor belirli şekillerde okuyabiliyor.

Üç çeşit gelişme var.
1- n. uygulamanın bildiri göndermesi
2- thor'un n. uygulamanın gönderdiği bütün bildirileri okuması
3- thor'un ilk baştan (daha önce okuduğunu bir daha okuyabilir) k tane mesaj okuması burda hangi uygulamaya ait olduğunu bilmeden dan dun diye okuyor.

Örn:

3 4   ---> 3 tane uygulama var toplam 4 bildiri var
1 3   ---> 1 tipte olay gelişiiyor yani 3. uygulama bildiri yolluyor
1 1  ----> Yine 1. tip bu sefer 1. uygulama bildiri yolluyor
1 2  ----> Yine 1. tip bu sefer 2. uygulama bildiri yolluyor
2 3  -----> 2. tip gelişme 3. uygulamanın gönderdiği bütün mesajlar okunuyor 3 okunmamış mesajdan geriye 2 tane okunmamış kalıyor.

Soru bizden kaç tane okunmamış mesaj kaldığını yazmamızı istiyor.
Benim çözümüm aşağıdaki gibi oldu aslında baya "functional programming" kullanmış gibi hissettim içime sindi. 


import std.stdio;
import std.string;
import std.algorithm;
import std.exception;
import std.conv;
import std.array;
import std.range;
 
struct UygulamaMesajlari
{
    int mesajlar;
    int okunmusMesajlar;
 
    void hepsiniOku()
    {
        okunmusMesajlar = mesajlar;
    }
 
    void biraziniOku( int kacTane )
    {
        if ( kacTane > okunmusMesajlar )
            okunmusMesajlar = kacTane;
    }
 
    int okunmamisMesajSayisi()
    {
        return mesajlar - okunmusMesajlar;
    }
}
 
struct Bilgilendirme
{
    int uygulamaNumarasi;
 
     bool opEquals()(auto ref const Bilgilendirme b) const
    {
        return uygulamaNumarasi == b.uygulamaNumarasi;
    }
}
 
UygulamaMesajlari[] uygulamaEventDizisi;
Bilgilendirme[] eventDizisi;
 
void birinciTurGelisme( int uygulamaIndeksi, int eventNumarasi )
{
    uygulamaEventDizisi[ uygulamaIndeksi ].mesajlar++;
    eventDizisi[ eventNumarasi ].uygulamaNumarasi = uygulamaIndeksi;
}
 
void ikinciTurGelisme( int uygulamaIndeksi )
{
    uygulamaEventDizisi[ uygulamaIndeksi ].hepsiniOku();
}
 
void ucuncuTurGelisme( int kacTaneOkundu  )
{
    //writeln(eventDizisi.take(kacTaneOkundu).sort.group);
    eventDizisi.take(kacTaneOkundu).sort.group.each!( a => uygulamaEventDizisi[a[0].uygulamaNumarasi].biraziniOku(a[1]));
}
 
void gelismeIsle ( int gelismeTuru, int gelismeParametresi, int gelismeIndeksi )
{
    if ( gelismeTuru == 1 )
        birinciTurGelisme( gelismeParametresi - 1, gelismeIndeksi);
    else if ( gelismeTuru == 2 )
        ikinciTurGelisme( gelismeParametresi - 1) ;
    else if ( gelismeTuru == 3 )
        ucuncuTurGelisme( gelismeParametresi );
 
    writeln(uygulamaEventDizisi.dup().map!( a => a.okunmamisMesajSayisi()  ).sum());
}
 
 
 
void main() 
{
    auto ilkSatir = stdin.readln.strip.split().map!(a => to!int(a)).array();
    auto uygulamaSayisi = ilkSatir[0];
    auto eventSayisi    = ilkSatir[1];
 
    uygulamaEventDizisi.length = uygulamaSayisi;
    eventDizisi.length = eventSayisi;
 
    auto eventler = stdin
        .byLine()
        .take(eventSayisi)
        .map!(line => line
              .split
              .map!(a => to!int(a))
              .array());
 
    zip(iota( 0, eventSayisi ), eventler).each!( a => gelismeIsle( a[1][0], a[1][1], a[0]  ));
}

Sevgiler
Erdemdem
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-07-27, 01:49:46 (UTC -07:00)