mathjax

Çarşamba, Kasım 30, 2011

Soru Maratonu 2011/6

Haftasonu, Oyun 2011 yarı finali yapıldı. Umarım katılanlar yeterince tadını çıkarmışlardır. Açıkçası, bu sene sorular daha bir kolaydı, ama teknik bilenler için, üniversitede sayısal okuyanlar için özellikle. Çünkü 2 soru hemen ilgili formüllerle yapılabiliyordu. Ama soruyu o şekilde düşünebilmek, dönüştürebilmek ayrı bir mesele. Meraklısı için kolaydı. Ayrıca, kutu silme soruları da kolaydı, işlemler çok sınırlıydı.

Bu hafta değinmek istediğim bir nokta var. SM sayfasında bu konuda birkaç yorum yapıldı. Soruların bilgisayarla çözülme meselesi. Bu mesele genelde hep tartışılan meselelerden biridir, o yüzden fazla uzatmayacağım. Soruları bilgisayara çözdürmeye kalktığınızda, tüm olasılıkları denemeniz gerekir. Çok dikkatli bir şekilde program yazmalı ve sabırla cevabı beklemelisiniz. Mesela, bu seneki Otur-Kalk sorusu için yazdığınız program 2^32 olasılığı teker teker denemeli. Bunun için de yaklaşık 1 ay boyunca bilgisayarınız çalışmalı.

Bazı sorular için çok "akıllı" algoritmalar yazılarak, daha kısa sürede cevaba ulaşabilirsiniz ama o "akıllı" algoritmayı bulmak, ayrı bir zeka sorusudur!

Bazı sorularda ise ancak yaklaşık cevap bulabilirsiniz, kesin cevabı daha sonra tahmin etmeniz gerekir.

Geçen haftanın sorusu için örnek vermek gerekirse, program yazabilirsiniz ve bilgisayar size cevabı 1 saniyede verir ama bu size hiçbir şey kazandırmaz. Ayrıca, o 1 saniyelik programı yazmak için en az 2 dakikanızı harcarsınız. Yarışma bitiminde merak eden olursa, sorunun 10 saniyelik bir çözümünü aktarabilirim. Benzer birşey Komşu Toplamları sorusu için de geçerli ve aslında birçok soru için de.

Ayrıca, birçok seçeneği bilgisayara eletmek yerine, kendi cevabınızın optimal olduğunu matematiksel olarak "ispatlayabilirsiniz". Bu hem daha zevkli, daha öğretici, hem de daha kısa sürer, zaman kazanırsınız ve zekanızı da besler, diğer sorular için de yardımcı olur. Neyse, çok uzattım yine. Bence her 2 şekilde de cevaplar geçerlidir, bazen birini bazen de diğerini seçmek akıllıca olur. Ama bilgisayar "şart" değildir, "yeterli" de değildir.

Gelelim cevaplara...

16. Zar: 645e2f39a4a12ade355a283e98db90f3
Kolay sorulardan biri ama dikkatli olmak gerekiyor. Dikkatsizlikten dolayı birkaç kişinin puan kaybı olacaktır.

17.
Piyonlar: 425581dad1ed6ced7d229561059fa158
Bu da kolay sayılır, ama tabii görene.

18. Kod Uzunluğu: [cevap sınırlı]
Son 2 hafta kaldı, herkese bol şans. Bu sorunun da cevabı maraton sonunda verilecek.

6 yorum:

emrah dedi ki...

Merhaba madran,
Bu yazım TZV ye olan isyanımdır.
Tzv de şu anda 18 tane soru var.
Bunlardan 8 tanesi hariç diğer geri kalanları bilgisayar ile çözdüm.
Bahsi geçen 8 tane soru şunlar:
Top Oyunu
Sahte Banknot
Çemberdeki Çokgen
Sıralama (Hala çözemedim)
Adaylar ve Oylar
İki harfli kitap(En güzel soru, tek satırlık cevabı var)
Kod Uzunluğu.

