一連の数字の合計が指定された値を超える最小の数字を計算します


14

次のように定義された数の無限シーケンスがあるとします。

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

シーケンスはの約数の合計で、n1とを含みnます。

x入力として正の整数を指定し、nより大きい結果を生成する最小数を計算しxます。

テストケース

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

期待される出力

プログラムは、次のように両方 nとその除数の合計を返す必要があります。

$ ./challenge 100
48,124

ルール

これはコードゴルフなので、各言語のバイト単位の最短コードが優先されます。


4
そのシーケンスはnsの約数の合計ですか?おそらく明示的に述べたいと思うでしょう。
マーティンエンダー

3
また、「期待される出力」から判断するn f(n)、との両方が必要ですが、仕様のどこにもそう言うことはありません。
マーティンエンダー

2
ボーナスは、特にあいまいな場合は悪いです。これを取り下げられないように保護するために、それを削除することにしました。
ミスターXcoder

2
再確認してもらえますf(1000) = 48か?除数の合計48124
次のとおり

3
回答を受け入れるまで少なくとも1週間待つことをお勧めします。そうしないと、新しい解決策を思いとどまらせることがあります。
Zgarb

回答:


8

Brachylog、9バイト

∧;S?hf+S>

このプログラムは、「出力変数」から入力.を受け取り、「入力変数」に出力します?オンラインでお試しください!

説明

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

暗黙的な変数Nは昇順で列挙されるため、その有効な最小値が出力に使用されます。


10

ゼリー18 12 11 10バイト

1Æs>¥#ḢṄÆs

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

Xcoder氏のおかげで-1バイト!

使い方

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

なぜ1必要なのか、どのように¥行動するのか説明してもらえますか?
ディルナン

1
@dylnan 1#、1からカウントを開始するように指示し¥、前の2つのリンク(Æsおよび>)を取り、それらをダイアド(つまり、2つの引数)として適用します。左引数は反復で、右引数は入力です。
ケアニアンコヒーリングアーイング

ああ、それは今理にかなっています。#いくつかのケースで以前は少し混乱していた。
ディルナン



4

12 11バイト

§eVḟ>⁰moΣḊN

-1バイト、@ Zgarbに感謝!

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


賢い!奇妙なことに、どのように,機能しないのでしょう(または推論に時間がかかりすぎますか?)。
ბიმო

型を推測しますが、無限リストを出力します。これは、2番目の引数として整数を受け取るofのオーバーロードが原因である可能性がありますが、これは単なる推測です。
Zgarb


4

Japt、15バイト

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

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


説明

integerの暗黙的な入力U[]配列ラッパーです。最初の要素@ }aは、真理値を返すまで継続的に実行され、毎回(0から始まる)整数を渡し、その整数の最終値を出力する関数です。â現在の整数の除数(X)を取得してx合計し、その結果がvariableに割り当てられますV。が未満<かどうかを確認します。配列の2番目の要素はjust です。UVV


4

Clojure、127バイト

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

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

-4バイトの@steadyboxに感謝します!


1
サイトへようこそ!
コイナーリンガーをケアします。

いくつかの空白を削除して、数バイトを節約できます。オンラインでお試しください!
Steadybox

この場合、reduceに置き換えることができますapply。また、関数e#(...)構文を介して匿名関数として表現することもできます。CodeGolfで名前を付ける必要はありません。#(=(rem n %)0)はより短い#(zero?(rem n %))。そして、それ,は空白であり、この場合は後に続く(ため削除できるため、正しく解析されることに注意してください。
ニコニール

@NikoNyrh仲間のclojuristに会えてうれしいです、私はすぐにこの投稿を編集します
Alonoaky

3

ルビー、58バイト

ラムダが許可されているかどうかわからないため、完全なプログラム。/ shrug

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

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

説明

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
ラムダは確かに許可されています。
ジュゼッペ

3

JavaScript(ES6)、61 58バイト

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>

編集:@Arnauldのおかげで3バイト保存されました。


