อะไรคือค่าเฉลี่ยของ n, ไพรเวตที่ใกล้ที่สุดกับ n, สแควร์ของ n และจำนวนฟีโบนักชีที่ใกล้เคียงที่สุดถึง n?


13

นี่เป็นปัญหาทางคณิตศาสตร์ที่ใช้คำถามหลายอย่างทำให้มันค่อนข้างท้าทายและอย่างที่คุณอาจเดาได้ว่ามันคือรหัสกอล์ฟดังนั้นควรสั้นที่สุดเท่าที่จะทำได้

อินพุต , nเป็นใด ๆจำนวนเต็มจำนวน (ควรที่จำนวนเต็มสนับสนุนน้อย แต่จำเป็นที่จะต้องไม่ถูก จำกัด ) เอาท์พุทเป็นค่าเฉลี่ยของ:

  • n
  • กำลังสองของ n
  • จำนวนที่ใกล้เคียงที่สุดถึง n
  • จำนวนที่ใกล้เคียงที่สุดnในลำดับฟีโบนักชี

ไม่นานโปรแกรมควรพิมพ์ไปออกมาตรฐานช่องผล(n+(n*n)+closestPrime(n)+closestFib(n))/4ของ

คุณไม่ต้องกังวลกับความเป็นไปได้ที่จะเกิดความผิดพลาด ฯลฯ ความแม่นยำของจุดลอยตัวปกติก็ใช้ได้เช่นกัน

วิธีการป้อนข้อมูลจะขึ้นอยู่กับคุณอย่างสมบูรณ์ โปรแกรมที่สั้นที่สุด (เป็นตัวอักษร) ชนะเช่นเคยกับ code golfs

ในกรณีที่มีเน็คไทเกิดขึ้นเมื่อคุณมองหาสิ่งที่ใกล้เคียงที่สุดให้เลือกข้อใดข้อหนึ่งต่อไปนี้:

  1. ขึ้น
  2. ลงข้างล่าง
  3. เลือกหนึ่งแบบสุ่ม

กำหนด "ใกล้เคียง" ความสัมพันธ์นั้นหักได้อย่างไร?
Peter Taylor

@ Peter Taylor: เลื่อนขึ้นลงหรือเลือกแบบสุ่ม
Anto

ให้อินพุต / เอาต์พุตตัวอย่างบางส่วนเพื่อตรวจสอบการแก้ปัญหา
fR0DDY

เมื่อคุณพูดว่า“ ต้องไม่ถูก จำกัด ” ต้องมีอะไรอีกบ้างที่สนับสนุน หรือคุณหมายถึง "ไม่จำเป็นต้อง จำกัด "?
Timwi

@Timwi! "ไม่จำเป็น" ขออภัยจะแก้ไข
Anto

คำตอบ:


10

Python 160 Chars

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

คำอธิบายเล็กน้อยเกี่ยวกับส่วนที่ใกล้เคียงที่สุด:

เมื่อขณะที่ลูปสิ้นสุด 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

@Dananjan มีอะไรพิเศษที่คุณไม่อยากรู้? ฉันคิดว่าทุกอย่างเป็นตัวอธิบาย :)
fR0DDY

เพียงเล็กน้อยส่วนโกหกที่ใกล้ที่สุด[b,a][2*N-a-b<0]:)
เพ้อฝัน

7

GolfScript, 59 ตัวอักษร

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

สคริปต์นี้ไม่เป็นไปตามข้อกำหนดบางประการ:

  • ทำงานได้อย่างถูกต้องสำหรับอินพุตn >= 2เท่านั้นมิฉะนั้นจะขัดข้อง
  • เอาต์พุตถูกปัดเศษเป็นจำนวนเต็ม
  • ประสิทธิภาพที่ยอดเยี่ยมสำหรับขนาดใหญ่พอสมควร n

