適切な除数マッシュアップ


20

適切な除数がある除数数のNはない、N自体。たとえば、12の適切な除数は1、2、3、4、6です。

あなたは与えられます整数 XX ≥2、X≤1000。あなたの仕事は、2からxまでの整数のすべての最高の適切な除数を合計することです(包括的)(OEIS A280050)。

例(とx = 6):

  • 2〜6(両端を含む)の間の整数をすべて検索します:2,3,4,5,6。

  • それらすべての適切な除数を取得し、各数値から最も高い除数を選択します。

    • 2-> 1
    • 3-> 1
    • 4-> 1、2
    • 5-> 1
    • 6-> 1、2、3
  • 最高の固有除数を合計します1 + 1 + 2 + 1 + 3 = 8

  • 最終結果は8です。

テストケース

入力| 出力
------- + ---------
       |
 2 | 1
 4 | 4
 6 | 8
 8 | 13
 15 | 41
 37 | 229
 100 | 1690
 1000 | 165279

ルール



5
何かをサンドボックスする場合は、2時間以上そこに置いておきます。
ピーターテイラー

@PeterTaylorフィードバックを受信するためだけに投稿をサンドボックス化しました。これは、サンドボックスに投稿することは通常非常に簡単なチャレンジだからです。ところで編集してくれてありがとう。
ミスターXcoder

回答:



5

、7バイト

ṁȯΠtptḣ

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

説明

Huskには(まだ)除数を直接計算するための組み込み機能がないため、代わりに素因数分解を使用しています。数値の最大の適切な除数は、最小のものを除くその素因数の積です。この関数を2から入力までの範囲にマッピングし、結果を合計します。

ṁȯΠtptḣ  Define a function:
      ḣ  Range from 1 to input.
     t   Remove the first element (range from 2).
ṁ        Map over the list and take sum:
 ȯ        The composition of
    p     prime factorization,
   t      tail (remove smallest prime) and
  Π       product.

5

Python 2、50バイト

f=lambda n,k=2:n/k and(f(n,k+1),n/k+f(n-1))[n%k<1]

これは遅く、TIOの入力15にも対応できません。

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

ただし、メモ化(thanks @ musicman523)を使用して、すべてのテストケースを検証できます。

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

代替バージョン、52バイト

2バイトのコストで、我々は計算するかどうかを選択することができますf(n,k+1)n/k+f(n-1)

f=lambda n,k=2:n>1and(n%k and f(n,k+1)or n/k+f(n-1))

いくつかの策略により、これはすべてのテストケース、TIOでも機能します。

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


以来f、純粋な機能、あなたは上の大きな例を実行するためにそれをmemoizeできTIOを
musicman523

そうです、デコレータを使用できないということは私を追い払ったのです。ありがとう!
デニス



4

JavaScript(ES6)、40バイト

f=(n,i=2)=>n<2?0:n%i?f(n,i+1):n/i+f(n-1)
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

数値は、最大の固有因子と最小の素因数の積に等しくなります。


スタックがオーバーフローするためにn>352(それは私のブラウザ/機械依存であれば、少なくともこのスニペットではいけないのノウハウを)あなたが最低点で最大でサポートすることになっていながらn=1000
officialaimm

@officialaimm n=1000たとえばを使用する場合に有効ですnode --stack_size=8000
ニール

4

05AB1E9 8バイト

-1バイトおかげ漏れ尼僧彼Pythの答えでの素因数トリック

L¦vyÒ¦PO

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

説明

L¦vyÒ¦PO
L¦       # Range [2 .. input]
  vy     # For each...
    Ò¦    # All prime factors except the first one
      P   # Product
       O  # Sum with previous results
         # Implicit print

代替の8バイトソリューション(TIOでは機能しません)

L¦vyѨθO    

およびofcの代替9バイトソリューション(TIOで動作します)

L¦vyѨ®èO    




4

Python 2(PyPy)73 71 70バイト

n=input();r=[0]*n;d=1
while n:n-=1;r[d+d::d]=n/d*[d];d+=1
print sum(r)

最短のPython回答ではありませんが、これはテストケースを簡単に解決するだけです。TIOは、汗をかくことなく最大30,000,000の入力を処理します。私のデスクトップコンピューターは1分で300,000,000を処理します。

2バイトのコストで、条件をn>d最大10%高速化するために使用できます。

@xnorのr=[0]*nアイデアに感謝し、3バイトを節約しました!

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


おかしい、私は基本的に同じコードを書いた。
-xnor

