Forum: D Programlama Dili RSS
40 adet kutunun her birinin içinde 39 kutu
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: 40 adet kutunun her birinin içinde 39 kutu
Bu soruyu Salih Dinçer'in şu mesajından aldım:

  http://ddili.org/forum/post/4899

Salih Dinçer:
Bir öneri (soru) ben dillendirmek isterim. Bu belki bir oyun değil ama zihni çalıştıran ve ortaya çıkan sonuç ile şaşırtan güzel bir beyin oyunu sayılabilir. Aslında çözmek için kod yazmak veya çizelge oluşturmak gerekiyor. Çünkü sonuç gerçekten büyük (neredeyse googol sabiti kadar!) bir sayı. Soruyu türeten Ali Ağabey'in adaşı Ali Eskici:

Ali Eskici:
40 adet kutunun her birinin içinde 39 kutu,
Bu 39 kutunun her birinin içinde 38 kutu,
Bu 38 kutunun her birinin içinde 37 kutu,
...
Bu 3 kutunun her birinin içinde 2 kutu,
Bu 2 kutunun her birinin içinde 1 kutu bulunmaktadır.

Buna göre toplam kutu sayısı nedir?

Not: Dikkatli düşünün, cevap sandığınızdan çok farklı olabilir.

Kaynak: http://aliesoft.com/blog/?cat=3

Çözümü yanlış bulunmuş çünkü geçenlerde bunu Zeka Oyunları, Facebook grubunda tartışmıştık. Yani sitede an itibariyle yazdığı gibi sonuç "2.217.887.688.014.780*10^33" değil. Ama doğru cevabın x E+94 basamaklı olduğunu, 41. kutuda ise kendisi dahil toplam 6,22199762820005E+97 kutu içerdiğini söyleyebilirim!

Denklemi ise çok basit ama bir süre zihininiz ve belki parmaklarını çalıştırmanız için değerlerin ne olduğunu yazmayacağım...

xK = ((K * K1) + 1) * K2

Başarılar...

Benim bulduğum sonuç şu:

40: 2217887688014775253530164406871305824725601615872.

Bilimsel yazımla 2.21789e+48.

En dipteki kutular da doğru görünüyorlar:

0: 0
1: 1   1 kutunun her birinin içinde 0 kutu = 1 kutu
2: 4   2 kutunun her birinin içinde 1 kutu = 2 kutu + içindekiler = 4
3: 15  3 kutunun her birinin içinde 2 kutu = 3 kutu + içindekiler = 3 + 2*4=15
4: 64  vs.
...


Herhalde başkalarının da düştüğü bir hataya düşüyorumdur. :)

Ali
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ayrı başlık açtığınız için teşekkür ederim...:)

İsterseniz kodlar üzerinden gidelim ve belki D dilini sevdirmek açısından isabetli olabilir:
import std.bigint, std.stdio;
 
void main() {
    BigInt a;
 
    //3. adım için saydıralım:
    for (short b = 0; b <=3; b++) a = (a * b) + b;
    writefln ("3. adım (üç adet kutu içinde): %s kutu var! @HEX[%s]", a,toHex(a));
 
    //40. adım için saydıralım:
    for (short b = 0; b <=40; b++) a = (a * b) + b;
    writefln ("40. adım (kırk adet kutu içinde): %s kutu var! @HEX[%s]", a,toHex(a));
}
Çözümünüzü bu haliyle (xK=[a*b] + b) 40. ve bir kaç olasılıkla denedim uyuşuyorlar. Ancak dikkat ederseniz 3. kutudan değil 3 kutunun her birinin içinde 2*4 tane (+1 kendisi) kutu var diye yorumlamamız gerekiyor. Yani 2. adım doğru ama 3. adım yanlış.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sanırım 1 hafta oldu, en iyisi örnek kodları ekleyim ve evet doğru cevap sitedeki...:)
HEX [1_847D8608_0C971EE2_3A33BEC9_83398019_7E4AE1A0]
Yani 2217887688014775253706633418653155893774469751200 kutu var olacaktı. Çünkü olay Ali Çehreli'nin zarif sunumu gibi. Görsel şekilde ifade edersek:

