Şimdi Ara

Leyland sayılarını listelemek

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
7
Cevap
0
Favori
247
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Leyland sayısının tanımı:
    https://tr.wikipedia.org/wiki/Leyland_sayısı
    1-100,000,000,000 arasındaki leyland sayılarını listeleyen kod yazınız.

    Programın çalışması birkaç saniyeden uzun sürüyorsa kaç saniye sürdüğünü de (kabaca) not düşünüz.



    < Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 8 Ekim 2020; 22:38:25 >
    < Bu ileti mini sürüm kullanılarak atıldı >



  • Spoiler,

    mesajı görmek için tıklayın.
    [print(el) if el>0 else 0 for el in sorted([(i**j+j**i) if(i**j+j**i)<=1e11 else -1 for i in range(2,50) for j in range(i,50)])]x^50 > 1e11 (x>=2) o yuzden her sayi icin 50 ye kadar saymak yeterli.
  • hynx kullanıcısına yanıt
    güzel çözüm fakat her sayı için 50'ye kadar saymaya gerek yok cunku en düşük Leyland sayısı bile 2 üssü 50 16 basamak olur. aslında bu soruda sayma aralığını da belirlemek gerekli. Internette baktığımda birçok kişi onu 32 ve 31 olarak almış. 100 milyara kadar sayılar için onu 31 olarak belirleyelim. Raku ile çözüm son derece kısa:
    .say for squish(sort [X[&({$^a**$^b+$b**$a})]] 2..31,2..31)[^103]


    tabi ki burada 100 milyara kadar 102 adet Leyland sayısı olduğunu önceden hesaplayıp 102 adeti* hard code olarak girdiğim için de çözüm kısa oldu.

    *Sondaki ^103, listeden 102 adetini al demek :)

    < Bu ileti mini sürüm kullanılarak atıldı >
  • 103 hile olmus biraz, 50 sayilmaz ama 

  • hynx kullanıcısına yanıt
    range i 50 olarak alınca 100 milyara kadar Leyland sayılarının sayısı da artıyor. range o açıdan önemli. yarın 103 adeti hardcode değil de programatik olarak kontrol eden yordam eklerim, yine de Python'dan kısa olur :)

    < Bu ileti mini sürüm kullanılarak atıldı >
  • dün gece probleme odaklandığım içn aklıma hiç gelmedi; grep ile sorunu halletim :)

    Kod

    Yığını:
    .say for grep {$_ < 1E11}, squish(sort [X[&({$^a**$^b+$b**$a})]] 2..32,2..32)

    şimdi bu kodu C++'a portlamayı düşünüyorum.


    Ortadaki cross operatörü 'X' 2 adet 2..32 dizisini kendisine verilen closure fonksiyonu ile indirgeyerek (reduction) Leyland sayılarını buluyor. C++17'de reduce fonksiyonu var, o kolay, baştaki squish 'unique' degerleri çekiyor o da kolay ama cros operatörüne closure verme işlemini yapmak zor; biraz araştırmam gerek.




    < Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 10 Ekim 2020; 15:29:9 >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.