l=[0]*nを取り除くことができるはずです-2execちょっと速度が落ちwhileますが、ループでさえ私のアプローチより短くなります。
デニス

これは私のアプローチよりわずかに速いようです。それを自分の答えに編集してもいいですか?
デニス

どうぞ。
-xnor

1
@ Mr.Xcoder PyPyにはありませんが、はい、この種の問題に対してシーブは問題ありません。
デニス

4

Haskell、48 46 43バイト

f 2=1
f n=until((<1).mod n)pred(n-1)+f(n-1)

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

編集:@rogaosは2バイトを保存しました。ありがとう!

編集II:...および@xnor別の3バイト。


-2バイト:f 2=1 f n=last[d|d<-[1..n-1],mod n d<1]+f(n-1)
vroomfondel

@rogaos:ありがとう!私は明示的な再帰を自分で試しましたが、削除しませんでしたsumので、短くはないと思いました。
-nimi

1
untilさらに節約します:until((<1).mod n)pred(n-1)+f(n-1)
-xnor

4

Japt8 + 2 = 10 8 6バイト

òâ1 xo

試して

  • ETHproductionsのおかげで1バイト節約されました。

説明

    :Implicit input of integer U.
ò   :Generate an array of integers from 1 to U, inclusive
â   :Get the divisors of each number,
1   :  excluding itself.
x   :Sum the main array
o   :by popping the last element from each sub-array.
    :Implicit output of result

この投稿に-xよると、2バイトとしてカウントされることに注意してください。ただし、(引数を指定すると元の番号を除外します)ò2_â1 oâ
-ETHproductions

ありがとう、@ ETHproductions。両方とも見逃していた。フラグを1バイトとしてカウントしたすべてのソリューションに遡及的に適用されるのだろうか?とにかくフラグを使用しない代替ソリューションを作成していました。âの議論を指摘することで、私が探していた節約ができました。
シャギー

以前はコンセンサスを実際に守っていなかったので、そう思うでしょう。ところで、私は一緒に遊んでいたõ Å前と夫婦8と9 bytersを見つけました:õ Åx_/k gõ Åx_k Å×õ Åx_â¬o。そして、あなたの天才トリックõと組み合わせることで、7バイトのソリューションを見つけました:-)Åxo
ETHproductions

3

MATL、12バイト

q:Q"@Z\l_)vs

MATL Online試しください

説明

        % Implicitly grab input (N)
