Dedikoducu kuşlar (Çözüm)

Kuşlar dağıldıktan sonra Bilge Karga yuvada volta atarak düşünmeye başlamış. Bu sırada Meraklı Karga uyanmış:

MK: Ne oldu baba? Neden yatmadın hala?

BK: Bir dedikodu sorununu çözemeye çalışıyorum. Sen yat, uyu.

MK: Dedikodu mu? Anlatsana.

Bilge Karga kuşların sorununu Meraklı Karga’ya anlatır.

MK: Çok kolaymış. İki kuş bütün bilgileri tek bir görüşmede öğrenir.

BK: İkiden fazla kuş var ama.

MK: Üç kuş da bütün bilgileri üç görüşmede öğrenir.

BK: Üçten fazla kuş var. Dur da düşüneyim biraz. Dört kuş için kaç görüşme gerekir acaba? Hmmm.

MK: Dört görüşme yeter. Bak şöyle bir şey çizdim. Birinci görüşme birinci ve ikinci kuşlar arasında. Bu görüşmeden sonra ikisi de birbirlerinin bilgilerini biliyor. İkinci görüşme üçüncü ve dördüncü kuşlar arasında. Üçüncü görüşme birinci ve üçüncü kuşlar arasında ve son görüşme de ikinci ve dördüncü kuşlar arasında.

4 kuş için haberleşme
4 kuş için haberleşme

BK: Bu iş böyle tek tek denenerek bulunmaz ya, çok uzun sürer. Şöyle genel bir yöntem olmalı.

MK: Hmmm, aklıma bir şeyler geliyor. Kuşları iki gruba ayıralım. Bir grupta 4 kuş olsun. Kalanlar da diğer grupta. Örneğin 10 tane kuş varsa, ilk grubu yukarıdaki gibi ilk 4 kuştan oluşturalım, beşinciden onuncuya kadar olanlar da diğer grubu oluştursunlar. İlk önce bu ikinci gruptaki kuşlar tek tek gelip birinci gruptaki kuşlardan biriyle görüşsünler. Yani ilk 6 görüşmeyi yapacaklar. Ardından birinci grup kendi arasında yukarıdaki gibi 4 görüşme ile bütün dedikoduları paylaşacak. Sonra da birinci grubun kuşları diğer kuşlarla 6 görüşme daha yapıp bütün dedikoduları paylaşmış olacaklar. Böylece 10 kuş toplamda 6 + 4 + 6 = 16 görüşme ile işlemi bitirebilecek. Eğer 20 kuş olsaydı 16 + 4 + 16 = 36 görüşme yeterli olacak. Yani genel olarak N kuş için 2N – 4 görüşme.

BK: Güzel bir yöntem ama belki bizdeki kuş sayısı için daha az görüşmeli bir çözüm vardır. Bu çözümün en iyi çözüm olduğunu biliyor muyuz?

MK: Henüz bunu gösterecek bir yol bulamadım.

BK: Bu soruyu belki ileride çözeriz ama daha başka bir sorun var. Görüşmelerin zamanlaması nasıl yapılacak? Yani hangi kuş hangi kuşla ne zaman görüşecek? Birinci gruptaki kuşlar ikinci gruptaki kuşların hepsiyle görüşmelerin bitip bitmediğini nasıl anlayacak?

MK: Bunları çözecek değişik yöntemler kullanabilirler. Örneğin en basitinden birinci gruptan 1 numaralı kuş diğer gruptaki kuşlarla görüşür. Toplam kaç kuş olduğunu bilirse bu görüşmelerin ne zaman bittiğini de bilir. Hatta diğer kuşlarla görüşmeye kendisi de gidebilir, böylece kuşların çoğu dedikodu yapmadıkları süreyi daha verimli kullanabilir.

BK: Ya da birinci gruptaki her kuşa belli kuşlarla görüşme görevi verilebilir. Örneğin birinci kuş 5., 9., 13., … kuşlarla görüşürken, ikinci kuş da 6., 10., 14., … kuşlarla görüşür. Böylece görüşmeler daha çabuk bitirilebilir.

MK: Elbette.

 

Akşam kararlaştırılan zamanda kuşlar Bilge Karga’nın yuvasına gelmişler ve sorunlarının çözümünü öğrenmişler. Görev dağılımında adalet olması için her gün ayrı bir birinci grup seçilmesine karar vermişler. Ertesi gün için grupları seçip bütün kuşları numaraladıktan sonra da Bilge Karga’ya bu büyük sorunu çözdüğü için teşekkür edip yuvalarına uçmuşlar.

 

 

 

Bir Kelime

