Xác định mức dư thừa


21

Một số dồi dào là một số nguyên n rằng bộ mới trên ràng buộc đối với tỷ lệ của nó với chức năng ước tổng σ. Nói cách khác, n là siêu thừa khi và chỉ khi, đối với tất cả các số nguyên dương x nhỏ hơn n :

σ(n)n>σ(x)x

Đối với một vài giá trị:

n   σ(n)   σ(n)/n   superabundant
1   1      1.0000   yes
2   3      1.5000   yes
3   4      1.3333   no
4   7      1.7500   yes
5   6      1.2000   no
6   12     2.0000   yes
7   8      1.1429   no
8   15     1.8750   no
9   13     1.4444   no

Một danh sách dài hơn về những điều này (đối với các trường hợp thử nghiệm) có thể được tìm thấy tại OEIS A004394 .

Một trường hợp kiểm tra âm tính rất được khuyến nghị (nếu trình thông dịch của bạn có thể xử lý nó) là 360360, vì nó liên kết với số siêu thừa cuối cùng.

Thử thách

Chương trình của bạn sẽ nhận một số nguyên dương duy nhất và đưa ra giá trị trung thực hoặc giá trị falsey cho biết số nguyên đó có thừa không.

Vì đây là , câu trả lời ngắn nhất bằng byte sẽ thắng.

Câu trả lời:


7

Thạch , 7 byte

Æs÷$ÞṪ=

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

Thạch , 8 byte

Æs÷$ÐṀ⁼W

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

Phòng thử nghiệm!

Giải trình

Æs ÷ $ ÐṀ⁼W ~ Chương trình đầy đủ (đơn âm).

    ÐṀ ~ Giữ các phần tử với giá trị liên kết tối đa (tự động đo).
~s ~ Tổng chia.
  $ ~ Chia cho phần tử hiện tại.
      W ~ Kiểm tra sự bằng nhau với đầu vào được bọc thành một đơn.
         ~ (đối với số nguyên như 360360)

Tôi nghĩ bạn có thể làm Æs÷$ÐṀ=cho 7 byte. Tôi đã không nhận ra ÐṀrangized, đó là hữu ích để biết.
dyl Nam

@dylnan Không tôi không thể. Mặc dù nó không thể được kiểm tra trực tuyến, nhưng nó thất bại 360360. Trên thực tế, đây là phiên bản ban đầu của tôi
Ông Xcoder

Tại sao nó thất bại cho 360360?
dyl Nam

@dylnan 360360là số đầu tiên nó sẽ thất bại (tôi nghĩ), bởi vì đó là số đầu tiên buộc một kết quả xảy ra trước đó. (và kết quả của chúng tôi sẽ là [0, 1])
Ông Xcoder

@ Mr.Xcoder Tôi thấy, cảm ơn
dylnan 19/12/17



4

Octave , 41 byte

