n의 가장 가까운 소수, n의 제곱 및 n에 가장 가까운 피보나치 수의 평균은 얼마입니까?


13

이것은 많은 문제를 제기하는 수학 문제이며, 다소 도전적이며, 짐작할 수 있듯이 코드 골프이므로 가능한 한 짧아야합니다.

입력은 , n임의 인 정수 개수 (최소지지 정수에서 필요하지만이 한정되어서는 안된다). 출력 은 IS 평균 의 :

  • n
  • 제곱 n
  • 가장 가까운 소수 n
  • n피보나치 수열에서 가장 가까운 수

곧, 프로그램이 있어야 채널 표준 출력에 인쇄 결과 의를 (n+(n*n)+closestPrime(n)+closestFib(n))/4.

당신은 하지 않습니다 수 오버 플로우 등 일반 부동 소수점 정밀도 걱정해야하는 것도 괜찮습니다.

입력 방법은 전적으로 귀하에게 달려 있습니다. 코드 골프에서와 마찬가지로 가장 짧은 프로그램 (문자)이 이깁니다.

가장 가까운 것을 찾을 때 넥타이가 발생하는 경우 다음 중 하나를 선택하십시오.

  1. 위로 가다
  2. 내려가
  3. 무작위로 하나를 선택하십시오

"가장 가까운"정의하십시오. 관계는 어떻게 끊어 집니까?
피터 테일러

@Peter Taylor : 위, 아래로 이동하거나 무작위로 하나를 선택하십시오.
Anto

솔루션을 확인하기 위해 샘플 입 / 출력을 제공하십시오.
fR0DDY

“제한되지 않아야한다”고 말할 때 무엇을 지원해야합니까? 또는 "제한되지 않음"을 의미 했습니까?
Timwi

@Timwi! "need n't", 죄송합니다, 그것을
고치실

답변:


10

파이썬 160 문자

p=lambda n:any(n%x<1for x in range(2,n))
N=input()
a=0;b=1
while b<N:a,b=b,a+b
c=d=N
while p(c)and p(d):c-=1;d+=1
print (N+N*N+[b,a][2*N-a-b<0]+[c,d][p(c)])/4.0

가장 가까운 Fib 부분에 대한 약간의 설명 :

while 루프가 끝나면 a는 N보다 작고 b는 N보다 크거나 같습니다. 이제 [b,a][2*N-a-b<0]부품입니다. 그것을 [b, a] [(Na)-(bN)]으로보십시오. (Na)는 N과 a의 차이이며 유사하게 (bN) b와 N의 차이입니다.이 둘의 차이가 0보다 작 으면 a가 N에 가까워지고 그 반대도 마찬가지입니다.


왜 이것이 작동하는지에 대한 설명을 추가 할 수 있습니까?
Quixotic

@Debanjan 특정 사항이 있으십니까? 나는 모든 것이 자기 설명이라고 생각했다. :)
fR0DDY

가장 가까운 fib 부분의 비트 [b,a][2*N-a-b<0]:)
Quixotic

7

GolfScript, 59 자