q       % Subtract one
:       % Create an array [1...(N-1)]
Q       % Add one to create [2...N]
"       % For each element
  @Z\   % Compute the divisors of this element (including itself)
  l_)   % Grab the next to last element (the largest that isn't itself)
  v     % Vertically concatenate the entire stack so far
  s     % Sum the result



3

Cubix、27 39バイト

?%\(W!:.U0IU(;u;p+qu.@Op\;;

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

立方体

      ? % \
      ( W !
      : . U
0 I U ( ; u ; p + q u .
@ O p \ ; ; . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

実行する

  • 0IUアキュムレーターと開始整数を使用してスタックをセットアップします。外側のループにUターン
  • :(? スタックの現在のトップを複製し、デクリメントしてテストします
  • \pO@ キューブの周りをミラーにゼロループした場合、スタックの下部をつかみ、出力して停止します
  • %\! 陽性の場合、mod、relect、test。
    • u;.W 真実であれば、Uターン、MOD結果を削除し、車線変更を内側のループに戻します
    • U;p+qu;;\(falseyの場合、uターン、modの結果を削除し、アキュムレータをトップに移動し、現在の整数(トップ)除数プッシュをボトムに追加し、uターンします。スタックをクリーンアップして、アキュムレータと現在の整数のみを取得し、整数をデクリメントして、再び外側のループに入ります。




2

Pythonの369の 63 59バイト

Dennisのおかげで4バイト。

f=lambda n:n-1and max(j for j in range(1,n)if n%j<1)+f(n-1)

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

これが1000で機能するように、再帰制限を2000に設定しました。


+1あなたは私のブラウニーポイントを持っています!それは...私は「より短い70バイト」と言ったときに話していたソリューションです
氏Xcoder

また、これは、同様のPython 2で動作します
氏Xcoder

2

、37バイト

A⁰βF…·²N«A⟦⟧δF⮌…¹ι«¿¬﹪ικ⊞δκ»A⁺β⌈δβ»Iβ

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

リンクは詳細バージョンへです。Charcoalで非ASCIIアート関連の質問をどのように解決できるかを理解するのにほぼ1日かかりましたが、ようやくそれを手に入れ、私は非常に誇りに思っています。:-D

はい、私はこれがたくさんゴルフできると確信しています。C#の回答を翻訳したばかりで、Charcoalで別のことができると確信しています。少なくとも1000数秒で解決します...



2

Python 2(PyPy)、145バイト

コードゴルフ競技を最速のコード競技に変えるのは楽しいので、TIO で30秒でn = 5,000,000,000を解くO(n)アルゴリズムがあります。(デニスのふるいはO(n log n)です。)

import sympy
n=input()
def g(i,p,k,s):
 while p*max(p,k)<=n:l=k*p;i+=1;p=sympy.sieve[i];s-=g(i,p,l,n/l*(n/l*k+k-2)/2)
 return s
print~g(1,2,1,-n)

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

使い方

セットのサイズを数えます

S = {(ab)| 2≤ ≤ N、2≤ B ≤最大-適正除数(A)}、

すべての素数p≤√n上の結合としてそれを書き換えることにより、

S P = {(PDB)| 2≤ DN / P、2≤ BD }、

そして包含-排除の原則を使用します:

| S | = ∑(−1)m − 1 | S P 1 ∩⋯∩ S P M | オーバーM ≥1と素数P 1 <⋯< P M ≤√N、

どこで

S P 1 ∩⋯∩ S P M = {(P 1P MEB)| 1つの≤ EN /(P 1P M)、2≤ BP 1P M - 1つのE }、
| S P 1 ∩⋯∩ S P M | =⌊ N /(P 1P M)⌋⋅(P 1 P M- 1 ⋅(⌊ N /(P 1P M)⌋+ 1) - 2)/ 2。

合計が有するCnはゼロ以外の用語を、ここでCの 6⋅おそらくだ(1 - 2 LN)何らかの定数に収束/π 2 ≈0.186544。最終的な結果は次のとおりです。S | + n − 1。


うーん、それは...高速です
氏Xcoder

2

NewStack、5バイト

幸いなことに、実際には組み込みがあります。

Nᵢ;qΣ

内訳:

Nᵢ       Add the first (user's input) natural numbers to the stack.
  ;      Perform the highest factor operator on whole stack.
   q     Pop bottom of stack.
    Σ    Sum stack.

実際の英語:

入力8の例を実行してみましょう。

Nᵢ:1から8までの自然数のリストを作成します。 1, 2, 3, 4, 5, 6, 7, 8

;:最大の要因を計算します: 1, 1, 1, 2, 1, 3, 1, 4

q。最初の要素を削除します。1, 1, 2, 1, 3, 1, 4

Σ そして合計を取る: 1+1+2+1+3+1+4 =13


1+1+2+1+3+1+4= 13not 8。それとは別に、素晴らしい答えは+1です。
ケビンCruijssen

@KevinCruijssenおっと、キャッチしてくれてありがとう!
グラビトン

2

Java 8、78 74 72バイト

n->{int r=0,j;for(;n>1;n--)for(j=n;j-->1;)if(n%j<1){r+=j;j=0;}return r;}

@CarlosAlejoのC#回答のポート。

ここで試してみてください。

古い回答(78バイト):

n->{int r=0,i=1,j,k;for(;++i<=n;r+=k)for(j=1,k=1;++j<i;k=i%j<1?j:k);return r;}

ここで試してみてください。

説明(古い回答):

n->{                    // Method with integer parameter and integer return-type
  int r=0,              //  Result-integers
      i=1,j,k;          //  Some temp integers
  for(;++i<=n;          //  Loop (1) from 2 to `n` (inclusive)
      r+=k)             //    And add `k` to the result after every iteration
    for(j=1,k=1;++j<i;  //   Inner loop (2) from `2` to `i` (exclusive)
      k=i%j<1?j:k       //    If `i` is dividable by `j`, replace `k` with `j`
    );                  //   End of inner loop (2)
                        //  End of loop (2) (implicit / single-line body)
  return r;             //  Return result-integer
}                       // End of method



1

積み上げ、31バイト

[2\|>[divisors:pop\MAX]map sum]

オンラインでお試しください!(60秒のオンライン時間制限を超える1000を除くすべてのテストケース。)

説明

[2\|>[divisors:pop\MAX]map sum]
 2\|>                               range from 2 to the input inclusive
     [                ]map          map this function over the range
      divisors                      get the divisors of the number (including the number)
              :pop\                 pop a number off the array and swap it with the array
                   MAX              gets the maximum value from the array
                           sum      sum's all the max's

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