過剰を決定する


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にあります。

非常に推奨されるネガティブテストケースの1つ(インタープリターが処理できる場合)は360360です。

チャレンジ

プログラムは、単一の正の整数を受け取り、その整数が過剰であるかどうかを表す真偽値を出力する必要があります。

これはであるため、バイト単位の最短回答が優先されます。

回答:


7

ゼリー、7バイト

Æs÷$ÞṪ=

オンラインでお試しください!

ゼリー、8バイト

Æs÷$ÐṀ⁼W

オンラインでお試しください!

テストスイート!

説明

Æs÷$ÐṀ⁼W〜フルプログラム(モナド)。

    ÐṀ〜最大のリンク値を持つ要素を保持します(自動範囲化)。
Æs〜除数の合計。
  ÷$〜現在の要素で割ります。
      ⁼W〜シングルトンにラップされた入力との等価性をチェックします。
         〜(360360などの整数の場合)

Æs÷$ÐṀ=7バイトでできると思います。ÐṀわかりませんが、それは知っておくと便利です。
ディルナン

@dylnanいいえ、できません。オンラインでテストすることはできませんが、では失敗し360360ます。実際には、これはだった私の最初のバージョン
氏Xcoder

なぜ失敗するの360360ですか?
ディルナン

@dylnan 360360は、以前に発生した結果を結び付ける最初の数字であるため、失敗する最初の数字です(と思う)。(と私たちの結果は次のようになります[0, 1]
ミスターXcoder

@ Mr.Xcoderわかりました、ありがとう
17



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(詳細については課題を参照してください:強く推奨される負のテストケースの1つは360360です。これは、最後の過剰な数と結びついているためです)。
ミスターXcoder

1
+3バイト固定。オンラインでお試しください。ゴルフに取り組んでいます。私#.~はたくさんの使用が好きです(正直なところ、除数合計関数は本当に素晴らしいです)。間違っていたの{:=>./は、やるという考えは賢いものの、質問の「より大きい」部分を満足させないということです。
コール

1
以下は、現在同じ長さのシグマ関数を置き換えるために思いついたものです(1#.{:(]*0=|~)])\ 。何か問題がありますが、何か考えがありますか?
コール

1
@cole除数の合計関数のクレジットは、このエッセイの Roger Huiに送られます。また、別のシグマ関数の作成を開始しましたが、9バイトに達して停止し、素因数分解を使用した関数より短くならないことを決定しました。問題を解決してくれてありがとう!
ガレンイワノフ

@cole私が思いついた除数の合計の最も短い他の動詞はこれです:(1#.]*0=|~)1+i.それはフックであり、しかし、簡単には定位置に収まりません:)
ガレンイワノフ

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

@ Mr.Xcoder:True。それを修正しましたが、今これを行うより良い方法があるかもしれません。
エミグナ



2

Mathematica、53 50バイト

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

純粋な機能。入力として整数を受け取り、出力TrueまたはFalse出力として使用します。


何かTr@Divisors@#機能しますか?
user202729

1

JAPT v2.0a0、12の 16バイト

睡眠不足の脳はこれ以上改善することができないようです!

1真実か偽か0を返します。

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

それを試してみてください

処理する4バイトを犠牲にしました360360


説明

  • integerの暗黙的な入力U
  • Æ Ã0to から整数の配列を作成し、U-1それぞれを次の関数として渡しますX
  • âの約数を取得しUます。
  • ÷Uこれらのそれぞれをで除算しUます。
  • x 結果を合計します。
  • の約数を取得しXます。
  • ÷Xこれらのそれぞれをで除算しXます。
  • x 結果を合計します。
  • > 最初の結果が2番目の結果より大きいかどうかを確認します。
  • × 乗算によって結果のブール値の配列を減らします。

1
あなたの現在のアプローチは、あなたの説明が一致した場合、それがために失敗した360360か、他のそのような整数:それは最後の超過剰数と結びつけるための一つ強くお勧め負のテストケースは、(あなたのインタプリタがそれを扱うことができる場合)、360360である
氏Xcoder

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

オンラインでお試しください!


では、なぜsfloatを返す必要があるのでしょうか?
ニッサ

@StephenLeppikと比較s(n)/nするときに整数除算の代わりに浮動小数点除算を使用しs(i)/iます。
Steadybox



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

i*n%0常に等しいため、iを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までのすべての整数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
豊富な

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.