Tìm Prime Fibonnaci thứ n, trong mã ngắn nhất


8

Thử thách khá đơn giản:

  1. Lấy một số nguyên dương nlàm đầu vào.
  2. Xuất ra nsố nguyên tố Fibonacci thứ.

Đầu vào có thể là một tham số cho hàm (và đầu ra sẽ là giá trị trả về) hoặc có thể được lấy từ dòng lệnh (và xuất ra ở đó).

Lưu ý: Không được phép sử dụng các hàm kiểm tra chính được tạo sẵn hoặc các bộ tạo chuỗi Fibonacci.

Chúc may mắn!



1
Có giới hạn về kích thước?
MrZander

@MrZander Kích thước của cái gì?
Bọ rùa

Kích thước của đầu vào / đầu ra. Tôi có cần tài khoản cho Prime_fib (1000000000000000000) không? Giới hạn ở đâu?
MrZander

@MrZander Thuật toán nên hỗ trợ các số lớn tùy ý, nhưng hàm có thể đưa ra một ngoại lệ bị ràng buộc nếu kết quả quá lớn so với một int bình thường.
Bọ mực

Câu trả lời:


2

Ruby, 55

f=->n,a=1,b=2{n<1?a:f[n-(2..b).find{|f|b%f<1}/b,b,a+b]}

Tự gọi mình một cách đệ quy, theo dõi của hai số cuối cùng trong dãy Fibonacci trong ab, và có bao nhiêu số nguyên tố nó thấy cho đến nay với n. nbị giảm khi hệ số nhỏ nhất lớn hơn 1 b, chia cho bvà làm tròn xuống số nguyên gần nhất, là 1 thay vì 0, chỉ xảy ra với số nguyên tố b. Khi nó nhìn thấy tất cả các số nguyên tố mà nó được yêu cầu, nó sẽ in ra a, đây là lần bthử nghiệm gần đây nhất về tính nguyên thủy.


4

C, 66

f(n,a,b){int i=2;while(a%i&&i++<a);return(n-=i==a)?f(n,b,a+b):a;}


2
Tôi nghĩ bạn nên xác định giá trị bắt đầu của abbên trong chức năng của bạn.
defhlt

Sẽ không một vòng lặp for ngắn hơn? (Tôi không biết rõ về C)
Inkorms

1
Có thể giảm xuống còn 65 ký tự: f(n,a,b){int i=2;while(a%i&&i++<a);return(n-=i==a)?f(n,b,a+b):a;}- @ArtemIce: a= 1 và b= 2 làm việc cho tôi.
schnaader

2
@schnaader tất nhiên họ đã làm việc, nhưng mã được đặt & b nên được tính vì đó là codegolf
defhlt

3
Thiếu mã khởi tạo cho a & b ... Vậy bạn có thể cải thiện khi chỉ cần thêm g(n){f(n,1,2);}không?
thỏ con

3

C, 85 , 81 , 76

f(n){int i=1,j=0,k;for(;n;n-=k==i)for(j=i-j,i+=j,k=2;i%k&&k++<i;);return i;}
  • kiểu mã mượn của kiểm tra số nguyên tố đơn giản hóa từ @Gautam

  • chức năng C khép kín (không có toàn cầu)

Kiểm tra:

main(int n,char**v){printf("%d\n",f(atoi(v[1])));}

./a.out 10
433494437

./a.out 4
13

2

Mathicala, 59 hoặc 63 byte

