Tính số thấp nhất trong đó tổng của dãy số vượt quá một giá trị đã cho


14

Cho bạn có một dãy số vô hạn được xác định như sau:

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
...

Chuỗi là tổng của các ước của n, bao gồm 1 và n.

Cho một số nguyên dương xlàm đầu vào, tính số thấp nhất nsẽ tạo ra kết quả lớn hơn x.

Các trường hợp thử nghiệm

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

Sản lượng dự kiến

Chương trình của bạn sẽ trả về cả hai n và tổng của các ước của nó, như vậy:

$ ./challenge 100
48,124

Quy tắc

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte, trong mỗi ngôn ngữ sẽ thắng.


4
Có phải chuỗi đó chỉ là tổng của nước số? Có lẽ bạn sẽ muốn nói rõ điều đó.
Martin Ender

3
Ngoài ra, đánh giá theo "đầu ra dự kiến" của bạn, bạn muốn cả hai n f(n) , nhưng bạn không nói như vậy ở bất cứ đâu trong đặc tả.
Martin Ender

2
Tiền thưởng rất tệ , đặc biệt là khi chúng mơ hồ. Tôi quyết định loại bỏ nó, để bảo vệ điều này khỏi bị hạ cấp.
Ông Xcoder

2
Bạn có thể kiểm tra lại f(1000) = 48? Tổng số chia của 48124
caird coinheringaahing

3
Thật tốt khi chờ đợi ít nhất một tuần trước khi chấp nhận câu trả lời, nếu không bạn có thể không khuyến khích các giải pháp mới.
Zgarb

Câu trả lời:


8

Brachylog , 9 byte

∧;S?hf+S>

Chương trình này lấy đầu vào từ "biến đầu ra" .và xuất ra "biến đầu vào" ?. Hãy thử trực tuyến!

Giải trình

∧;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.

Biến ẩn Nđược liệt kê theo thứ tự tăng dần, vì vậy giá trị pháp lý thấp nhất của nó được sử dụng cho đầu ra.


10

Thạch , 18 12 11 10 byte

1Æs>¥#ḢṄÆs

Hãy thử trực tuyến!

-1 byte nhờ ông Xcoder !

Làm thế nào nó hoạt động

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

Bạn có thể giải thích tại sao 1cần thiết và làm thế nào các ¥hành vi?
dyl Nam

1
@dylnan Việc 1bảo #bắt đầu đếm từ 1 và ¥lấy hai liên kết trước ( Æs>) và áp dụng chúng như một dyad (nghĩa là có hai đối số), với đối số bên trái là lần lặp và đối số bên phải là đầu vào.
caird coinheringaahing

Oh, điều đó có ý nghĩa bây giờ. #đã có một chút bối rối với tôi trước đây trong một số trường hợp.
dylnan

4

Ngôn ngữ Wolfram (Mathicala) , 53 byte

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

Hãy thử trực tuyến!

Thử tất cả các giá trị giữa 2 và x + 1, trong đó x là đầu vào.

(Trả Selectvề một danh sách tất cả các giá trị hoạt động, nhưng hàm {#,f@#}&lấy tất cả các giá trị này làm đầu vào, và sau đó bỏ qua tất cả các đầu vào của nó, ngoại trừ đầu tiên.)



4

Husk , 12 11 byte

§eVḟ>⁰moΣḊN

-1 byte, nhờ @Zgarb!

Hãy thử trực tuyến!


Tài giỏi! Thật kỳ lạ mặc dù làm thế nào ,không hoạt động (hoặc suy luận mất quá nhiều thời gian?).
ბიმო

Nó suy ra một kiểu, nhưng đưa ra một danh sách vô hạn. Nó có thể được gây ra bởi sự quá tải của lấy một số nguyên làm đối số thứ hai, nhưng đó chỉ là dự đoán.
Zgarb


4

Japt , 15 byte

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

Thử nó


Giải trình

Đầu vào ngầm định của số nguyên U. []là gói bọc của chúng tôi. Đối với phần tử đầu tiên, @ }alà một hàm chạy liên tục cho đến khi nó trả về giá trị trung thực, tự truyền một số nguyên tăng dần (bắt đầu từ 0) mỗi lần và xuất giá trị cuối cùng của số nguyên đó. âlấy các ước của số nguyên hiện tại ( X), tính xtổng chúng và kết quả đó được gán cho biến V. <kiểm tra nếu Uít hơn V. Phần tử thứ hai trong mảng là chỉ V.


4

Clojure , 127 byte

(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))))

Hãy thử trực tuyến!

cảm ơn @steadybox cho -4 byte!


1
Chào mừng đến với trang web!
caird coinheringaahing

Một số khoảng trắng có thể được loại bỏ để lưu một vài byte. Hãy thử trực tuyến!
Steadybox

Trong trường hợp này reducecó thể được thay thế bằng apply, chức năng ecó thể được biểu thị dưới dạng hàm ẩn danh thông qua #(...)cú pháp, bạn không cần đặt tên cho nó tại Code Golf. #(=(rem n %)0)ngắn hơn #(zero?(rem n %)). Và hãy nhớ rằng đó ,là khoảng trắng và có thể được loại bỏ trong trường hợp này vì nó được theo sau (, vì vậy nó sẽ được phân tích cú pháp chính xác.
NikoNyrh

@NikoNyrh rất vui được gặp một đồng nghiệp clojurist, tôi sẽ sớm chỉnh sửa bài đăng này
Alonoaky

3

Ruby , 58 byte

Chương trình đầy đủ bởi vì tôi không chắc chắn nếu lambdas được cho phép. /nhún vai

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

