Forum: D Programlama Dili RSS
Bilmece bildirmece associative map ile gezinmece
kerdemdemir #1
Üye Eyl 2013 tarihinden beri · 125 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Bilmece bildirmece associative map ile gezinmece
Guzel bir soru gordum ve paylasmak istedim,

Soruyu aciklamadan once soyle bir onerim olacak acaba bilmeceler gibi bir konu acsakda orayami yazsam guzel D sorularini. Tabi tamamem Turkceye cevirerek. Uzuldugum nokta Rusya, Cin ve bir suru Arap universiteleri ogrencileri boyle seylere kanalize ediyorlar fakat bizde pek boyle bir kultur yok. Dolayisiyla soyle istatistiklerde hic gozukemiyoruz https://www.go-hero.net/jam/17/regions. Belki ilgilenen gencler olur. 

Bu soru cok hosuma gitti urettigim cozum zaman testinden gecemedi, aklima bir kac degisiklik geliyor isten eve donunce deniyecegim.

Simdi A-Z'ye kadar bir kapilar var. Ve belirli sayida gardiyanimiz var. Bir suru misafir gelicek ve her misafirin hangi kapidan gecip gelicegi belli. Gardiyanlar actiklari kapiyi kapamadan baska kapiyi acamiyorlar. Acaba yeterli sayida gardiyanimiz varmi.

Ornegin

5 1   -> 5 misafir var ve bir gardiyan var demek
AABBB  --> Ilk iki misafi A kapisindan gelicek daha baska A dan gelicek olmadigindan dolayi A'i acan gardiyan kapayabilir.
                   Sonraki 3 misafir B kapisindan gecicekler. A kapi kapandigindan ayni gardiyan kapiyi acabilir.
                   Bu durumda yeterli gardiyanimiz var.

Baska bir ornek
5 1         -> Yine 5 misafir gelicek ve 1 gardiyan var
ABABB   ->  A kapisi kapanmadan once B kapisinin acilmasi lazim fakat bu durumda bir tane gardiyan yeterli degil cunku
                   Gardiyanlar bir kapi kapanmadan oteki acamiyor. Bu durumda iki tane gardiyan gerekli idi.
                   Bu durumda cevabimiz yetersiz olmasi lazim .

 Benim zaman testini gecemeyen kodum.  Performans haric dogru calisiyor sanki.

 
import std.stdio;
import std.string;
import std.algorithm;
import std.conv;
import std.array;
import std.range;
import std.math;
 
KapiDegerleri[int] kapiTablosu;
int[] kapilar;
 
struct KapiDegerleri
{
    int m_kapiBaslangicIndeksi = -1;
    int m_kapiBitisIndeksi;
    int[] m_digerKapilar;
 
    this( int index )
    {
        m_kapiBaslangicIndeksi = index ;
        m_kapiBitisIndeksi = m_kapiBaslangicIndeksi;
    }
 
    void Baslat( int index )
    {
        m_kapiBitisIndeksi = index; 
    }
 
    void DigerKapilariHesapla()
    {
        void EklemeFonksiyonu( int kapiNumarasi )
        {
            if ( kapiNumarasi != kapilar[m_kapiBaslangicIndeksi] )
            {
                if ( !m_digerKapilar.canFind(kapiNumarasi) )
                    m_digerKapilar ~= kapiNumarasi; 
            }
                
        }
 
        kapilar[m_kapiBaslangicIndeksi..m_kapiBitisIndeksi].each!( a => EklemeFonksiyonu(a) );
    }
 
    int Hesapla()
    {
        
        int donusDegeri = 0;
        bool geciciDeger = false;
        if ( m_kapiBaslangicIndeksi == m_kapiBitisIndeksi) 
            return donusDegeri;
        DigerKapilariHesapla();
        void UzunlukHesabi( int kapiNumarasi )
        {
            if (kapiTablosu[kapiNumarasi].m_kapiBitisIndeksi > m_kapiBitisIndeksi)
                donusDegeri++;
            else 
                geciciDeger = true;
        }
        m_digerKapilar.each!( a => UzunlukHesabi(a) );
        if ( geciciDeger) 
            donusDegeri++; 
        return donusDegeri;
    }
}
 
 
int main(string[] argv)
{
    auto dizge = stdin.readln.chomp.split.map!( to!int );
    kapilar = stdin.readln.chomp.map!( a => cast(int)( a - 'A') ).array;
 
    for (int i = 0; i < kapilar.length; i++)
    {
        KapiDegerleri* p;
        p = (kapilar[i] in kapiTablosu);
        if (p !is null)
        {
            p.Baslat(i);
        }
        else
        {
            kapiTablosu[kapilar[i]] = KapiDegerleri( i );
        }
    }
    auto maksimumDegerDizgesi = kapiTablosu.values.map!( a => a.Hesapla() );
    int  gerekliGardiyanSayisi = maksimumDegerDizgesi.reduce!(max) + 1;
    if ( dizge[1] >= gerekliGardiyanSayisi )
        writeln("NO");        
    else 
        writeln("YES");
 
    return 0;
}
Bu mesaj 2 defa değişti; son değiştiren: kerdemdemir; zaman: 2017-08-04, 04:51.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4539 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bilmecelerle ilgili ayrı konu olmasın; burası iyi. Zaten bu kadar fazla forum bölümümüz de olmamalıydı. Elim değse birleştireceğim ama değeci de yok. :)

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-12-18, 00:54:48 (UTC -08:00)