Sonunda JavaScript öğrenme programım altında bir zamanlar televizyon ekranı başında oynadığımız “Bir Kelime Bir İşlem” yarışmasının “Bir Kelime” kısmını da bitirdim. Aşağıdaki linkten oyunu oynayabilirsiniz.

Sayfa ilk yüklendiğinde bütün imla kılavuzu da beraber yükleniyor. Bu şimdilik yaklaşık 1.5 MB yer tutuyor. Bundan sonra sayfa kapatılana kadar bir daha böyle bir yüklemeye gerek yok, yani oyun çevrimdışı da oynanabilir.

Oyun için önce rastgele yedi harf seçmek gerekiyor. Bu seçimi oyuncu ünlü ya da ünsüz olacak şekilde yapıyor. Bu tuşlar solda. Yedi harf de seçildiğinde oyun başlıyor. Oyuncu harflerin üzerine basarak kelimesini renkli alanda oluşturabiliyor. Bu sırada bir tane de joker harf kullanma hakkına sahip. Bu harfi joker tuşuna (ortadaki) bastıktan sonra aşağıda çıkan klavyeden seçerek yapıyor. Oyuncu en iyi kelimeyi bulduğunu düşündüğünde kabul tuşuna basarak çözümünü kontrol ettiriyor. Eğer kelime imla kılavuzunda mevcutsa puan alıyor, değilse alamıyor. Oyunun her anında programa o harflerle yazılabilecek en uzun kelimeler sorulabiliyor. Çözüm tuşuna basıldığında program bulunabilecek en uzun kelimeleri alttaki alanda gösteriyor.

Kullandığım çözüm bulma algoritması da basit bir şey. Önce her harf için bir map oluşturuyorum. Bu map içinde o harfin bulunma adedine göre kelimeleri grupluyorum. Yani bir grup içinde bir adet a harfi bulunan kelimelerden oluşuyor, bir başka grup içinde iki adet a harfi bulunduran kelimelerden. Bu şekilde bütün imla kılavuzunu hazırlıyorum. Oyunda çözüm istendiğinde seçilmiş harflerin N’li (N maksimum harf sayısı olan 7’den 2’ye kadar) kombinasyonlarını oluşturuyorum ve içinde bu harfleri seçildikleri adet kadar barındıran kelime gruplarının kesişimlerini buluyorum. Sonra bu kesişim kümesindeki kelimelerin uzunluklarına bakıyorum. Eğer kelimenin uzunluğu kombinasyondaki harf adedi kadarsa jokersiz, harf adedinden bir fazlaysa bir jokerli çözüm bulunmuş oluyor. Bu çözümlerin hepsini de çözüm kümesine ekliyorum.

 Bir Kelime

Yazılımcı bozuklukları

Yazılımcılarda görülen davranış bozukluklarından bir tanesi yazılımcı olduklarını unutmalarıdır. İş hayatında sık kaşılaştığım senaryolardan biri şöyledir: Yazılımcı bir sorunu çözemek için bir programa ihtiyaç duyar. Gruptaki diğer elemanlara böyle bir programları olup olmadığını sorar ve hayır cevabını alır. Sonra internette arar ama istediği programı orada da bulamaz. Bu sorun artık onun için çözümsüzdür, çünkü çözüm için aradığı program yoktur.

Bu noktada biraz eğlenmek istiyorsanız bu elemana şu soruyu yöneltin: “O zaman o programı sen yaz, yazılımcı değil misin?”. Elemanın yüzünde, o ana kadar bunun yasadışı bir etkinlik olduğuna inandığını gösteren bir ifade belirecektir. Yani sadece doğrudan çalıştığı proje için program yazabileceğine inanıyordur, o projeye dolaylı yoldan katkısı olabilecek bir program yazabileceği aklına bile gelmemiştir. Bu durumu açıklayacak daha mantıklı başka olasılıklar da vardır. Örneğin gereken programı yazabilecek bilgiye ve beceriye sahip olmayabilir ama bunun gerçek neden olduğu bir sahneyi henüz yaşamadım.

Neyse ki çevremde bu soruna sahip olmayan yeterince yazılımcı var da bu meslekten hala zevk alabiliyorum.

Ilımlı tepki

Serkan ve Ümit dün okullarından izin alıp EuroPark’a gittiler. Akşam eve geldiklerinde bindikleri, gördükleri şeyleri anlatmaya başladılar. Tabii ki bu mutluluk fazla uzun sürmedi. Okulda dersler normal şeklinde yapılmış ve ertesi gün için ödevler verilmişti. Ümit bu haberi hiç de hoş karşılamadı. O bu ödevleri yaptıkça whatsapp’tan da yeni ödev haberleri gelmeye devam ediyordu. Sonunda dayanamadı ve patladı:

