Sayı dizisi toplamının belirli bir değeri aştığı en düşük sayıyı hesaplama


14

Aşağıdaki gibi tanımlanmış sonsuz bir sayı diziniz olduğu göz önüne alındığında:

1: 1 = 1
2: 1 + 2 = 3
3: 1 + 3 = 4
4: 1 + 2 + 4 = 7
5: 1 + 5 = 6
6: 1 + 2 + 3 + 6 = 12
7: 1 + 7 = 8
...

Dizi, n1 ve dahil bölücülerin toplamıdır n.

xGirdi olarak pozitif bir tamsayı verildiğinde , ndaha büyük bir sonuç üretecek en düşük sayıyı hesaplayın x.

Test senaryoları

f(100) = 48, ∑ = 124
f(25000) = 7200, ∑ = 25389
f(5000000) = 1164240, ∑ = 5088960

Beklenen çıktı

Programınız hem n bu şekilde hem de bölenlerinin toplamını döndürmelidir :

$ ./challenge 100
48,124

kurallar

Bu kod-golf yani her dilde bayt, en kısa kodu kazanır.


4
Bu dizi sadece nbölenlerin toplamı mıdır? Muhtemelen bunu açıkça belirtmek isteyeceksiniz.
Martin Ender

3
Ayrıca, "beklenen çıktı" ile yargılamak hem istiyorum n ve f(n) , ama şartname hiçbir yerde böyle söylemezsiniz.
Martin Ender

2
Bonuslar , özellikle belirsiz olduklarında kötüdür . Bunu indirilmekten korumak için kaldırmaya karar verdim.
Bay Xcoder

2
Tekrar kontrol edebilir misiniz f(1000) = 48? 48124
Divisor

3
Bir cevabı kabul etmeden önce en az bir hafta beklemek iyidir, aksi takdirde yeni çözümleri önleyebilirsiniz.
Zgarb

Yanıtlar:


8

Brachylog , 9 bayt

∧;S?hf+S>

Bu program "çıkış değişkeni" nden girdi alır .ve "girdi değişkeni" ne çıkar ?. Çevrimiçi deneyin!

açıklama

∧;S?hf+S>
∧;S        There is a pair [N,S]
   ?       which equals the output
    h      such that its first element's
     f     factors'
      +    sum
       S   equals S,
        >  and is greater than the input.

Örtük değişken Nartan düzende sıralanır, dolayısıyla çıktı için en düşük yasal değeri kullanılır.


10

Jöle , 18 12 11 10 bayt

1Æs>¥#ḢṄÆs

Çevrimiçi deneyin!

Bay Xcoder sayesinde -1 bayt !

Nasıl çalışır

1Æs>¥#ḢṄÆs - Main link. Argument: n (integer)
1   ¥#     - Find the first n integers where...
 Æs        -   the divisor sum
   >       -   is greater than the input
       Ṅ   - Print...
      Ḣ    -   the first element
        Æs - then print the divisor sum

Bunun neden 1gerekli olduğunu ve ¥eylemlerin nasıl yapıldığını açıklayabilir misiniz ?
dylnan

1
@dylnan 1'den saymaya başlamayı 1söyler ve önceki iki bağlantıyı alır ( ve ) ve bunları bir ikili olarak (yani iki argümanla) uygular; sol argüman yinelemedir ve sağ argüman girdi olur. #¥Æs>
caird coinheringaahing

Ah, şimdi mantıklı. #bazı durumlarda biraz kafa karıştırıcı olmuştu.
dylnan

4

Wolfram Dili (Mathematica) , 53 bayt