@(n)([~,p]=max((x=1:n)*~mod(x,x')./x))==n

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

Giải trình

@(n)                                       % Define anonymous function of n
                x=1:n                      % Range from 1 to n. Call that x
                        mod(x,x')          % n×n matrix of all pair-wise moduli
                       ~                   % Logical negate. True means it's a divisor
               (     )*                    % Matrix-multiply x times the above matrix
                                           % (gives the dot product of vector x times
                                           % each column of the matrix)
                                 ./x       % Divide each column by each entry in x
     [~,p]=max(                     )      % Index of first occurrence of maximum
    (                                )==n  % Does it equal n?

3

J , 35 byte

Cảm ơn Mr.Xcoder đã tìm ra vấn đề và để giải quyết vấn đề!

[:([:*/{:>}:)@(%~>:@#.~/.~&.q:)1+i.

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


1
Điều này không thành công 360360(xem thử thách để biết thêm chi tiết: Một trường hợp thử nghiệm âm tính được khuyến nghị cao là 360360, vì nó liên quan đến số siêu dư cuối cùng. ).
Ông Xcoder

1
Đã sửa lỗi cho +3 byte. Hãy thử trực tuyến . Làm việc trên sân golf. Tôi thích việc sử dụng #.~rất nhiều (thành thật mà nói, toàn bộ hàm chia là thực sự tốt đẹp). Điều sai btw là, mặc dù suy nghĩ làm {:=>./là thông minh, nhưng nó không thỏa mãn phần "lớn hơn" của câu hỏi.
cole

1
Đây là những gì tôi đã đưa ra để thay thế chức năng sigma, hiện có cùng độ dài : (1#.{:(]*0=|~)])\ . Có gì đó không ổn với nó, có lẽ bạn có một vài suy nghĩ?
cole

1
@cole Các khoản tín dụng cho tổng số hàm chia cho Roger Hui, trong bài tiểu luận này . Tôi cũng đã bắt đầu viết một hàm sigma khác nhưng đã dừng lại sau khi tôi đạt 9 byte và quyết định nó sẽ không ngắn hơn hàm có thừa số nguyên tố. Cảm ơn đã khắc phục vấn đề!
Galen Ivanov

@cole Động từ ngắn nhất khác để tính tổng các ước số mà tôi nghĩ ra là: (1#.]*0=|~)1+i.Đây là một cái móc và không dễ dàng đặt vào vị trí đó :)
Galen Ivanov

3

Julia 0,6 , 52 byte

n->indmax(sum(x for x=1:m if m%x<1)//m for m=1:n)==n

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

Giải pháp này sử dụng số hữu tỷ để đảm bảo tính chính xác trong trường hợp bình đẳng. (Kiểm tra 360360 mất gần 10 phút.)

Sử dụng dấu phẩy động, 2 byte có thể được lưu với phân chia bên trái:

n->indmax(m\sum(x for x=1:m if m%x<1)for m=1:n)==n

3

Bình thường , 14 byte

( FryAmTheEggman đã lưu 1 byte)

qh.Mcs*M{yPZZS

Hãy thử nó ở đây! hoặc xem thêm các trường hợp thử nghiệm.

Chỉ cần đệ trình Pyth bắt buộc của tôi mà rất có thể là golf.

Làm sao?

qh.Mcs * M {yPZZS ~ Chương trình đầy đủ. Q = đầu vào.

             S ~ Các số nguyên trong phạm vi [1, Q].
  .M ~ Lấy các phần tử có giá trị hàm tối đa.
    cs * M {yPZZ ~ Hàm khóa: sử dụng biến Z.
         yPZ ~ Quyền hạn của các yếu tố chính của Z.
        {~ Không trùng lặp.
      * M ~ Sản phẩm của mỗi.
     s ~ Và tóm tắt.
    c Z ~ Chia cho Z.
 h ~ Phần tử đầu tiên.
q ~ Kiểm tra sự bằng nhau với đầu vào. Đầu ra là Đúng hoặc Sai.

3

05AB1E , 10 byte

LÑOā/ZQ¨_P

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

L            # push range [1 ... input]
 Ñ           # divisors of each
  O          # sum of each
   ā/        # divide each by its 1-based index
     Z       # get max
      Q      # compare to each
       ¨     # remove the last element
        _    # logical negation
         P   # product

Tôi nghĩ (mặc dù tôi không chắc chắn) điều này không thành công 360360(xem thử thách để biết thêm chi tiết: Một trường hợp thử nghiệm âm tính được khuyến nghị cao là 360360, vì nó liên quan đến số siêu dư cuối cùng. ).
Ông Xcoder

@ Mr.Xcoder: Đúng. Đã sửa nó, nhưng có thể có một cách tốt hơn để làm điều này ngay bây giờ.
Emigna


2

R sử dụng numbers, 59 byte

f=function(n)which.max(sapply(1:n,numbers::Sigma)/(1:n))==n

2

Toán học, 53 50 byte

a=Tr@Divisors@#/#&;AllTrue[a@#-Array[a,#-1],#>0&]&

Chức năng thuần túy. Lấy một số nguyên làm đầu vào và trả về Truehoặc Falselà đầu ra.


Một cái gì đó như Tr@Divisors@#làm việc?
dùng202729

1

Japt v2.0a0, 12 16 byte

Mất trí não dường như không thể cải thiện điều này hơn nữa!

Trả về 1cho sự thật hoặc 0cho falsey.

Æâ x÷U >Xâ x÷XÃ×

Thử nó

Hy sinh 4 byte để xử lý 360360.


Giải trình

  • Đầu vào ngầm định của số nguyên U.
  • Æ Ãtạo một mảng các số nguyên từ 0đến U-1và chuyển từng thông qua hàm sau như X.
  • âđược các ước của U.
  • ÷Uchia mỗi người cho U.
  • x tổng hợp kết quả.
  • được các ước của X.
  • ÷Xchia mỗi người cho X.
  • x tổng hợp kết quả.
  • > kiểm tra nếu kết quả đầu tiên lớn hơn kết quả thứ hai.
  • × làm giảm mảng kết quả của booleans bằng cách nhân.

1
Nếu cách tiếp cận hiện tại của bạn phù hợp với lời giải thích của bạn, thì nó không thành công 360360hoặc các số nguyên như vậy: Một trường hợp kiểm tra âm tính được đề xuất cao (nếu thông dịch viên của bạn có thể xử lý nó) là 360360, bởi vì nó liên quan đến số siêu thừa cuối cùng
Ông Xcoder

@ Mr.XCoder: Nuts, bạn nói đúng! Điều đó có thể sẽ khiến tôi mất một số byte khi tôi có thời gian để sửa nó.
Xù xì

@ Mr.Xcoder: Đã sửa lỗi ngay bây giờ, sẽ phải quay lại sau để xem tôi có thể cải thiện nó không.
Xù xì

0

APL + THẮNG, 37 byte

 ↑1=⍒⌽(+/¨((0=(⍳¨n)|¨n)×⍳¨n)~¨⊂0)÷n←⍳⎕

Nhắc nhở cho màn hình nhập.


0

C (gcc), 99 byte

s(n,j,k){for(j=k=0;j++<n;)k+=n%j?0:j;n=k;}f(n,i,r){for(i=r=0;++i<n;)r=1.*s(n)/n<1.*s(i)/i?:r;r=!r;}

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

C, 108 byte

float s(n,j,k){for(j=k=0;j++<n;)k+=n%j?0:j;return k;}f(n,i,r){for(i=r=0;++i<n;)s(n)/n<s(i)/i&&++r;return!r;}

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


Vì vậy, tại sao scần phải trả lại một float?
Nissa

@StephenLeppik Để sử dụng phép chia float thay vì chia số nguyên khi so sánh s(n)/nvới s(i)/i.
Steadybox

0

Swift , 120 118 byte

let s={n in Float((1...n).reduce(0){n%$1>0 ?$0:$0+$1})}
{n in(1..<n).reduce(0){max($0,s($1)/Float($1))}<s(n)/Float(n)}

Mất một thời gian (khoảng 6 giây trên TIO) để biên dịch vì các khai báo kiểu ngầm định trong Swift.

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



0

Funky , 79 byte

d=n=>fors=i=0i<=n i++s+=i*!n%i
f=n=>{forc=1c<n c++if(d(n)/n)<=d(c)/c return0 1}

Giải thích

Điều này đầu tiên xác định chức năng dσchức năng và đây là phiên bản chơi gôn của

function d(n){
    var s = 0;
    for(var i=0; i<n; i++){
        if(n%i == 0){
            s += i;
        }
    }
    return s;
}

Chúng tôi có thể thiết lập i đến 0, bởi vì i*n%0sẽ luôn luôn bằng 0*..., do đó 0.

Nửa tiếp theo của định nghĩa hàm fnày là hàm Superabandunce và nó chỉ là dạng được đánh gôn

function f(n){
    for(var c=1; c<n; c++){
        if( (d(n)/n) <= (d(c)/c) ){
            return 0;
        }
    }
    return 1;
}

Và điều này chỉ kiểm tra, như thông số thách thức cho thấy, tất cả các số nguyên từ 1 đến n-1 có d(n)/nít hơn đầu vào.

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



0

Husk , 9 byte

εü<m§ṁ/Ḋṫ

Hãy thử trực tuyến! Quá chậm cho trường hợp thử nghiệm 360360.

Giải trình

εü<m§ṁ/Ḋṫ  Implicit input, say n=6.
        ṫ  Decreasing range: [6,5,4,3,2,1]
   m       Map this function (example argument k=4):
       Ḋ    Divisors of k: [1,2,4]
    §ṁ      Map and sum
      /     division by k: 7/4
           Result: [2,6/5,7/4,4/3,3/2,1]
 ü         Remove duplicates by
  <        strict comparison. This greedily extracts a non-decreasing subsequence: [2]
ε          Is it a singleton list? Yes.

Tôi nhận được £ü¤<§ṁ/ḊN. Tạo toàn bộ danh sách các số thừa
H.PWiz

0

Perl 5, 84 byte

say!grep$a[-1]<=$a[$_],0..(@a=map{$i=$_;my$j;map{$i%$_ or$j+=$_/$i}1..$i;$j}1..<>)-2

yêu cầu -E(miễn phí)

thực hiện đơn giản các đặc điểm kỹ thuật, đánh golf


0

APL (NARS), 61 ký tự, 122 byte

r←f w;m;k
r←m←0
r+←1⋄k←r÷⍨11πr⋄→3×⍳r≥w⋄→2×⍳∼m<k⋄m←k⋄→2
r←k>m

11π là tổng hàm của các thừa số

  (⍳9),¨ f¨1..9
1 1  2 1  3 0  4 1  5 0  6 1  7 0  8 0  9 0 
  f 360360
0
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.