Ü: EuroPark’tan nefret ediyorum. Zaten gitmek istemiyordum. Bu kadar ödev olamaz. Öğretmenlerden de nefret ediyorum. On milyar insan öldüreceğim.

B: O kadar insan yok ki dünyada.

Ü: (Bir an durakladıktan ve sakinleştikten sonra) Beklerim o zaman.

Eğer insan türü bugün de varlığını devam ettirebiliyorsa bunun tek nedeni dünyada henüz on milyar insan olmamasıdır. Uyarmadı demeyin!

Dedikoducu kuşlar

Küçük bir ormanda yaşayan kuşların tek eğlencesi dedikodu yapmakmış. Hatta bazı günler dedikodu yapmaktan avlanmayı ya da yiyecek toplamayı bile unutur olmuşlar. Bir süre sonra bunun böyle gidemeyeceğini anlamışlar. Bu sorunu çözse çözse bilge karga çözer deyip, karganın yuvasının yolunu tutmuşlar.

Bilge karga sorunu dinledikten sonra, “Çok kolay, dedikodu yapmayı bırakın, sorun kendiliğinden bitecektir” demiş. Bunu duyan diğer kuşlar “Aman bilge karga, biz dedikodusuz yaşayamayız. Kendimizden vazgeçtik, çocuklar için yardım istiyoruz senden. Ne olur hallet bunu.” demişler. Karga da “Hele bir anlatın bakalım, nasıl bir sorunmuş bu?” demiş ve kuşları dinlemeye başlamış.

“Başlangıçta her birimiz diğer kuşların bilmediği bilgilere sahip. Birbirimizin arkasından konuştuğumuzdan dedikodu her seferinde iki kuş arasında yapılıyor. Dedikodu bittiğinde iki kuş da birbirlerinin o ana kadar bildiği bütün bilgileri öğrenmiş oluyorlar ama hepimiz bütün dedikoduları öğrenmek istediğimizden bütün günümüz bir ona bir buna uçarak ve aynı dedikoduları defalarca dinleyerek geçiyor. Öyle bir yol bul ki yiyecek bulmak için bize daha çok zaman kalsın.”

Bunu duyan karga gülerek “E bundan kolay ne var? Hep beraber bir yerde toplanın ve dedikodunuzu topluca yapın, nasıl olsa akşam olduğunda herkes bütün dedikoduları öğrenmiyor mu?” demiş.

Kuşlar ise bu öneriye hep bir ağızdan itiraz etmiş. “Toplu yapamayız bilge karga, yanımızda bir üçüncü kuş bile olsa utanırız. Son ümidimiz sendin.” demişler.

Karga da pençesiyle gagasını kaşıyarak “Bunu bir düşüneyim. Yarın bu saatte bana gelin, çözümü size anlatayım” demiş.

Kuşlar da hemen bir çözüm bulunamamış olmasından ötürü hafif hayal kırıklığına uğramıs ama yine de umutlu bir şekilde “Tamam, yarın görüşürüz” deyip yuvalarına uçuşmuşlar.

 Karga acaba nasıl bir çözüm bulmuş?

Çözüm

Açık Poker (Çözüm)

Eşitlik durumunda ikinci oyuncu kazanacağına göre birinci oyuncu ilk hamlede ikinci oyuncuya flush royal imkanı vermemelidir. Bu durumda birinci oyuncu ilk hamleye flush royal ile başlayamaz, çünkü ikinci oyuncu bu hamleyi başka renkte bir flush royal ile cevaplar.

Örnek:

Birinci oyuncu ilk turda kupa A K Q J 10 seçerse ikinci oyuncu karo A K Q J 10 seçer ve ikinci turda hiçbir değişiklik yapmaz. Böylece oyun sonunda elinde bir flush royal olur ve kazanır.

İlk oyuncu ikinci oyuncunun flush royal imkanını elinden alırsa o zaman ikinci oyuncunun alabileceği en iyi el flush olur. Bu eli yenmek için birinci oyuncu ya flush royal yapmalı ya da daha iyi bir flush.

Birinci oyuncunun ilk hamlesine bakalım. İkinci oyuncunun royal flush yapmasını engellemek için her renkten A K Q J 10 sırasını rakibe bırakmayacak şekilde birer kart almak gerekecek. Örneğin dört renkten de A kartlarını alırsa, ikinci oyuncu flush royal yapamayacak, fakat şimdi birinci oyuncu bir sorunla karşı karşıya kalır. İkinci oyuncu da her renkten K kartlarını alırsa kendisi için en yüksek flush elini almayı garantileyecektir. K ile flush yapmasını engellemek için birinci oyuncu ikinci turda Q kartlarını almak zorunda kalacak ama ikinci oyuncu bir renkten J ile flush yaparak birinci oyuncunun o ana kadarki en iyi eli olan kare Ası yenecektir.