(a=b=1;Do[While[{a,b}={b,a+b};Length@Divisors@b>2],{#}];b)&
(a=b=1;Do[While[{a,b}={b,a+b};b~Mod~Range@b~Count~0>2],{#}];b)&

Đây là các hàm không được đặt tên nlàm đầu vào của chúng và trả về số nguyên tố Fibonacci chính xác. Phiên bản ngắn hơn sử dụng Divisors. Tôi không hoàn toàn chắc chắn liệu điều này có được phép hay không, nhưng câu trả lời Mathicala khác thậm chí còn sử dụng FactorInteger.

Cái thứ hai hoàn toàn không sử dụng bất kỳ hàm liên quan đến yếu tố nào, mà thay vào đó, đếm số nguyên nhỏ hơn số nguyên ntạo ra 0trong một phép toán modulo. Ngay cả phiên bản này cũng đánh bại tất cả các bài nộp hợp lệ, nhưng tôi chắc chắn chỉ cần đăng câu trả lời này sẽ khiến một số người cung cấp câu trả lời cạnh tranh trong GolfScript, APL hoặc J .;)


1

Toán học 147 143 141 ký tự

f@0 = 0; f@1 = 1; f@n_ := f[n - 1] + f[n - 2]
q@1 = False; q@n_ := FactorInteger@n~MatchQ~{{_, 1}}
p = {}; k = 1; While[Length@p < n, If[q@f@k, p~AppendTo~f[k]]; k++];p[[-1]]

f là định nghĩa đệ quy của số Fibonacci.

q phát hiện các số nguyên tố.

klà một số nguyên tố Fibonacci q@f@klà Đúng.

Với n= 10, đầu ra là 433494437.


trời ơi, cảm ứng ...: rùng mình:
acolyte

@acolyte Thật vui khi nhìn vào dấu vết của một hàm gọi chính nó.
DavidC

Người: Đó là một trong những khóa học đã xác nhận rằng tôi cần phải rút frak ra khỏi CompSci.
acolyte

1

Ruby, 94 68 67

n=->j{a=b=1
while j>0
a,b=b,a+b
(2...b).all?{|m|b%m>0}&&j-=1
end
b}





Clojure, 112

Ung dung:

(defn nk [n]
  (nth 
    (filter
      (fn[x] (every? #(> (rem x %) 0) (range 2 x)))    ; checks if number is prime
      ((fn z[a b] (lazy-seq (cons a (z b (+ a b))))) 1 2)) ; Fib seq starting from [1, 2]
    n)) ; get nth number

Golf: (defn q[n](nth(filter(fn[x](every? #(>(rem x %)0)(range 2 x)))((fn z[a b](lazy-seq(cons a(z b(+ a b)))))2 3))n))


1

Haskell 108

p=2 : s [3,5..]  where
    s (p:xs) = p : s [x|x<-xs,rem x p /= 0]
f=0:1:(zipWith (+) f$tail f)
fp=intersect p f

Để có được nsố thứ gọi nó fp !! n.

EDIT: Sic. Trả lời sai, tôi sửa nó.


0

Groovy: 105 (134 với khoảng trắng)

b là chức năng của Wikipedia.

đóng cửa bên trong if là chức năng kiểm tra chính. Cập nhật: một sửa chữa nhỏ trên nó

r là số nguyên tố chính.

r={ n->
  c=k=0
  while(1) {
    b={a->a<2?a:b(a-1)+b(a-2)}
    f=b k++
    if({z->z<3?:(2..<z).every{z%it}}(f)&&c++==n)return f
  }
}

Các trường hợp thử nghiệm:

assert r(0) == 0
assert r(1) == 1
assert r(2) == 1
assert r(3) == 2
assert r(4) == 3
assert r(5) == 5
assert r(6) == 13
assert r(7) == 89
assert r(8) == 233
assert r(9) == 1597

Một phiên bản có thể đọc được:

def fib(n) { 
  n < 2 ? n : fib(n-1) + fib(n-2)
}
def prime(n) {
  n < 2 ?: (2..<n).every { n % it }
}
def primeFib(n) { 
  primes = inc = 0
  while( 1 ) {
    f = fib inc++
    if (prime( f ) && primes++ == n) return f
  }
}

0

C, 105 (có dấu cách)

Thực hiện bằng cách sử dụng lập trình động:

long f(int n){int i;long b2=0,b1=1,n;if(n)return 0;for(i=2;i<n;i++){n=b1+b2;b2=b1;b1=n;}return b1+b2;}

Mã có thể đọc được:

long f(int n)
{
  int i;
  long back2 = 0, back1 = 1;
  long next;

  if ( n == 0 ) return 0;

  for ( i=2; i<n; i++ )
  {
    next  = back1 + back2;
    back2 = back1;
    back1 = next;
  }

  return back1 + back2;
}

Làm thế nào điều này có thể có 1 phiếu bầu? Không trả lời câu hỏi (không kiểm tra tính nguyên thủy) và phiên bản ngắn thậm chí không biên dịch
edc65

0

Pyth - 29 byte

Vòng lặp Fibonacci cho đến khi mảng có độ dài n nhưng chỉ thêm vào mảng nếu là số nguyên tố.

J2K1W<lYQAJK,+KJJI!tPK~Y]K;eY

Loại chậm, nhưng đạt n = 10 trong ~ 15 giây. Có lẽ có thể được chơi golf nhiều hơn.

J2              J=2
K1              K=1
W        <lYQ   While length of array<input
 AJK,+KJJ       J,K=K+J,J
 I!tPK          If K prime(not builtin prime function, uses prime factorization)
  ~Y]K          append K to Y
;               End loop so next is printed
eY              last element of Y
Disclaimer: Pyth mới hơn thử thách này, vì vậy không cạnh tranh.

-1

Javascript:

Number.prototype.fiboN = function()
{
var r = (Math.pow((1 + Math.sqrt(5)) / 2,this) - (Math.pow(1 - (1 + Math.sqrt(5)) / 2,this))) / Math.sqrt(5);
return r.toFixed(0);
}

alert((10).fiboN()); // = 55 assuming the serie starts with 1,1,2,3,5,8,13,...
alert((46).fiboN()); // = 1836311903

Không trả lời câu hỏi - 55 không phải là Prime. Tuy nhiên, thật tuyệt khi bạn đã sử dụng thứ Tỷ lệ vàng đó.
Jacob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.