하디 – 라 마냐 얀 수 일반화


12

Hardy–Ramanujan number 로 알려진 1729 는 양의 정수로 구성된 두 큐브의 합으로 두 가지 방법으로 표현할 수있는 가장 작은 양의 정수입니다 ( 12^3+1^3=10^3+9^3=1729). n어떤 언어로든 입력에 따라 선택한 언어에 정수가 주어지면 n두 가지 고유 한 방식으로 제곱으로 올린 두 양의 정수의 합으로 표현할 수있는 가장 작은 양의 정수를 찾으십시오 . 외부 소스를 사용하지 않습니다. 가장 적은 캐릭터가 승리합니다.

문제 는 실제로 해결되지 않은 문제 입니다 n>4. 이 숫자의 경우 프로그램을 검색에서 영원히 실행하거나 시도해보십시오! 시간과 자원이 무한하다면 프로그램이 문제를 해결할 수 있도록하십시오.


2
"?"는 " 제곱으로 올린 두 양의 정수 의 합계"를 지정할 수 있습니다 n. 그렇지 않으면, 91(안 1729)에 대한 솔루션입니다 n=3때문에 6^3+(−5)^3=4^3+3^3=91. 나는 Wikipedia 링크에서 이것을 배웠으므로 아마도 HM 참조가 이것을 규칙적으로 불필요하게 만들 수 있습니다. 건배!
Darren Stone

실제로, 1최초의 솔루션입니다 :1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
존 드보락

제안과 편집에 감사드립니다-나는 양의 정수를 의미했습니다!
Ben Reich

1
@JanDvorak, 그렇습니다. 유지는 R EAL!
대런 스톤

당신은 "말을 찾을 ..., 것처럼하는 것은 거기에있는 가장 작은 양의 정수" 입니다 한 - 그러나 어떤을 위해 N > 네, 같은 번호의 존재는 미해결 문제 . 어쩌면 당신은 "가장 작은 양의 정수를 찾으십시오"라고 말해야 할 것입니다 ... "답은"아무것도 찾지 않는 종료되지 않는 루프 일 수 있습니다.
res

답변:


3

APL  45  41

{⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1}

41 문자의 짧지 만 느린 버전 :

{⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⍺:⍺⋄⍵∇⍨⍺+1}

온라인으로 시도 하고 함수를 붙여 넣고 숫자로 호출하면됩니다.

      {⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 2
50
      {⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 3
1729

(그러나 알고리즘은 매우 멍청합니다. 온라인 인터프리터가 n = 4를 계산할 것으로 기대하지 마십시오)

n = 2에 대한 답은 50 = 5² + 5² = 7² + 1²입니다. 그 숫자는 "두 가지 양의 정수의 제곱으로 표현 될 수 있습니다. 두 가지 방식으로 다르지 않습니다."

distinct 절을 추가하려면 동일한 수의 문자 (v∘.≤v)로 변경 하면 (v∘.<v)n = 2는 65가됩니다.

      {⍺←1⋄2≤+/,⍺=(v∘.<v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 2
65

GolfScript를 때리고 있습니까? 할 수 없습니다 !!


좋은! 그리고 나는 별개의 정수를 의미했지만, 지정하지 않았으므로 나중에 더 많은 힘을 얻습니다! GolfScript의 드로잉 보드로 돌아 가기 ...
Ben Reich

2

루비, 132

n=$*[r=0].to_i;while r+=1
r.times{|a|r.times{|b|next if
a**n+b**n!=r;r.times{|c|r.times{|d|puts(r)if
c**n+d**n==r&&a!=c&&a!=d}}}}end

패스 n명령 행 인수로. 첫 번째 줄 stdout은 솔루션입니다.

성능이 아닌 코드 골프에 최적화되었습니다. (정확하게 실행됩니다. 그러나 느립니다. 필요한 것보다 많은 작업을 수행합니다.)


더 길고 약간 더 빠른 C 프로그램이 있습니다. 동일하지만 끔찍한 알고리즘. (정말 더 이론을 연구해야합니다!)

n= 2, n= 3으로 테스트되었습니다 .

C, 234

#include<stdio.h>#include<math.h>
r,a,b,c,d;main(n){scanf("%d",&n);while(++r){for(a=0;a<r;++a){for(b=a;b<r;++b){if(pow(a,n)+pow(b,n)!=r)continue;for(c=a+1;c<r;++c){for(d=0;d<r;++d){if(pow(c,n)+pow(d,n)==r&&a!=d)printf("%d\n",r);}}}}}}

C 버전이 사용 n됩니다 stdin. 위와 같이 첫 번째 줄 stdout은 솔루션입니다.


1

GolfScript 53

1\.{;\).,{}@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)

입력은 스택의 초기 번호입니다. 끝에 스택 맨 위에있는 숫자가 답입니다. 나는 기회가 생길 때 이것을 자세히 설명 할 것이다.

예 :

{1\.{;\).,@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)}:f
2 f -> 25 
3 f -> 1729

지금은 꽤 느립니다. 그것은 또한 카운트 0(그래서 25에 대한 대답입니다 n=2때문에 25=5^2+0^2=3^2+4^2. 2 개 문자를 추가, 0을 계산하지에 주문 (;최초의 후,

1\.{;\).,(;{}@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)

그를 찾으려면 2 f=65때문에,65=8^2+1^2=5^2+6^2


1

GolfScript (30 자)

:N{).,{)N?}%:P{1$\-P?)},,3<}do

참고 : 우선 순위 대기열과 같은 우아한 것보다는 무차별 검색을 수행하기 때문에 속도가 느립니다. 가장 우아한 점은 N검색 할 하위 경계로 재사용하는 것입니다 . 이것은 1^N + 2^N > N모두 때문에 유효 합니다 N.

소요 N스택, 스택의 해당 택시 번호를 남긴다. Nstdin에서 가져 오려면 앞에 추가하십시오 ~.

위의 버전은 허용합니다 x^N + x^N(그래서 N=2제공합니다 50). (제공 별개의 번호를 추가 요구하려면 65대신을)의 변경 34. 0^N + x^N(주기 25) 를 허용하려면 )바로 직전을 제거하십시오 N?.


0

매스 매 티카, 58 문자

생성 기능을 사용하는 매우 느린 솔루션 :

0//.i_/;(D[Sum[x^(n^#),{n,1,i}]^2,{x,i}]/.x->0)/i!<4:>i+1&
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.