[Resim: http://img851.imageshack.us/img851/4996/kirkkutu.gif]

/* 
 KIRKKUTU.d (12.02.2012)
 
(c) Copyright 2009 - Ali Eskici
===============================
40 adet kutunun her birinin içinde 39 kutu,
Bu 39 kutunun her birinin içinde 38 kutu,
Bu 38 kutunun her birinin içinde 37 kutu,
...
Bu 3 kutunun her birinin içinde 2 kutu,
Bu 2 kutunun her birinin içinde 1 kutu bulunmaktadır.
 
Buna göre toplam kutu sayısı nedir?
 
Soru metni: Ali Eskici
Denklem ve
Programlama: Salih Dinçer
*/
 
import std.algorithm, std.bigint, std.range, std.stdio;
 
struct KırkKutu {
    ulong a;
    short b;    
 
    enum empty = false;
 
    @property ulong front() const {
        return a;
    }
 
    void popFront() {
        a = (a * b) + b;
        b++;
    }
}
 
void main() {
    BigInt a;
    auto aralık = take(KırkKutu(), 20 + 2); // 20. kutu
 
    foreach (i, eleman; zip(sequence!"n"(), aralık)) {
        if (i>1) writeln(i-1, ". kutu: ", eleman);
    }
//  Bu aralık, ulong türünden dolayı 20. kutudan sonrasını yanlış listelemektedir!
    writeln ("\n12. kutu: ",
      reduce!"(a * b) + b"(0,
      iota (1, 12 + 1)        )
    );
//  Yukarıdaki çözüm, varsayılan türden dolayı en fazla 12. kutuyu gösterebilmektedir.
    for (short b = 0; b <=40; b++) a = (a * b) + b;     //  @HEX[4D9BE120]
//  BIGINT kütüphanesiyle istediğimiz değere çıkabiliyoruz...:)
    writefln ("\n40. adım (kırk adet kutu içinde): %s kutu var! @HEX[%s]", a,toHex(a));
}
41. kutu: 1
2. kutu: 4
3. kutu: 15
4. kutu: 64
5. kutu: 325
6. kutu: 1956
7. kutu: 13699
8. kutu: 109600
9. kutu: 986409
10. kutu: 9864100
11. kutu: 108505111
12. kutu: 1302061344
13. kutu: 16926797485
14. kutu: 236975164804
15. kutu: 3554627472075
16. kutu: 56874039553216
17. kutu: 966858672404689
18. kutu: 17403456103284420
19. kutu: 330665665962403999
20. kutu: 6613313319248080000

12. kutu: 1302061344

40. adım (kırk adet kutu içinde): 2217887688014775253706633418653155893774469751200 kutu var! @HEX[1_847D8608_0C971EE2_3A33BEC9_83398019_7E4AE1A0]
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj 4 defa değişti; son değiştiren: Salih Dinçer; zaman: 2012-02-11, 18:41.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hem de ne olanaklar kullanılmış! Aralıklar, algoritmalar, BigInt! :)

Ali
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Hem de ne olanaklar kullanılmış! Aralıklar, algoritmalar, BigInt! :)
Sonunda bu olanaklar ile Ali Eskici'yi kandırmayı başardım...:)

Az önce Swordfish adında üye oldu ve ilk iletisini buraya yazarak bizi şereflendireceğini tahmin ediyorum. Eminim çok katkıları olacaktır...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Az önce öğrendiğim (-bknz. Kesirli sayı işlem sıralarının etkileri) ve Ali Çehreli'nin özyineleme (recursive) işlevi kullanarak çözdüğü yöntemi de şu şekildeymiş:
real hesapla(size_t düzey) {
    return düzey ? düzey + düzey * hesapla(düzey - 1) : 0;
}
20. kutudan sonra hatalı göstermesi dışında basamak sayılarını doğru hesaplamasından dolayı çok çok başarılı buldum. Sonuçta uzun haneler ile işimiz yok ve bilimsel gösterim bile yeterli. Karşılaştırma için yukarıdaki işlevi (recursive function) aşağıdaki gibi BIGINT kütüphanesi ile birlikte kullanabilirsiniz:
void main() {
    BigInt a;
 
    foreach (b; 0..41) {
        writefln("%s\t %.0f", b, hesapla(b));
        a = (a * b) + b;        
        writefln("\t %s", a);
    }
}
Ali hocama çok çok teşekkür ediyorum...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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-11-23, 23:10:57 (UTC -08:00)