确定丰度


21

丰数是一个整数n,它为除数和函数 σ的比率设置了一个新的上限。换句话说,当且仅当对于小于n的所有正整数x而言,n才是多余的:

σ(n)n>σ(x)x

对于一些值:

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

这些的较长列表(用于测试用例)可以在OEIS A004394中找到

一个强烈推荐的否定测试用例(如果您的口译员可以处理的话)是360360,因为它与最后一个多余的数字联系在一起。

挑战

您的程序应采用单个正整数,并输出表示该整数是否过多的真实或错误值。

因为这是,所以最短的答案以字节为单位。

Answers:


7

果冻,7个字节

Æs÷$ÞṪ=

在线尝试!

果冻,8字节

Æs÷$ÐṀ⁼W

在线尝试!

测试套件!

说明

÷s÷$ÐṀ⁼W〜完整程序(单声道)。

    ÐṀ〜保持链接值最大的元素(自动调整范围)。
Æs〜除数之和。
  ÷$〜除以当前元素。
      ⁼W〜检查输入是否包装为单例是否相等。
         〜(用于360360等整数)

我认为您可以做到Æs÷$ÐṀ=7个字节。我没有意识到ÐṀ范围,这是很有用的。
dylnan '17

@dylnan不,我不能。尽管无法在线对其进行测试,但无法通过测试360360。事实上,这是我最初的版本
Xcoder先生

为什么会失败360360
dylnan '17

@dylnan 360360是它失败的第一个数字(我认为),因为它是第一个将之前发生的结果联系起来的数字。(我们的结果将是[0, 1]
Xcoder先生17年

@ Mr.Xcoder我明白了,谢谢
dylnan '17

5

Haskell,73个字节

-1个字节感谢Xcoder先生。-7个字节感谢Laikoni。

r=read.show
s n=sum[r i|i<-[1..n],n`mod`i<1]/r n
f n=all((s n>=).s)[1..n]

在线尝试!

Haskell的字体系统不是很容易打高尔夫球...



4

八度,41字节

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

在线尝试!

说明

@(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个字节

感谢Mr.Xcoder找出问题并解决问题!

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

在线尝试!


1
这失败了360360(请参阅挑战以了解更多详细信息:一个强烈推荐的负面测试案例是360360,因为它与最后一个多余的数字相关联。)。
Xcoder先生17年

1
固定为+3个字节。在线尝试。打高尔夫球。我喜欢使用#.~很多(老实说,整个除数之和功能真的很好)。顺便说一句,错误的是,尽管做事的想法{:=>./很聪明,但却不能满足问题的“大于”部分。
cole

1
这是我想出的替代sigma函数的功能,该函数当前长度相同:(1#.{:(]*0=|~)])\ 。不过,这出了点问题,也许您有一些想法?
cole

1
@cole为除数的总和的信用功能去罗杰·惠,在这篇文章。我也开始编写另一个sigma函数,但是在达到9个字节后停止,并决定它不会短于带有素因数分解的那个。感谢您解决问题!
Galen Ivanov

@cole我想出的除数之和的最短的其他动词是:(1#.]*0=|~)1+i.这是一个钩子,虽然不太容易安装:)
Galen Ivanov

3

朱莉娅0.6,52字节

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

在线尝试!

此解决方案使用有理数来确保相等时的正确性。(测试360360花了将近10分钟。)

使用浮点数时,左分隔符可以节省2个字节:

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

3

Pyth,14个字节

FryAmTheEggman保存了1个字节)

qh.Mcs*M{yPZZS

在这里尝试!查看更多测试用例。

仅是我的必修Pyth提交资料,很可能是高尔夫。

怎么样?

qh.Mcs * M {yPZZS〜完整程序。Q =输入。

             S〜[1,Q]范围内的整数。
  .M〜获取具有最大函数值的元素。
    cs * M {yPZZ〜键函数:使用变量Z。
         yPZ〜Z素数的幂集。
        {〜重复数据删除。
      * M〜每个的乘积。
     s〜总结起来。
    c Z〜除以Z
 h〜第一个元素。
q〜检查输入是否相等。输出True或False。

3

05AB1E,10个字节

LÑOā/ZQ¨_P

在线尝试! 或作为测试套件

说明

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

认为(尽管不确定),但失败了360360(有关更多详细信息,请参阅挑战:一个强烈推荐的否定测试用例是360360,因为它与最后一个多余的数字有关。)。
Xcoder先生17年

@ Mr.Xcoder:是的。修复了它,但是现在可能有更好的方法。
Emigna '17



2

Mathematica,53个 50字节

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

纯功能。将整数作为输入并返回TrueFalse作为输出。


会有用Tr@Divisors@#吗?
user202729

1

Japt v2.0a0,12 16个字节

睡眠不足的大脑似乎无法在此方面进一步改善!

返回1真还是0假。

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

试试吧

牺牲了4个字节来处理360360


说明

  • 整数的隐式输入U
  • Æ Ã创建一个从0到的整数数组,U-1并将每个整数通过以下函数传递给X
  • â得到的除数U
  • ÷UU
  • x 对结果求和。
  • 得到的除数X
  • ÷XX
  • x 对结果求和。
  • > 检查第一个结果是否大于第二个结果。
  • × 通过乘法减少生成的布尔数组。

1
如果您当前的方法与您的解释相符,则将失败360360或出现其他整数:一个强烈建议的否定测试用例(如果您的解释程序可以处理)为360360,因为它与最后一个
多余的

@ Mr.XCoder:坚果,你是对的!当我有时间修复它时,可能会花费我一些字节。
毛茸茸的

@ Mr.Xcoder:现在已修复,稍后将不得不回来看看我是否可以改进。
毛茸茸的

0

APL + WIN,37个字节

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

提示屏幕输入。


0

C(gcc),99个字节

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;}

在线尝试!

C,108字节

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;}

在线尝试!


那么,为什么s需要返回浮点数呢?
妮莎(Nissa)

@StephenLeppik为了在使用浮动分裂,而不是整数除法进行比较时,s(n)/ns(i)/i
Steadybox

0

迅速120个 118字节

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

由于Swift中的隐式类型声明,需要一些时间(在TIO上大约为6秒)进行编译。

在线尝试!



0

时髦,79字节

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}

讲解

首先定义函数d,即σ函数,这是的高尔夫版本

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

我们可以设置我到0,因为i*n%0总是等于0*...,因此0

下半部分定义了函数f,即Superabandunce函数,它只是

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

就像挑战说明所建议的那样,这只是检查从1到n-1的所有整数的a d(n)/n小于输入。

在线尝试!



0

外壳,9个字节

εü<m§ṁ/Ḋṫ

在线尝试! 360360测试用例太慢了。

说明

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

我知道了£ü¤<§ṁ/ḊN。创建超大量数字的完整列表
H.PWiz

0

Perl 5,84个字节

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

要求-E(免费)

规范的直接实现


0

APL(NARS),61个字符,122个字节

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π是因子的函数和

  (⍳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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.