Demek ki birinci oyuncunun yaptığı ilk hamle ikinci oyuncuyu yeterince sıkıştıramadı. Aşağıya doğru yarışı hep ikinci oyuncu kazanıyor. Peki birinci oyuncu ilk hamlesinde ikinci oyuncuyu yukarıya doğru oynamak zorunda bırakabilir mi? Evet, bu mümkün. Birinci oyuncu ilk hamlesinde 10’luları alırsa hem ikinci oyuncunun flush royal yapmasını engeller hem de kendi flush royal tehdidini korur. Bu tehdidi engellemenin tek yolu ise 10’ludan büyük kartları almaktır. Bu hamle ise ikinci oyuncuya hiçbir şey kazandırmaz, çünkü 10’ludan büyük kartların olduğu bölümde zaten flush imkanı da kalmamıştı. Bu boşa giden hamleden sonra birinci oyuncu flush royal yapamayacaktır ama kalan kartlarla olası en büyük flush artık garantidir. Herhangi bir renkten 10 9 8 7 6 ile oyunu kazanacaktır, çünkü ikinci oyuncunun yapabileceği en iyi hamle bir renkten 9 8 7 6 5 olacaktır.

Demek ki bu oyunu birinci oyuncu  ilk turda 10’luları alarak her zaman kazanabilir. Birinci oyuncunun birinci turda seçeceği beşinci kart önemli değildir.

Asperger ve orantılar

Ümitler şu sıralar okulda matematikte doğru ve ters orantıları öğreniyorlar. Orantıları çözmek için şöyle bir yöntem kullanıyorlar:

Örneğin, 3 ekmek 10 lira ise 6 ekmek kaç liradır?

3 ekmek  :  10 lira (İki tarafı da 3’e bölerek 1 ekmeğin fiyatı bulunur)

1 ekmek :    10/3 lira  (İki tarafı da 6 ile çarparak 6 ekmeğin fiyatı bulunur)

6 ekmek : 60/3 = 20 lira

Bu akşam okul öncesi ters orantı çalışmak istedi ve bu yöntemi ters orantı ile denemek istedi. Bir örnek uydur ve çöz dedim. Tabii ki hemen yukarıdaki örneği düşündü. Bu örneğin ters değil doğru orantılı olduğunu söyledim ama Ümit bunu dert etmedi. “Sadece sayılarla teknik deneme yapmak istiyorum” dedi. “Peki” dedim. Çözümü şöyle görünüyordu:

3 ekmek 10 lira ise 6 ekmek kaç liradır?

3 ekmek  :  10 lira (Sol tarafı da 3’e bölerek sağ tarafı da 3’le çarparak 1 ekmeğin fiyatı bulunur)

1 ekmek :    30 lira  (Sol tarafı 6 ile çarparak, sağ tarafı da 6’ya bölerek 6 ekmeğin fiyatı bulunur)

6 ekmek : 30/6 = 5 lira

İki dakika önce sadece sayılar önemli diyen çocuk bu çok mantıksız diye tutturmaya başladı. Ben de “o zaman ters orantılı bir problem çöz” dedim.

3 duvarcı 1 duvarı 2 günde örüyorsa 6 duvarcı bu duvarı kaç günder örür?

3 duvarcı  :  2 gün (Sol tarafı da 3’e bölerek sağ tarafı da 3’le çarparak 1 duvarcının kaç günde ördüğü bulunur)

1 duvarcı :   6 gün  (Sol tarafı 6 ile çarparak, sağ tarafı da 6’ya bölerek 6 duvarcının kaç günde ördüğü bulunur)

6 duvarcı : 6/6 = 1 gün

Sonra da Ümit’ten beklediğim tepki geldi: “Hah, bu çok mantıklı işte”.

Açık poker

Bu poker oyunu türünde iki oyuncu şu kurallara göre oynuyor:

  • Birinci oyuncu desteden (52 kartlık normal oyun destesi) istediği 5 kartı seçiyor.
  • İkinci oyuncu kalan kartlardan istediği 5 kartı seçiyor.
  • Birinci oyuncu elindeki kartların istediği kadarını kenara ayırır ve desteden aynı miktarda kart seçer.
  • İkinci oyuncu elindeki kartların istediği kadarını kenara ayırır ve desteden aynı miktarda kart seçer.

Bu aşamada kimin eli daha iyiyse o kazanır.

