특정 LCM 및 GCD로 숫자 쌍 찾기


9

나는 친구와 수학 문제를 연구하고 있었고 답을 찾는 스크립트를 작성하기로 결정했습니다. 원래 질문은 다음과 같습니다.

두 자연수의 차이는 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를 열거하는지 확인하고 싶었습니다. 경쟁하기에 용감하다면, 원하는 언어를 사용할 수 있지만, 코드 2를 코드와 비교할 수 있도록 Python 2를 선호합니다.

일반적인 규칙이 적용되며 최단 바이트가 이깁니다. 표준 코드 골프 허점이 적용됩니다. 더 이상 재미없는 표준 "허점"

즐기세요!


2
@Rainbolt : 좋아, 모든 언어를 허용했다. 파이썬 제한은 비교 목적이었습니다. 그러나 당신이 원하는대로하십시오 : D
sammko

3과 5092 이외의 답변이 있습니까? 10,000,000 이전에는 다른 것을 찾을 수 없습니다.
kennytm

@ KennyTM : 4와 5092를 얻었습니다. 그렇습니다. 다른 사람들은 없다고 생각합니다.
sammko

이봐, 난 당신이 원하는 것을 더 잘 반영하기 위해 제목을 편집했습니다. 내가 놓친 것 같은 느낌이 든다면 언제든지 바꾸십시오.
FryAmTheEggman

그런데 파이썬 태그를 제거했습니다.
Timtech

답변:


21

수학, 8 바이트

{4,5092}

4와 5092가 유일한 해결책이라는 증거 : 원래 문제는 다음과 같이 다시 작성할 수 있습니다.

x (x + 2010) = 2014 년 GCD (x, x + 2010) 2

하자 기록 X 2 그대로 2 3 3 5 5 ... 및 X + 2와 2,010 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 2 분 (a 2 , b 2 ) 3 2 분 (a 3 , b 3 ) 5 2 분 (a 5 , b 5 )

2014 년 = 2 × 19 × 53 이후

a p + b p = 2 분 (a p , b p ) + {p ∈ {1, 2, 19, 53}, 0이면}

그러므로

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

파이썬 3, 84 바이트

FryAmTheEggman은 이미 솔루션을 88 바이트로 만드는 방법을 제안 했으므로 게시하지 않을 것입니다. 그러나 파이썬 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/ or순서는 중요하지 않습니다, 내가 설정 생각 :) 더 많은 주제에; ...하지만 파이썬 3 생각하지 않았을 x=10**6과 일을하는 while x:x-=1;...한 바이트 짧다는.
FryAmTheEggman

@FryAmTheEggman 질문의 외모에서 주문 문제가 아닌 것 같아서 넣겠습니다. 감사합니다!
Sp3000

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 바이트)

두 자연수의 차이는 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*@@*=},`

따라서 @KettyTM의 증거는 (4,5092)가 유일한 해결책이라는 것입니다.
Optimizer

@Optimizer, 당신은 그것을 잘못 읽고 있습니다. 그는 또한 두 가지 솔루션이 있으며 내 솔루션과 동일하다는 것을 증명합니다. 그의 증거는 나의 것 (IMAO)보다 따르기가 훨씬 더 어렵다.
피터 테일러

아 맞아 그리고 네, 당신은 그의 것보다 더 의미가 있습니다.
Optimizer

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의 접두사 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

하스켈, 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.