「スクリプトエラー」が表示されます。545を超える値を入力する場合
StudleyJr

Safariを使用してみてください。テールコールの最適化をサポートしているようです。(または、それらを見つけることができる場合、Chromeの一部のバージョンは「実験的なJavaScript機能」を介して有効にします。)
ニール





2

MATL、12バイト

`@Z\sG>~}@6M

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

説明

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

ファクター、88

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

ブルートフォース検索。それは、二重引用符(ラムダ)だcallとそれをxスタック、葉の上nおよびf(n)スタック上に。

一言で:

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

2

Python 3、163バイト

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
こんにちは、PPCGへようこそ。素敵な最初の投稿!ゴルフの観点からは、空白を削除し、ラムダ関数を使用して、すべてを1行に折り畳み、繰り返さないことで、いくつかのバイトを節約できます。TIO例えばのようなオンラインテスト環境への我々はまた、通常のリンク、(105バイトの技術を使用しては、前述した。)
ジョナサンFRECH

@JonathanFrech:素晴らしいコメント。一般的にnoob、特にヌービに対する忍耐に感謝します;)
エリックドゥミニル

2

Python 3、100バイト

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

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

前回のpython 3の試みに対するJonathan Frechのコメントのおかげで、Python構文の知識を大幅に拡張しました。-iのi + 1トリックを考えたことがなかったので、2つの文字が節約されました。

しかし、その答えは1)最小限ではなく、2)x = 1では機能しません(簡潔にするために簡単にできるオフバイワンエラーのため、他の誰もがこのエッジの答えを確認することをお勧めします場合!)。

簡単な説明: sum(i+1for i in range(y)if y%-~i<1)と同等ですsum(i for i in range(1,y+1)if y%i<1) 2文字、保存されます。フレッシュさん、ありがとう。

d=lambda y:sum(i+1for i in range(y)if y%-~i<1) したがって、yの約数を返します。

f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))私が本当に仕事をした場所です。タプルの比較は辞書順で機能するため、jと比較するのと同じくらい簡単にj、d(j)を比較できます。これにより、最小のjを見つけて変数に保存し、/ then /を計算する必要がなくなります。別の操作でタプル。また、x<=d(j)d(1)が1であるため、xが1の場合は何も得られないため、<ではなく、<を持っている必要があります。これは、私たちが必要range(x+1)としない理由でもありますrange(x)です。

以前はdでタプルを返していましたが、fで添字を付ける必要があるため、さらに3文字が必要です。


1
サイトへようこそ。最初の投稿です。ここで匿名関数は完全に受け入れられるため、を削除することで98バイトを取得できf=ます!
コイナーリンガーアーイング

別のコード行から匿名関数を呼び出すことはできません。問題です。関数が機能することをテストするために、別のprint(f(100))ステートメントがあります。
マイケルボガー

ここでは問題ありません。これは完全に受け入れf=られ、バイトカウントに含まれないように機能し、Pythonでゴルフをする良い方法です。Pythonでのゴルフのヒントについてはこちらをご覧ください!
22:05にコイアリンガーアーイング

ふむ 両方の既存のインスタンスで追加q=rangeと置換rangeを行うことで、提出物を平等にすることはできますが、良くはなりませんq。悲しいことに、これはそれを改善せず、ラムダは私がそれのためにそれを使用できないキーワードであるので、私はあまりにも多くの文字を浪費するexec()トリックをしなければなりません。
マイケルボガー

@MichaelBogerさて、Pythonで匿名関数呼び出すことができます。ラムダ式を変数に割り当てる必要はありません。
ジョナサンフレッチ

2

Python 2、81バイト

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

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



タブを2つのスペースに置き換えると、Python 3で83バイトで動作しますが、試してみるにはprintステートメントに括弧を入れる必要がありました。また、returnステートメントをprintステートメントに置き換えることができ、それを印刷するための補助関数は必要ありません。バイトは同じままです。
マイケルボガー



0

Clojure、102バイト

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


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