Aşağıda ellerin iyiden kötüye doğru sıralaması verilmektedir:

  1. Flush Royal: Aynı simgeden (maça, kupa, karo ya da sinek) A, K, Q, J, 10. Her simge aynı değerde.
  2. Straight Flush: Aynı simgeden ardışık herhangi 5 kart.
  3. Kare: Aynı değerdeki karttan 4 tane, örneğin dört tane As.
  4. Full house: Bir kart değerinden 3 başka bir değerden de 2 kart. Örneğin 3 tane kız ve iki tane vale.
  5. Flush: İki numaralı şartı sağlamayan aynı simgeden 5 kart.

Eşit seviyedeki el değerlerinde en yüksek kart eşitliği bozar. Örneğin birinci oyuncu maça K,Q,J,10,9 ve ikinci oyuncu da kupa Q,J,10,9,8 kartlarını seçmişse birinci oyuncu kazanır çünkü K daha yüksek karttır. Eşitlik yine bozulamıyorsa ikinci oyuncu kazanır.

Bu oyunu hangi oyuncu nasıl bir stratejiyle kazanır?

Açıklamalar: Oyuncular kartları desteden görerek seçiyorlar. Ayrıca birbirlerinin seçtikleri ve değiştirdikleri kartlarını da görüyorlar.

Bir İşlem

Yurt dışında “Countdown”, Türkiye’de ise “Bir Kelime Bir İşlem” adıyla bilinen yarışma programının işlem kısmını sonunda bir Web uygulaması olarak bitirmiş bulunuyorum. Sayfa düzeni şimdilik mobil cihazlar göz önünde tutularak hazırlanmış durumda.

Oynanış: Oyunda hedef verilen altı adet sayıyyla dört işlem yaparak hedef sayıya mümkün olduğunca yaklaşmak. Bir kullanılan sayı bir daha kullanılamıyor. Bu sayılar kırmızı kenarlarla gösteriliyor. Sarı kenarlı sayılar kullanılabilecek sayıları gösterirken, seçilmiş sayı da yeşil kenarla gösteriliyor. İşlemin ilk sayısını seçtikten sonra bir işlem seçiliyor. Ardından da bu işlem için gereken ikinci sayı seçiliyor. Bu aşamada program işlemin sonucunu ilk seçilen sayının yerine yazıyor ve ikinci sayıyı kullanılmayacak şekilde işaretliyor. Bir sonraki adımda işlemin sonucu hemen kullanılabilsin diye bu sayı otomatik olarak seçiliyor. Eğer başka bir sayı ile işlem yapılmak istenirse kullanıcı sarı sayılardan birini seçebilir. Bu durumda seçilen sayı değişecektir.

İşlemlerin altındaki sırada ise oyunla ilgili tuşlar bulunmakta. En soldaki tuş o ana kadar bulunmuş en yakın sonucu çözüm olarak değerlendirmeye sokuyor. Bu tuşa basılınca kalan zamana ve hedefe ne kadar yaklaşıldığına göre bir skor hesaplanıyor. Onun yanında çözüm tuşuna basılınca program hedefe olası en yakın çözümü hesaplıyor ve bu tuşların altındaki alana bu çözümü yazıyor. Geri al tuşuna basınca son yapılan işlem geri alınıyor ve kullanıcı başka bir işlem yapabiliyor. Bu şekilde oyunun en başına dönmek mümkün. En sağdaki tuşla da yeni bir oyun başlatılıyor.

Programla ilgili biraz da bilgi vereyim. Oyun HTML, CSS ve Javascript kodlarından oluşuyor. Çözüm algoritması verilen sayılarla olası bütün işlemleri yapıyor ve her işlemden sonra sonuçla karşılaştırıyor. Eğer ciddi bir hata yapmadıysam çözüm tuşuna (ampule) basınca program en iyi çözümü gösterecektir. Bu en iyi çözüm sırasında bazen gereksiz işlemler de oluyor ama sonucu etkileyen bir durum değil bu. Henüz bu gereksiz işlemleri çözümden çıkaracak kısmı programlamadım.

Program mobil cihazlarda CSS viewport birimleri destekleyen tarayıcılarda doğru gösteriliyor. Şimdilik sadece Chrome (51 ve sonrası) ve Firefox (48) versiyonlarıyla test edebildim. Android standard tarayıcıda doğru çalışmadığına dair ekran görüntülerini de gördüm.

Programın geliştirilmesi aşamasında fikirlerinden (Kullanıcı ara birimi ve oynanış) faydalandığım Hatice Savaş’a da teşekkürlerimi sunarım.

Bir İşlem