Bu 8 sorunun 7 tanesi için bilgisayara ihtiyaç duymadım, zaten bazılarını çözemez. Sıralama sorusunu da bilgisayar tek başına çözemez, kendin çözmen lazım.

Diğer 10 tanesini bilgisayar ile çözdüm, ve çok büyük keyif aldım gerçekten. Algoritmaları yazmak çok zevkli idi. Matematikçi olduğum halde kod yazmak bana daha zevkli geliyor. Bence bilgisayar ile çözülen sorular sorulmamalı, ama şu da var ki , o algoritmaları yazmak da ayrı bir iş.

Değinmek istediğim son nokta ise şu:
Bahsi geçen otur kalk sorusu için 2^32 olasılığı gerçekten denedim ama 1 ay gibi bir süre gerekmiyor. 4-5 saat yeterli oldu yazdığım program için. Yazdığım algoritmayı da ekledim. Çalıştırmayı denemeyin, çünki hata verecek. Çalıştıran kişi cevabı bulmaması için kod da bazı yerlerde değişiklik yaptım.

#include
using namespace std;
int main()
{
long unsigned int parca1=1,parca2=1,t1=3,t2=0,count,i,j,max=0;
for(i=0;i<65536;i++)
{
t1=i;
for(j=0;j<65536;j++)
{
t2=j;
count=1;
do{
parca1=t1;
parca2=t2;
if(((parca2&0x8000)>>14)==(parca1&0x2))
t1=0;
else
t1=1;
if(((parca1&0x4)>>2)!=(parca1&0x1))
t1=t1+0x2;
if(((parca1&0x8)>>2)!=(parca1&0x2))
t1=t1+0x4;
if(((parca1&0x10)>>2)!=(parca1&0x4))
t1=t1+0x8;
if(((parca1&0x20)>>2)!=(parca1&0x8))
t1=t1+0x10;
if(((parca1&0x40)>>2)!=(parca1&0x10))
t1=t1+0x20;
if(((parca1&0x80)>>2)!=(parca1&0x20))
t1=t1+0x40;
if(((parca1&0x100)>>2)!=(parca1&0x40))
t1=t1+0x80;
if(((parca1&0x200)>>2)!=(parca1&0x80))
t1=t1+0x100;
if(((parca1&0x400)>>2)!=(parca1&0x100))
t1=t1+0x200;
if(((parca1&0x800)>>2)!=(parca1&0x200))
t1=t1+0x400;
if(((parca1&0x1000)>>2)!=(parca1&0x400))
t1=t1+0x800;
if(((parca1&0x2000)>>2)!=(parca1&0x800))
t1=t1+0x1000;
if(((parca1&0x4000)>>2)!=(parca1&0x1000))
t1=t1+0x2000;
if(((parca1&0x8000)>>2)!=(parca1&0x2000))
t1=t1+0x4000;
if(((parca1&0x4000)>>14)!=(parca2&0x1))
t1=t1+0x8000;
else
t2=1;
if(((parca2&0x4)>>2)!=(parca2&0x1))
t2=t2+0x2;
if(((parca2&0x8)>>2)!=(parca2&0x2))
t2=t2+0x4;
if(((parca2&0x10)>>2)!=(parca2&0x4))
t2=t2+0x8;
if(((parca2&0x20)>>2)!=(parca2&0x8))
t2=t2+0x10;
if(((parca2&0x40)>>2)!=(parca2&0x10))
t2=t2+0x20;
if(((parca2&0x80)>>2)!=(parca2&0x20))
t2=t2+0x40;
if(((parca2&0x100)>>2)!=(parca2&0x40))
t2=t2+0x80;
if(((parca2&0x200)>>2)!=(parca2&0x80))
t2=t2+0x100;
if(((parca2&0x400)>>2)!=(parca2&0x100))
t2=t2+0x200;
if(((parca2&0x800)>>2)!=(parca2&0x2000))
t2=t2+0x400;
if(((parca2&0x1000)>>2)!=(parca2&0x400))
t2=t2+0x800;
if(((parca2&0x2000)>>2)!=(parca2&0x8000))
t2=t2+0x1000;
if(((parca2&0x4000)>>2)!=(parca2&0x1000))
t2=t2+0x2000;
if(((parca2&0x8000)>>2)!=(parca2&0x2000))
t2=t2+0x4000;
if(((parca2&0x4000)>>14)!=(parca1&0x1))
t2=t2+0x8000;
count++;
}while((t1!=0)&&(t2!=0));
if(count>max)
max=count;
count=0;
}
}
cout<<endl<<"max"<<max<<endl;
}