Hãy thử trực tuyến!

Giải trình

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
Lambdas chắc chắn được cho phép.
Giuseppe

3

JavaScript (ES6), 61 58 byte

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>

Chỉnh sửa: Đã lưu 3 byte nhờ @Arnauld.


Tôi nhận được "Lỗi script." khi nhập giá trị trên 545
StudleyJr

Hãy thử sử dụng Safari; rõ ràng nó hỗ trợ Tối ưu hóa cuộc gọi Tail. (Hoặc nếu bạn có thể tìm thấy chúng, một số phiên bản Chrome kích hoạt nó thông qua "Tính năng JavaScript thử nghiệm".)
Neil



2

SOGL V0.12 , 14 byte

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

Hãy thử nó ở đây!

Giải trình:

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 byte

`@Z\sG>~}@6M

Hãy thử trực tuyến!

Giải trình

`      % 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

Yếu tố , 88

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

Tìm kiếm lực lượng vũ phu. Đó là một trích dẫn (lambda), callvới xchồng, lá nf(n) trên ngăn xếp.

Như một từ:

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

2

Python 3, 163 byte

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
Xin chào và chào mừng đến với PPCG; bài viết đầu tiên tốt đẹp! Từ khía cạnh chơi gôn, bạn có thể lưu một số byte bằng cách xóa khoảng trắng, sử dụng các hàm lambda, thu gọn mọi thứ trên một dòng và không lặp lại chính mình. Chúng tôi cũng thường liên kết với một môi trường thử nghiệm trực tuyến, ví dụ như TIO ( 105 byte , sử dụng các kỹ thuật được mô tả ở trên.)
Jonathan Frech

@JonathanFrech: Nhận xét tuyệt vời. Cảm ơn sự kiên nhẫn của bạn với những người không nói chung và noobnói riêng;)
Eric Duminil

2

Python 3 , 100 byte

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))

Hãy thử trực tuyến!

Nhờ vào Jonathan Frech nhận xét của về lần thử python 3 trước đó, tôi đã mở rộng đáng kể kiến ​​thức về cú pháp python. Tôi chưa bao giờ nghĩ đến thủ thuật - ~ i cho i + 1, giúp lưu hai ký tự.

Tuy nhiên, câu trả lời đó là 1) không phải là tối thiểu và 2) không hoạt động đối với x = 1 (do lỗi không dễ xảy ra trong khi đi vì sự ngắn gọn; tôi đề nghị mọi người khác kiểm tra câu trả lời của họ cho cạnh này trường hợp!).

Giải thích nhanh: sum(i+1for i in range(y)if y%-~i<1)tương đương sum(i for i in range(1,y+1)if y%i<1)nhưng lưu hai ký tự. Một lần nữa xin cảm ơn ông Frech.

d=lambda y:sum(i+1for i in range(y)if y%-~i<1) do đó trả về các ước của y.

f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))là nơi tôi thực sự đã làm việc Vì so sánh một tuple hoạt động theo thứ tự từ điển, chúng ta có thể so sánh j, d (j) dễ dàng như chúng ta có thể so sánh j và điều này cho phép chúng ta không phải tìm j tối thiểu, lưu trữ trong một biến và / sau đó / tính toán tuple trong một hoạt động riêng biệt. Ngoài ra, chúng ta phải có <=, không phải <, in x<=d(j), vì d (1) là 1 nên nếu x là 1 bạn không nhận được gì. Đây cũng là lý do tại sao chúng ta cần range(x+1)và không range(x).

Trước đây tôi đã trả lại tuple, nhưng sau đó tôi phải đăng ký nó trong f, để có thêm ba ký tự.


1
Chào mừng đến với trang web và bài viết đầu tiên tốt đẹp. Bạn có thể nhận được tới 98 byte bằng cách loại bỏ các f=hàm ẩn danh là hoàn toàn chấp nhận được ở đây!
caird coinheringaahing

Bạn không thể gọi một hàm ẩn danh từ một dòng mã khác, là vấn đề - Tôi có một câu lệnh in (f (100)) riêng để kiểm tra xem hàm đó có hoạt động không.
Michael Boger

Đó không phải là một vấn đề ở đây. Nó hoàn toàn chấp nhận được và hoạt động để không bao gồm số f=byte của bạn và là một cách tốt để chơi gôn trong Python. Kiểm tra điều này để biết thêm mẹo chơi gôn trong Python!
caird coinheringaahing

Hừm. Tôi có thể bằng, nhưng không tốt hơn, trình của tôi bằng cách nối thêm q=rangevà thay thế rangebằng qtrong cả hai trường hợp hiện có. Đáng buồn thay, điều này không cải thiện nó và vì lambda là một từ khóa tôi không thể sử dụng nó cho điều đó, tôi phải thực hiện các thủ thuật exec () lãng phí quá nhiều ký tự.
Michael Boger

@MichaelBoger Vâng, bạn có thể gọi một hàm ẩn danh trong Python; biểu thức lambda không phải được gán cho một biến.
Jonathan Frech

2

Python 2 , 81 byte

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

Hãy thử trực tuyến!



Việc thay thế các tab bằng hai khoảng trắng làm cho công việc này trong python 3 ở mức 83 byte, mặc dù để thử nó, tôi đã phải đặt dấu ngoặc đơn trong câu lệnh in. Bạn cũng có thể thay thế câu lệnh return bằng câu lệnh in và không cần chức năng phụ trợ để in nó; các byte giữ nguyên.
Michael Boger



0

Clojure, 102 byte

#(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 byte

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.