特定のLCMとGCDを持つ数値のペアを見つける


9

私は私の友人と数学の質問に取り組んでいました、そして私たちは答えを見つけるスクリプトを書くことにしました。元の質問は次のとおりです。

2つの自然数の差は2010であり、それらの最大公分母は、最小公倍数より2014倍小さい。考えられるすべてのソリューションを見つけます。

私たちはプログラムを互いに独立して書き始め、それが機能するようになったとき、管理できる最小のバイト数を取得するためにプログラムを作成することに決めました。結局、この素晴らしいコード行は驚異的な89バイトになりました。

from fractions import*;print[i for i in range(10**6)if i*(i+2010)/gcd(i,i+2010)**2==2014]

最初の100万のiを列挙した短いコードをなんとか書き込めるかどうかを確認したかったのです。競争するのに十分な勇気があるなら、あなたは好きな言語を使うことができますが、Python 2があなたのコードを私たちのものと比較できるようにしたいと思います。

通常のルールが適用され、最短バイトが優先されます。標準コードのゴルフ抜け穴が適用されます。面白くない標準の「抜け穴」

楽しんで!


2
@Rainbolt:わかりました、どんな言語でも許可されました。pythonの制限は比較のためのものでした。しかし、あなたがしたいことは何でもしてください:D
sammko 2014

3と5092以外の回答はありますか?10,000,000より前には他に何も見つかりません。
kennytm 2014

@KennyTM:私は4と5092を取得しました。そして、はい、他にはないと思います。
sammko 2014

ねえ、私はあなたが求めていることをよりよく反映するようにあなたのタイトルを編集しました。私が何かを逃したと感じた場合は、自由に変更してください。
FryAmTheEggman 2014

ちなみにpythonタグを削除しました。
Timtech 2014

回答:


21

Mathematica、8バイト

{4,5092}

4と5092が唯一のソリューションであることの証明:元の問題は次のように書き直すことができます。

x(x + 2010)= 2014 GCD(x、x + 2010)2

レッツ・書き込みは、xは 2通り2 3 3 5 5 ...及びX 2として+ 2010 B 2 3 B 3 5 B 5 ...そして、式は次のようになり