{#,f@#}&@@Select[Range[x=#]+1,(f=Tr@*Divisors)@#>x&]&

Çevrimiçi deneyin!

2 ile x + 1 arasındaki tüm değerleri dener, burada x giriştir.

(Çalışan Selecttüm değerlerin bir listesini döndürür, ancak işlev {#,f@#}&bunların tümünü girdi olarak alır ve sonra ilki hariç tüm girdilerini yok sayar.)



4

Kabuk , 12 11 bayt

§eVḟ>⁰moΣḊN

-1 byte, @Zgarb sayesinde!

Çevrimiçi deneyin!


Zeki! Yine de nasıl ,çalışmıyor (ya da çıkarım çok uzun sürüyor?).
ბიმო

Bir türü çıkarır, ancak sonsuz bir liste çıkarır. İkinci argüman olarak bir tamsayıyı alan ḟ aşırı yüklenmesinden kaynaklanabilir, ancak bu sadece bir tahmindir.
Zgarb


4

Japt , 15 bayt

[@<(V=Xâ x}a V]

Dene


açıklama

Örtük tamsayı girişi U. []bizim dizi sarıcı. İlk eleman için, @ }adoğruluk değeri döndürene kadar sürekli çalışan, kendisine her seferinde artan bir tamsayıyı (0'dan başlayarak) ileten ve bu tamsayının son değerini çıktılayan bir işlevdir. âgeçerli tamsayının ( X) bölücülerini alır, toplar xve bu sonuç değişkene atanır V. <eğer kontroller Udaha azdır V. Dizideki ikinci öğe sadece olur V.


4

Clojure , 127 bayt

(defn f[n](reduce +(filter #(zero?(rem n %))(range 1(inc n)))))
(defn e[n](loop[i 1 n n](if(>(f i)n){i,(f i)}(recur(inc i)n))))

Çevrimiçi deneyin!

-4 bayt için @steadybox'a teşekkürler!


1
Siteye Hoşgeldiniz!
caird coinheringaahing

Bazı boşluklar birkaç bayt kaydetmek için kaldırılabilir. Çevrimiçi deneyin!
Steadybox

Bu durumda reducedeğiştirilebilir apply, ayrıca işlev sözdizimi earacılığıyla anonim bir işlev olarak ifade edilebilir #(...), Code Golf'te adlandırmanıza gerek yoktur. #(=(rem n %)0)daha kısadır #(zero?(rem n %)). Ve bunun ,boşluk olduğunu ve bu durumda izlendiği gibi kaldırılabileceğini unutmayın (, böylece doğru şekilde ayrıştırılacaktır.
NikoNyrh

@NikoNyrh dost bir clojurist ile tanışmak güzel, yakında bu
yazıyı

3

Yakut , 58 bayt

Tam program çünkü lambdalara izin verilip verilmediğinden emin değilim. / omuz silkme

gets
$.+=1until$_.to_i.<v=(1..$.).sum{|n|$.%n<1?n:0}
p$.,v

Çevrimiçi deneyin!

açıklama

gets     # read line ($_ is used instead of v= because it cuts a space)
$.+=1    # $. is "lines read" variable which starts at 1 because we read 1 line
    until     # repeat as long as the next part is not true
$_.to_i  # input, as numeric
  .<v=   # is <, but invoked as function to lower operator prescedence
  (1..$.)        # Range of 1 to n
  .sum{|n|       # .sum maps values into new ones and adds them together
     $.%n<1?n:0  # Factor -> add to sum, non-factor -> 0
  }
p$.,v    # output n and sum

3
Lambdalara kesinlikle izin verilir.
Giuseppe

3

JavaScript (ES6), 61 58 bayt

f=(n,i=1,s=j=0)=>j++<i?f(n,i,i%j?s:s+j):s>n?[i,s]:f(n,++i)
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

Düzenleme: @Arnauld sayesinde 3 bayt kaydedildi.


"Komut dosyası hatası" alıyorum.
545'in

Safari'yi kullanmayı deneyin; Görünüşe göre Kuyruk Çağrı Optimizasyonu'nu destekliyor. (Ya da bulabilirseniz, Chrome'un bazı sürümleri "Deneysel JavaScript özellikleri" aracılığıyla etkinleştirir.)
Neil



2

SOGL V0.12 , 14 bayt

1[:Λ∑:A.>?ao←I

Buradan Deneyin!

Açıklama:

1               push 1
 [              while ToS != 0
  :Λ              get the divisors
    ∑             sum
     :A           save on variable A without popping
       .>?  ←     if greater than the input
          ao        output the variable A
            ←       and stop the program, implicitly outputting ToS - the counter
             I    increment the counter


2

MATL , 12 bayt

`@Z\sG>~}@6M

Çevrimiçi deneyin!

açıklama

`      % Do...while
  @    %   Push iteration index (1-based)
  Z\   %   Array of divisors
  s    %   Sum of array
  G    %   Push input
  >~   %   Greater than; logical negate. This is the loop condition
}      % Finally (execute on loop exit)
  @    %   Push latest iteration index
  6M   %   Push latest sum of divisors again
       % End (implicit). Run new iteration if top of the stack is true
       % Display stack (implicit)




2

Faktör , 88

USE: math.primes.factors [ 0 0 [ drop 1 + dup divisors sum pick over > ] loop rot drop ]

Kaba kuvvet arama. Bu, bir tırnak (lambda) var callile xyığın yapraklarda nve f(n)yığında.

Tek kelimeyle:

: f(n)>x ( x -- n f(n) )
  0 0 [ drop 1 + dup divisors sum pick over > ] loop rot drop ;

2

Python 3, 163 bayt

def f(x):
    def d(x):return[i for i in range(1,x+1) if x%i==0]
    return min(i for i in range(x) if sum(d(i)) >x),sum(d(min(i for i in range(x) if sum(d(i)) >x)))

3
Merhaba ve PPCG'ye hoş geldiniz; güzel ilk yazı! Golf açısından, boşlukları kaldırarak, lambda işlevlerini kullanarak, her şeyi tek bir satıra daraltarak ve kendinizi tekrar etmeyerek bazı baytlar kaydedebilirsiniz. Ayrıca genellikle TIO gibi çevrimiçi bir test ortamına da bağlanırız ( yukarıda açıklanan teknikleri kullanarak 105 bayt ).
Jonathan Frech

@JonathanFrech: Mükemmel yorum. Genel olarak ve noobözellikle de
noobies

2

Python 3 , 100 bayt

d=lambda y:sum(i+1for i in range(y)if y%-~i<1)
f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))

Çevrimiçi deneyin!

Jonathan Frech'in önceki python 3 girişimi hakkındaki yorumu sayesinde , python sözdizimi hakkındaki bilgilerimi büyük ölçüde genişlettim. Asla iki karakteri koruyan - ~ i için i + 1 hilesini düşünmemiştim.

Bununla birlikte, bu cevap 1) minimal değildir ve 2) x = 1 için işe yaramaz (kısalık için yapılırken yapılması kolay bir tekil hata nedeniyle; Herkesin bu kenar için cevaplarını kontrol etmesini öneririm durum!).

Hızlı açıklama: sum(i+1for i in range(y)if y%-~i<1)eşdeğerdir sum(i for i in range(1,y+1)if y%i<1)ancak iki karakter kaydeder. Bay Frech'e tekrar teşekkürler.

d=lambda y:sum(i+1for i in range(y)if y%-~i<1) bu nedenle y'nin bölücülerini döndürür.

f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))gerçekten iş yaptığım yer. Bir tuple karşılaştırması sözlük sırasına göre çalıştığından, j, d (j) j'yi karşılaştırabildiğimiz kadar kolay bir şekilde karşılaştırabiliriz ve bu da en az j'yi bulmamıza, bir değişkende saklamamıza ve ayrı bir işlemde tuple. Ayrıca, x<=d(j)d (1) 1 olduğu için x = değil, <= olmalı, yani x 1 ise hiçbir şey elde edemezsiniz . Bu yüzden ihtiyacımız var range(x+1), değil range(x).

Daha önce d tuple dönecekti, ama sonra f olarak abone olmalıyım, bu yüzden üç karakter daha alır.


1
Siteye ve güzel ilk gönderiye hoş geldiniz. Burada anonim işlevler mükemmel kabul edilebilir olarak kaldırarak 98 bayt alabilirsiniz f=!
caird coinheringaahing

Başka bir kod satırından anonim bir işlevi çağıramazsınız, sorun - işlevin çalışıp çalışmadığını test etmek için ayrı bir print (f (100)) deyim var.
Michael Boger

Burada sorun değil. Bu var mükemmel kabul edilebilir ve içermeyecek şekilde çalışır f=sizin bayt sayısında, ve Python golf için iyi bir yoldur. Python'da daha fazla golf ipucu için bunu kontrol edin !
caird coinheringaahing

Hm. Ben eşit, ancak daha iyi değil, ekleyerek benim sunulması q=rangeve değiştirme rangeile qhem mevcut durumda. Ne yazık ki, bu onu geliştirmez ve lambda bunun için kullanamayacağım bir anahtar kelime olduğundan, çok fazla karakter harcayan exec () hileleri yapmak zorunda kalırdım.
Michael Boger

@MichaelBoger Python'da anonim bir işlev çağırabilirsiniz ; lambda ifadelerinin bir değişkene atanması gerekmez.
Jonathan Frech

2

Python 2 , 81 bayt

def f(n):
 a=b=0
 while b<n:
	a+=1;i=b=0
	while i<a:i+=1;b+=i*(a%i<1)
 return a,b

Çevrimiçi deneyin!



Sekmeleri iki boşlukla değiştirmek, 83 baytta python 3'te bu işi yapar, ancak denemek için print deyiminde parantez koymak zorunda kaldım. Dönüş ifadesini bir print ifadesiyle de değiştirebilirsiniz ve yazdırmak için yardımcı bir işleve gerek yoktur; baytlar aynı kalır.
Michael Boger



0

Clojure, 102 bayt

#(loop[i 1](let[s(apply +(for[j(range 1(inc i)):when(=(mod i j)0)]j))](if(> s %)[i s](recur(inc i)))))

0

PHP, 69 bayt

for(;$argv[1]>=$t;)for($t=$j=++$i;--$j;)$t+=$i%$j?0:$j;echo$i,',',$t;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.