คำแนะนำสั้น ๆ ของรหัส:

  1. ~:N..*อินพุตถูกเก็บไว้ใน N และเรากดทั้งสองnและสี่เหลี่ยมn*nทันที
  2. .,2>[2..n*n]เราจะสร้างรายการของจำนวนเฉพาะโดยการกรองอาร์เรย์ เราใช้การคำนวณก่อนหน้าของเราn*nว่าเป็นขอบเขตที่แย่มากสำหรับการค้นหานายกที่มีขนาดใหญ่กว่า n
  3. {:P{(.P\%}do(!},อาร์เรย์ก่อนหน้าของเราถูกกรองโดยแผนกทดลอง จำนวนเต็ม P แต่ละตัวจะถูกทดสอบกับทุกจำนวนเต็ม [P-1..1]
  4. {{N-.*}$0=}:C~เรียงลำดับอาร์เรย์ก่อนหน้าตามระยะทางnและจับองค์ประกอบแรก ตอนนี้เรามีนายกที่ใกล้ที่สุด
  5. [1.{.@+.N<}do]Cเราสร้าง Fibonnacis จนกว่าเราจะได้มากกว่าnหนึ่ง โชคดีที่อัลกอริทึมนี้ติดตาม Fibonnaci ก่อนหน้านี้ตามธรรมชาติดังนั้นเราจึงโยนมันลงในอาร์เรย์และใช้การเรียงลำดับระยะทางก่อนหน้าของเรา ตอนนี้เรามี Fibonnaci ที่ใกล้เคียงที่สุด
  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*nเป็น2*n( สมมุติของเบอร์แทรนด์ ) นอกจากนี้ 0 ถือว่าเป็นหมายเลข Fibonnaci ผลลัพธ์จะถูกคำนวณในคณิตศาสตร์จุดคงที่ในตอนท้าย น่าสนใจดูเหมือนว่าผลลัพธ์จะเป็นที่สี่เสมอ (0, .25, .5, .75) ดังนั้นฉันหวังว่าความแม่นยำทศนิยม 2 ตำแหน่งนั้นเพียงพอแล้ว

รอยแตกครั้งแรกของฉันเมื่อใช้ GolfScript ฉันแน่ใจว่ามีพื้นที่สำหรับการปรับปรุง!


7
คุณรู้ไหมว่าเมื่อหารด้วย 4 มันไม่น่าแปลกใจเลยที่คุณได้อันดับสี่ ;-)
Joey

... แน่นอน! +1;)
Mike Welsh

3

JavaScript, 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 (บางครั้งในตัวเครื่องไม่ใช่วิธีที่ดีที่สุด)

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

สิ่งนี้นิยามฟังก์ชันที่ไม่มีชื่อซึ่งรับค่าจำนวนเต็มและสร้างค่าเฉลี่ยที่แน่นอนว่าเป็นจำนวนตรรกยะ ในกรณีของความสัมพันธ์จะเลือกหมายเลขเฉพาะ / จำนวนฟีโบนัชชีที่เล็กกว่า

สิ่งนี้ไม่มีประสิทธิภาพมากสำหรับอินพุตขนาดใหญ่เพราะจริง ๆ แล้วสร้าง2nจำนวนเฉพาะช่วงแรกและหมายเลขฟีโบนักชีก่อนที่จะเลือกที่ใกล้ที่สุด


#&@@#.. หืมม
seequ

@ Siieg เริ่มต้นจากด้านขวา: #เป็นอาร์กิวเมนต์ของฟังก์ชั่นบริสุทธิ์ (จากf) กรณีนี้ก็จริงฟังก์ชั่นที่ตัวเองตั้งแต่fถูกนำไปใช้และPrime Fibonacciดังนั้นจึง#@Range@...ใช้ฟังก์ชั่นที่กำหนดให้กับแต่ละจำนวนเต็มในช่วง จากนั้น#&@@เป็นเพียงวิธี golfedเพื่อแยกองค์ประกอบแรกของรายการ มันทำงานโดยใช้#&กับรายการซึ่งเป็นฟังก์ชั่นที่เพียงส่งกลับอาร์กิวเมนต์แรก
Martin Ender

0

คำถามที่ 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.