2 a 2 + b 2 3 a 3 + b 3 5 a 5 + b 5 …= 2014 2 2min(a 2、b 2 3 2min(a 3、b 3 5 2min(a 5、b 5

2014 = 2×19×53なので、

a p + b p = 2min(a p、b p)+ {p if∈{2、19、53}、0 else}

したがって

P = B P P≠2、19であれば、53 P = BのP ±他1

したがって

x + 2010 = 2 ±1 19 ±1 53 ±1 x

選択肢は8つしかなく、4と5092が唯一の正の整数の解であることを簡単に確認できます。

待って、標準の抜け穴を叫んでいる人の声が聞こえます…

Mathematica、45バイト

Select[Range[9^7],2014GCD[#,s=#+2010]^2==s#&]

4

バース 27 25

J2010fq+J4/*T+TJ^iTJ2U^T6

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

これはあなたのアルゴリズムをかなり単純に使用しています...私はもっと良いものを思いつくことができるかもしれません...

基本的に、基準を満たさない値を range(10**6)

チャットで指摘してくれた@xnorに感謝 gcd(x,x+2010)==gcd(x,2010)


3

Python 3、84バイト

FryAmTheEggmanは、ソリューションを88バイトにする方法をすでに提案しているため、投稿しません。しかし、Python 3でさらに少ないバイト数を取得する方法を示すと思いました。

from fractions import*
x=10**6
while x:y=x+2010;x*y-gcd(x,y)**2*2014or print(x);x-=1

(ヒントのためのFryAmTheEggmanをありがとう)

printは関数ではないため、これはPython 2 では機能しません。

許可されるかどうかはわかりませんが、9**9代わりに使用できるかどうかは10**6別のバイトになります。


and/でこれを行う方法があることは知っていましたが、orPython 3については考えていませんでした;)トピックの詳細:順序が重要でない場合、設定x=10**6と実行while x:x-=1;...は1バイト短いと思います。
FryAmTheEggman 2014

@FryAmTheEggman質問の見た目から、それは順序の問題のようではないので、私はそれを入れます。ありがとう!
Sp3000、2014

2

R、75文字

for(a in 1:1e6){q=1:a;b=a+2010;if(a*b/max(q[!a%%q&!b%%q])^2==2014)print(a)}

改行あり:

for(a in 1:1e6){
    q=1:a
    b=a+2010
    if(a*b/max(q[!a%%q&!b%%q])^2==2014)print(a)
    }

2

GolfScript(41バイト)

2つの自然数の差は2010であり、それらの最大公分母は、それらの最小公倍数よりも2014倍小さい。考えられるすべてのソリューションを見つけます。

電話番号ambm場所gcd(a, b) = 1とwlogを呼び出しb > aます。それから、違いはm(b-a) = 2010、そしてlcm(am, bm) = abm = 2014mそうab=2014です。

2014年の要因は

1 * 2014
2 * 1007
19 * 106
38 * 53

2010年に分かれる違いがあるものは

1007 - 2 => m = 2, solution is 4, 2014
53 - 38 => m = 134, solution is 5092, 7102

私はGCDまたはLCMが組み込まれていない言語で操作しているので、この分析はおそらくプログラムを短くすると思います。

44,{).2014{.2$/\@%!}:,~\2$- 2010,***}%0-`

はどこ44ですかfloor(sqrt(2014))

ナイーブループを使用して非常に接近することが可能です。

10 6?,1>{.2010+.2${.@\%.}do;.*2014*@@*=},`

したがって、(4,5092)が唯一のソリューションであるという@KettyTMの証明は間違っていますか?
オプティマイザ2014

@オプティマイザー、あなたはそれを誤解しています。彼はまた、2つの解決策があり、それらは私の解決策と同じであることを証明しました。彼の証明は私のもの(IMAO)よりも追跡するのがはるかに難しいです。
Peter Taylor

ああ、そうだ。そして、はい、あなたは彼よりも理にかなっています。
オプティマイザ2014

2

Perl6 61 58 56 54 52

ソースをかなり直接翻訳すると、

for ^10**6 ->\i{i.say if i*(i+2010)/(i gcd(i+2010))**2==2014}

gcd Perl6のinfix opです。

^10**6はの略0 ..^ 10**6であり、^平均はこの数値を範囲から除外します。


もちろんi gcd (i+2010)同じですi gcd 2010ので3キャラ節約できます

for ^10**6 ->\i{i.say if i*(i+2010)/(i gcd 2010)**2==2014}

$_代わりに使用する場合i、別のいくつかの文字を保存できます。(の.say$_.say

for ^10**6 {.say if $_*($_+2010)/($_ gcd 2010)**2==2014}

のようにの両側にスペースを必要としないので、の... && .say代わりにを使用して、別のいくつかの文字を保存できます。.say if ...&&if

for ^10**6 {$_*($_+2010)/($_ gcd 2010)**2==2014&&.say}

以前の両方の「最適化」を行ったので、ステートメント修飾子形式のを使用できます。forつまり、{およびを削除でき}ます。

$_*($_+2010)/($_ gcd 2010)**2==2014&&.say for ^10**6

これは、別のアルゴリズムを使用せずにできる限り短いと思います。


2

J、26バイト

   I.((*.=+.*4--)2010+])i.1e6
4 5092

それらののろわれた2バイトの動詞... :)


1

Dyalog APL、29文字

      a←⍳10        ⍝ the integers up to 10
      a
1 2 3 4 5 6 7 8 9 10
      2010+a       ⍝ corresponding integers at distance 2010
2011 2012 2013 2014 2015 2016 2017 2018 2019 2020
      a∨2010+a     ⍝ GCD-s between elements of a and 2010+a
1 2 3 2 5 6 1 2 3 10
      ⍝ All APL functions (e.g. + and ∨) are prefix-or-infix, right-associative,
      ⍝ and of the same precedence.
      a∧2010+a     ⍝ LCM-s
2011 2012 2013 4028 2015 2016 14119 8072 6057 2020
      ⍝ For which of them is the LCM 2014 times the GCD?
      (a∧2010+a)=2014×a∨2010+a
0 0 0 1 0 0 0 0 0 0
      ⍝ 0 means false, 1 means true
      ⍝ Filter the elements of "a" corresponding to the 1-s
      ((a∧2010+a)=2014×a∨2010+a) / a
4
      ⍝ Let's abstract this as a function by using curlies.
      ⍝ Omega (⍵) stands for the right argument.
      {((⍵∧2010+⍵)=2014×⍵∨2010+⍵) / ⍵} a
4
      ⍝ Up to a million instead of up to ten:
      {((⍵∧2010+⍵)=2014×⍵∨2010+⍵) / ⍵} ⍳1e6
4 5092
      ⍝ Hey, we can save a few characters by making 2010 the left argument, alpha (⍺)
      2010 {((⍵∧⍺+⍵)=2014×⍵∨⍺+⍵) / ⍵} ⍳1e6
4 5092
      ⍝ Remove a pair of parens by using the switch operator ⍨
      ⍝ An "operator" occurs to the right of a function and modifies its behaviour.
      ⍝ In this case A f⍨ B means the same as B f A
      ⍝ Left and right are swapped, hence "switch".
      2010 {⍵ /⍨ (⍵∧⍺+⍵)=2014×⍵∨⍺+⍵)} ⍳1e6
4 5092
      ⍝ That's 32 characters (modulo whitespace).  Not bad, but we can do better.
      ⍝ A "fork" is a sequence of 3 functions in isolation: f g h
      ⍝ It is evaluated as:  ⍺(f g h)⍵  ←→  (⍺ f ⍵)g(⍺ h ⍵)
      ⍝ If the first item is an array instead of a function: A f g  ←→  {A} f g
      ⍝ Forks are right-associative: f g h k l ←→ f g (h k l)
      2010 {⍵ /⍨ (⍺(⊢∧+)⍵)=2014×(⍺(⊢∨+)⍵)} ⍳1e6
4 5092
      ⍝ The "right tack" function (⊢) simply returns its right argument
      ⍝ Let's abuse forks a little further:
      2010 {⍵ /⍨ ⍺((⊢∧+)=(2014×(⊢∨+)))⍵} ⍳1e6
4 5092
      ⍝ ... and more
      2010 {⍺ (⊢(/⍨)((⊢∧+)=(2014×(⊢∨+)))) ⍵} ⍳1e6
4 5092
      ⍝ But {⍺ f ⍵} is equivalent to f
      2010 (⊢(/⍨)((⊢∧+)=(2014×(⊢∨+)))) ⍳1e6
4 5092
      ⍝ Note that now we are not mentioning ⍺ and ⍵ at all.
      ⍝ This is called "point-free style" or "tacit programming".
      ⍝ Removing some unnecessary parens and whitespace:
      2010(⊢(/⍨)(⊢∧+)=2014×⊢∨+)⍳1e6
4 5092
      ⍝ How many characters?
      ⍴'2010(⊢(/⍨)(⊢∧+)=2014×⊢∨+)⍳1e6'
29

1

PARI / GP、42バイト

[n|n<-[1..8!],2014*gcd(n,t=n+2010)^2==n*t]

GPのfordiv構造を使用した非常に洗練されたソリューションがあるように感じますが、簡潔にするためにこのソリューションと競合することはできませんでした。


0

ラケット、72文字

(filter(λ(i)(=(/(*(+ i 2010)i)(expt(gcd(+ i 2010)i)2))2014))(range 1e6))

1
ラケットはISO-8859-7で動作しますか?そうでなければ、私はλ1バイトとして数えるとは思いません。
kennytm

0

Haskell、52文字

show [x|x<-[1..6^8],x*(x+2010)==2014*(gcd x 2010)^2]

Haskellインタラクティブ環境GHCiで動作します。

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