Uğur dedi ki...

Merhaba Emrah;

Evet, matematikçilerin "çoğu" bilgisayardan ve algoritmalardan hoşlanırlar. Ben de soruları çözerken, matematiksel kanıtlarının yanında, her yıl yeni bir programlama dilinde veya paket programında ilgili soruları çözmeye çalışırım. Her programın kendi avantajları ve dezavantajları oluyor. (C++, Java gibi doğrudan programlama yerine Maple vb programları kastediyorum.) Diğer taraftan da, bu programları öğrenebilmek için kendime bir motivasyon sağlamış oluyorum, kendimi test ediyorum. Ve çoğunun bilgisayar çözümleri saniyeler içinde elde edilebiliyor - birkaç tanesi hariç.

Programların çalışma sürelerine gelince... Bu kullandığınız dile veya programa ve bilgisayarınızın kapasitesine göre değişir. Ama 2^32 ~ on-basamaklı bir sayı, ve tüm olasılıkları denemek o kadar da uzun sürmez. Bunun farkındayım. Biraz abartarak yazmamın sebebi, uygun algoritmayı yaz(a)mazsanız, bilgisayarın da size yetmeyeceği.

Yani, bilgisayar yeterli değildir! Uygun algoritmayı bulmak da genelde güzel bir zeka sorusudur.

İki harfli kitap sorusunun tek satırlık çözümünü merak ettim doğrusu, benim ki 2 satırlık sayılır - analitik metodla çözdüm. Ama bilgisayar yardımıyla da çok kolay çıkıyor. Keşke olmasaydı.

burak dedi ki...

zar'ın sonucunu "esintiler123/4567"
şeklinde yazdım ve MD5 ı :
3b508bb5cc354f5393bbf56d82cb4664
buldum. cevabımdan da çok eminim. niçin cevaplarımız uyuşmuyor??

Uğur dedi ki...

@Adsız/unknown:

Demek ki, cevabınız yanlış :( Belki de cevabınızı sadeleştirmediniz. Bilemiyorum. Eğer çıkan sonucu (kesiri) sadeleştirdiyseniz, kesinlikle çözümünüz hatalı. Bu zar sorusu kolay olmasına rağmen, aynı zamanda kolay hata yapılabilecek bir soru. Dikkati elden bırakmayın.

burak dedi ki...

Bu soru üzerine arkadaşımla çok kafa patlattık, bir çok yol denedik. Sizin için de mahsuru yoksa çözümü bizimle paylaşır mısınız?

Uğur dedi ki...

@burak

Bu sorunun çözümü için tüm olasılıkları saydığınızdan emin olmanız gerekiyor. 5 zarın toplamı minimum 5, maksimum 30 olur ve dolayısıyla toplamı 5,10,15,20,25 ve 30 yapan tüm olayların sayısını belirlemek gerekir.

Toplam = 5 => 1 olay
Toplam = 10 => 126 olay
...
Toplam = 30 => 1 olay

Genel toplam = 1+126+...+1
Olasılık=(Genel Toplam)/(6^5).

Umarım açıklayıcı olmuştur.