29.4.09

Ya Tutarsa

Sömesterda Eskişehirde bizim evde...
Büyük aile toplandık.
Kardeşim bilmem kaç kupona gazeteden alınmış yüz temel eserden hiç de beğenmediğim (gerçeklerinden farklı) Nasrettin Hoca fıkraları okumakta.
Bir de araya dedem anlattı.

"Hoca göle maya salmış. Hiç tutar mı? Tutmaz tabi."

12.4.09

Bir işlem (kör arama ile)

Projenin Adı: Bir İşlem Sorusunu Çözen Program

Projenin Tanımı:
Televizyon kanalı TRT’ de yayınlanan “Bir Kelime Bir İşlem” adlı yarışmadan esinlenerek yapılan bir projedir. Amaç bu yarışmadaki bir işlem bölümünü çözen programın yazılmasıdır. Bir işlem bölümü rastgele verilen 5 rakam ve en yüksek 100 olmak üzere 10 ya da 25 in katı olan bir sayı ile 100 ile 1000 arasındaki bir hedef sayıdan oluşmaktadır. Amaç verilen 6 sayıyı en fazla bir kez kullanarak 4 işlem yardımı ile hedef sayıya ulaşmaktır. Benim programım bunu yapacağı gibi aynı zamanda sayıların 10 un katı olması gibi kurallar dışında da sonuca ulaşmaktadır. Program yarışmadaki gibi rastgele sayılar belirleyeceği gibi aynı zamanda kullanıcının girdiği sayılarla da çalışmaktadır. Aynı zamanda eğer sonuç varsa çözülürken yapılabilen en az işlem sayısını kullanır.

Çözüm Algoritması: Bu problemi çözmemiz için kör arama kullanarak tüm ihtimalleri denedim. Kör aramayı yaparken derinlik öncelikli arama (Depth-First Search) algoritmasını kullandım. Kodlarımı yazmak için C# programlama dilini kullandım. Kodları yazmadan önce taslak olarak durumları tanımladım. Her durum hangi 2 sayının hangi işleme tabi tutulacağını ve kullanılabilir kaç sayı olduğundan oluşmaktadır.

Programın Yapısı: Programı yazarken kullandığım metotlardan bahsetmem gerekirse; programın ana kısmı, hesapla bölümü, rastgele sayı üretici ve bazı kontroller bulunmaktadır.
Ana bölümde kullanıcıdan alınan ya da rastgele olarak üretilmiş sayılar alınarak DFS algoritmasına göre ve de programda kullanılan sayı âdetine göre hesapla fonksiyonu sürekli olarak tüm ihtimaller bitene kadar çağırılır. Bunu sağlamak için sayı adetine göre 15, 12 yada 9 for döngüsü kullandım.
Hesapla bölümünde ana bölümden alınan durumları yani alınan 2 sayıyı işlemi uygun olarak yapıp hedef sayıya ulaşıp ulaşmadığımızı kontrol ettim. Hedefe ulaşan çözümü daha önce hedefe ulaşmış olan en kısa çözümle karşılaştırdım. Eğer son yaptığım en kısadan daha kısa ise yeni en kısa olan çözümü diğerinin üzerine kaydettim. Tüm arama bittiğinde en kısa sonucu ekrana yazdırdım.
Eğer kullanıcı 6 sayılı bölümü seçti ise tüm ihtimalleri denemek 4-5 saniye sürdüğünden ekrana görsellik olarak progress bar ekledim.(Şekil-1)
Yine şekilde görüldüğü gibi kullanıcı hedef sayıya ulaşmak için 4, 5 ya da 6 sayı seçebilmektedir.



Programın kodunu adresten indirebilirsin. Kod