~:N..*.,2>{:P{(.P\%}do(!},{{N-.*}$0=}:C~[1.{.@+.N<}do]C+++4/

이 스크립트는 일부 요구 사항을 충족하지 않습니다.

  • input에 대해서만 올바르게 작동 n >= 2하고 그렇지 않으면 충돌합니다.
  • 출력은 정수로 잘립니다.
  • 중간 정도의 큰 성능 n

코드의 간단한 연습 :

  1. ~:N..*입력은 N에 저장되고 우리는 즉시 n사각형을 모두 밀어 넣 n*n습니다.
  2. .,2>배열을 필터링하여 소수 목록을 생성합니다 [2..n*n]. 우리는 n*nn보다 큰 소수를 찾기 위해 (매우 나쁜!) 상한값으로 이전 계산을 사용합니다 .
  3. {:P{(.P\%}do(!},이전 배열은 시험 분할로 필터링됩니다. 각 정수 P는 모든 정수 [P-1..1]에 대해 테스트됩니다.
  4. {{N-.*}$0=}:C~까지의 거리를 기준으로 이전 배열을 정렬하고 n첫 번째 요소를 가져옵니다. 이제 우리는 가장 가까운 소수입니다.
  5. [1.{.@+.N<}do]C보다 큰 값을 얻을 때까지 피 보나 시스를 생성 n합니다. 운 좋게도이 알고리즘은 자연스럽게 이전 피본 나시를 추적하므로 배열에 모두 던지고 이전 거리 정렬을 사용합니다. 이제 가장 가까운 피보나치가 있습니다.
  6. +++4/평균. GolfScript는 플로트를 지원하지 않으므로 결과가 잘립니다.

GolfScript, 81 자

다음은 모든 요구 사항을 충족시키는 변형입니다.

~:N..*2N*,3,|2,^{:P{(.P\%}do(!},{{N-.*}$0=}:C~[0.1{.@+.N<}do]C+++100:E*4/.E/'.'@E%

에 대한 올바른 동작을 보장하기 n<2위해 2<(배열이 작을 때 충돌) 대신을 사용 3,|2,^합니다. 이것은 주요 후보 배열이 [2]언제 인지 확인합니다 n < 2. 다음 프라임의 상한 n*n2*n( Bertrand 's postulate )로 변경했습니다. 또한 0은 피본 나시 숫자로 간주됩니다. 결과는 끝에 고정 소수점 수학으로 계산됩니다. 흥미롭게도 결과는 항상 4 분의 1 (0, .25, .5, .75) 인 것처럼 보이므로 소수점 이하 2 자릿수가 충분하기를 바랍니다.

GolfScript를 처음 사용했을 때 개선의 여지가 있다고 확신합니다!


7
알다시피, 4로 나눌 때 당신이 네 번째를 얻는다는 것은 놀라운 일이 아닙니다. ;-)
Joey

...과연! +1;)
Mike Welsh

3

자바 스크립트, 190

function n(n)
{z=i(n)?n:0
for(x=y=n;!z;x--,y++)z=i(x)?x:i(y)?y:0
for(a=b=1;b<n;c=a+b,a=b,b=c);
return(n+n*n+(2*n-a-b<0?a:b)+z)/4}
function i(n)
{for(j=2;j<n;j++)
if(!(n%j))return 0
return 1}

[257]

function n(n)
{return(n+n*n+p(n)+f(n))/4}
function p(n)
{if(i(n))return n
for(a=b=n;;a--,b++){if(i(a))return a
if(i(b))return b}}
function i(n)
{for(j=2;j<n;j++)
if(!(n%j))return 0
return 1}
function f(n)
{for(a=b=1;b<n;c=a+b,a=b,b=c);
return 2*n-a-b<0?a:b}

비 압축 :

function closest( a, b, c )
{
  return 2*a-b-c < 0 ? b : c;
}

function closestPrime( n )
{
  a=b=n;
  if (isPrime( n ) ) return n;
  while ( true )
  {
    a-=1;
    b+=1;
    if (isPrime(a))return a;
    if (isPrime(b))return b;
  }
}

function isPrime( n )
{
  for (i=2;i<n;i++)
  {
    if ( !( n % i ) ) return false;
  }
  return true;
}

function closestFib( n )
{
  for(fib1=0,fib2=1;fib2<n;fib3=fib1+fib2,fib1=fib2,fib2=fib3);
  return closest( n, fib1, fib2 );
}

function navg(n)
{
  n2 = n*n;
  np = closestPrime( n );
  nf = closestFib( n );
  return ( n + n2 + np + nf ) / 4;
}

가장 가까운 주요 기능 : 단지 사용 a=0하고 긍정적으로 늘리면 공간을 절약 할 수 있다고 생각합니다 . 대신 체크 isPrime를 위해 a그리고 b바로 확인 isPrime(n+a)하고 isPrime(n-a). 아마 모든 것을 하나의 미친 삼항 문장으로 만들 수는 있지만 자바 스크립트에는 끔찍합니다.
Mr. Llama

다음은 꽤 잘 작동하는 것 같습니다 function closestPrime(n,o){return isPrime(n+o)?n+o:isPrime(n-o)?n-o:closestPrime(n,o+1);}. 그대로 호출하면 closestPrime(n,0)제대로 작동합니다. 필요에 따라 줄이십시오.
Mr. Llama

1

Mathematica, 70 69 바이트

Sp3000 덕분에 1 바이트가 절약되었습니다 (때로는 내장 기능이 최선의 방법이 아님).

((n=#)+#^2+(f=#&@@#@Range@Max[1,2n]~Nearest~n&)@Prime+f@Fibonacci)/4&

이것은 이름없는 함수를 정의하여 정수를 취하고 정확한 평균을 유리수로 생성합니다. 동점의 경우 더 작은 소수 / 피보나치 수가 선택됩니다.

이것은 2n가장 가까운 입력을 선택하기 전에 실제로 첫 번째 소수와 피보나치 수를 생성하기 때문에 큰 입력에는 매우 비효율적입니다 .


#&@@#.. 허?
seequ

@Sieg 오른쪽에서 시작 : #은 순수 함수 (의 f) 의 인수입니다 . 이 경우 실제로는 함수 자체이며 및에 f적용 되기 때문 입니다 . 따라서 주어진 함수를 범위의 각 정수에 적용합니다. 그럼 그냥 golfed 방법 목록의 첫 번째 요소를 추출하기. 목록 에 적용 하여 작동 합니다. 목록은 첫 번째 인수 만 반환하는 함수입니다. PrimeFibonacci#@Range@...#&@@#&
Martin Ender

0

Q, 119

가장 효율적인 것은 아닙니다.

{%[;4]x+(x*x)+((*:)a(&)b=min b:abs x-a:{x,sum -2#x}/[x-2;1 1])+(*:)d(&)e=min e:x-d:(&)1={(min x mod 2_(!)x)}each(!)x+2}

0

MATLAB 88 문자

C=@(F)(F(abs(F-n)==min(abs(F-n))));(n+n^2+C(primes(n*2))+C(round(1.618.^(1:n)/2.236)))/4

n은 정수입니다

내가 테스트 한 한 정수가 아닌 정수와 함께 작동하는 것은 매우 큰 숫자로도 작동하며 꽤 빨리 실행됩니다.


0

스칼라 299

object F extends App{type I=Int
def f(n:I,b:I=1,a:I=1):I=if(a>=n)if(a-n>n-b)b else a else f(n,a,b+a)
def p(n:I)=(2 to n-1).exists(n%_==0)
def i(n:I,v:I):Int=if(!p(n+v))n+v else i(n+v,v)
val a=readInt
println(({val p=Seq(-1,1).map(i(math.max(a,3),_))
if(a-p(0)>p(1)-a)p(1)else p(0)}+f(a)+a+a*a)/4.0)}

테스트 및 호출 :

a  a² nP(a) nF  ∑   /4.0 
------------------------
-2  4   2   1   5   1.25
-1  1   2   1   3   0.75
0   0   2   1   3   0.75
1   1   2   1   5   1.25
2   4   2   2   10  2.5
3   9   2   3   17  4.25
4   16  3   5   28  7.0
5   25  3   5   38  9.5

질문은 이야기 any Integer하지만 문제는 0 미만의 값에 대해서는 흥미롭지 않습니다. 그러나 어떻게 시작합니까? 0시에? 1시에? 그리고 11의 다음 프라임은 무엇입니까? 11 그 자체?

넥타이의 경우 다음에 더 크게 또는 더 낮게 허용한다는 생각은 나쁘다. 불필요하게 비교하기가 어렵 기 때문이다. 결과가 다른 경우 다른 피브, 다른 프라임, 다른 피브 및 다른 프라임을 선택했거나 귀하의 결과가 잘못되었거나 다른 사람의 결과가 잘못되었거나 조합 인 경우 : 다른 선택이지만 비록 틀릴 수도 있지만, 둘 다 틀릴 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.