Tìm Fibohexaprime thứ n


23

Thử thách lần này là tìm ra Fibohexaprime thứ n . Định nghĩa của Fibohexaprime như sau:

Trước tiên, chúng tôi quan sát một danh sách với các số Fibonacci:

N  | Fibonacci number
1  | 1 
2  | 1 
3  | 2 
4  | 3 
5  | 5 
6  | 8 
7  | 13 
8  | 21 
9  | 34 
10 | 55 
11 | 89 
12 | 144 
13 | 233 
14 | 377 
15 | 610
16 | 987 
17 | 1597

Sau đó, chúng tôi chuyển đổi các số thành thập lục phân:

N  | Fib  | Hex 
1  | 1    | 1
2  | 1    | 1
3  | 2    | 2
4  | 3    | 3
5  | 5    | 5
6  | 8    | 8
7  | 13   | D
8  | 21   | 15
9  | 34   | 22
10 | 55   | 37
11 | 89   | 59
12 | 144  | 90
13 | 233  | E9
14 | 377  | 179
15 | 610  | 262
16 | 987  | 3DB
17 | 1597 | 63D

Từ các số thập lục phân, chúng tôi lọc ra các chữ cái. Tất cả chúng ta còn lại là số. Chúng ta cần kiểm tra xem những con số này có phải là số nguyên tố không:

hex |  filtered |  is prime? |  N =
1   >  1        >  false
1   >  1        >  false
2   >  2        >  true         1
3   >  3        >  true         2
5   >  5        >  true         3
8   >  8        >  false
D   >  0        >  false
15  >  15       >  false
22  >  22       >  false
37  >  37       >  true         4
59  >  59       >  true         5
90  >  90       >  false
E9  >  9        >  false
179 >  179      >  true         6
262 >  262      >  false
3DB >  3        >  true         7
63D >  63       >  false

Nếu số được lọc là số nguyên tố, chúng tôi gọi đây là Fibohexaprime . Bạn có thể thấy rằng N = 7, số MySpace liên quan là 987.

Nhiệm vụ rất đơn giản, khi được cung cấp một đầu vào bằng STDIN hoặc một giải pháp thay thế chấp nhận được, hãy viết một chương trình hoặc một hàm tạo ra Fibohexaprime thứ n bằng cách sử dụng STDOUT hoặc một phương án thay thế chấp nhận được.

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

Input - Output
1     - 2
2     - 3
3     - 5
4     - 55
5     - 89
6     - 377
7     - 987
8     - 28657
9     - 75025
10    - 121393
11    - 317811
12    - 5702887
13    - 9227465
14    - 39088169
15    - 102334155
16    - 32951280099
17    - 4052739537881
18    - 806515533049393
19    - 7540113804746346429

Những quy định:

  • Cho một số nguyên nằm giữa 119(các giá trị trên 20vượt quá giá trị tối đa cho số nguyên có chữ ký 64 bit), xuất giá trị tương ứng.
  • Bạn có thể viết một chức năng hoặc một chương trình.
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

Theo cách nói của nó, có vẻ như các hàm cũng phải đọc từ STDIN và ghi vào STDOUT. Đúng không? Thông thường, chúng tôi cho phép các hàm chấp nhận đối số và trả về giá trị một cách thuận tiện.
Alex A.

2
@AlexA. Cả hai đều là lựa chọn thay thế chấp nhận được. Đọc từ STDIN và sử dụng STDOUT là không bắt buộc.
Adnan

Câu trả lời:


4

Bình thường, 27 byte

Leu,eGsGbU2ye.fq1lPs-.HyZGQ

Trình diễn

ytính toán số Fibonacci thứ n. Một .fvòng lặp tìm thấy fibohexaprime theo đầu vào.


12

MATL , 28 byte

Cái này sử dụng MATL phiên bản 1.0.0 , được xuất bản trên Esolang vào ngày 12 tháng 12, sớm hơn thử thách này.

1Hi:"`tb+t16YAt58<)YtZp~]]1$

Thí dụ

>> matl 1Hi:"`tb+t16YAt58<)YtZp~]]1$
> 10
121393

Giải trình

Mã này tương tự như trong câu trả lời của Martin Büttner .

1           % number literal
H           % paste from clipboard H. Initial contents: 2
i:          % vector of equally spaced values from 1 to input value           
"           % for                      
  `         % do...while         
    t       % duplicate                           
    b       % bubble up element in stack          
    +       % addition 
    t       % duplicate                   
    16YA    % convert integer to string representation in base 16
    t       % duplicate             
    58      % number literal: first ASCII code after '9'           
    <       % is less than? (element-wise)    
    )       % reference () indexing with logical index from previous comparison
    Yt      % convert string to number 
    Zp      % true for prime numbers                                
    ~       % logical 'not'
  ]         % end                                                   
]           % end                                                   
1$          % input specification for final implicit display function

4
Câu trả lời MATL đầu tiên trên thế giới! Làm tốt lắm, Luis!
cốc

1
Chiến thắng cho MATL! Chào mừng đến với thế giới của golf mã!
rayryeng - Phục hồi Monica

8

CJam, 28 byte

TXri{{_@+_Gb{A<},Abmp!}g}*p;

Kiểm tra nó ở đây.

Giải trình

TX        e# Push 0 and 1 to initialise Fibonacci computation.
ri        e# Read input and convert to integer N.
{         e# Run this block N times...
  {       e#   While the condition on top of the stack is truthy...
    _@+   e#     Compute next Fibonacci number (dropping the second-to-last one).
    _Gb   e#     Duplicate and convert to base 16.
    {A<}, e#     Keep only digits less than 10.
    Ab    e#     Convert from base 10.
    mp!   e#     Check that it's not a prime.
  }g
}*
p;        e# Print the last number we found and discard the one before.

7

Perl 6 , 62 byte

Vượt qua đầu tiên của tôi chỉ cần làm cho nó hoạt động là:

{(grep *[1].is-prime,map {$_,+[~] .base(16)~~m:g/\d/},(1,1,*+*...*))[$_-1;0]} # 77

Bằng cách kết hợp grepmap, tôi có thể loại bỏ 10 byte

{(map {$_ if is-prime [~] .base(16)~~m:g/\d/},(1,1,*+*...*))[$_-1]} # 67

Nếu tôi sử dụng grepthay vì map, tôi tiết kiệm thêm 5 byte:

{(grep {is-prime [~] .base(16)~~m:g/\d/},(1,1,*+*...*))[$_-1]} # 62

sử dụng:

# give it a name
my &code = {...}

say code $_ for 1..^20;

2
3
5
55
89
377
987
28657
75025
121393
317811
5702887
9227465
39088169
102334155
32951280099
4052739537881
806515533049393
7540113804746346429

3

Toán học 111 byte

Có thể vẫn còn chỗ để chơi golf.

t=Table[Fibonacci@k,{k,1600}];f@n_:=PrimeQ@FromDigits[Select[n~IntegerDigits~16,#<10&]];
g@k_:=Select[t,f][[k]]

g[7]

987


g[19]

7540113804746346429


3

Julia, 123 byte

n->(a=[];i=1;while endof(a)<n b=([1 1;1 0]^i)[1];(s=filter(isdigit,hex(b)))>""&&isprime(parse(s))&&push!(a,b);i+=1end;a[n])

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một số nguyên. Để gọi nó, đặt tên cho nó, vd f=n->....

Ung dung:

function f(n::Integer)
    # Initialize an array and an index
    a = []
    i = 1

    # Loop while we've generated fewer than n fibohexaprimes
    while endof(a) < n
        # Get the ith Fibonacci number
        b = ([1 1; 1 0]^i)[1]

        # Filter the hexadecimal representation to digits only
        s = filter(isdigit, hex(b))

        # If there are digits to parse, parse them into an
        # integer, check primality, and push the Fibonacci
        # number if prime
        s > "" && isprime(parse(s)) && push!(a, b)

        # Next
        i += 1
    end

    # Return the last generated
    return a[n]
end

3

LỖ HỔNG , 204 byte

Câu trả lời này là không đáng kể, ngoại trừ GAP đủ mát mẻ để có thể tìm thấy cặp vợ chồng tiếp theo (và mát hơn, nó vẫn tìm thấy những thứ này trong một phần nghìn giây với mã đã cho).

gap>f(20);                                                                    
31940434634990099905
gap> f(21);
12776523572924732586037033894655031898659556447352249
gap> f(22);
971183874599339129547649988289594072811608739584170445
gap> f(23);
1324695516964754142521850507284930515811378128425638237225
gap> f(24);
187341518601536966291015050946540312701895836604078191803255601777

Lưu ý rằng f (24) nằm trong khoảng từ 2 ^ 216 đến 2 ^ 217.

Đây là mã:

f:=function(n)local c,i,x;c:=1;i:=0;while c<=n do x:=HexStringInt(Fibonacci(i));RemoveCharacters(x,"ABCDEFGHIJKLMNOPQRSTUVWXYZ");x:=Int(x);if IsPrime(x) then c:=c+1;fi;i:=i+1;od;Print(Fibonacci(i-1));end;

Có lẽ vẫn còn một số golf có thể được thực hiện. Tôi nghĩ rằng việc thực hiện là khá đơn giản.

Ung dung:

f:=function(n)
    local counter,i,x;
    counter:=1;i:=0;
    while counter<=n do
        x:=HexStringInt(Fibonacci(i));
        RemoveCharacters(x,"ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        x:=Int(x);
        if IsPrime(x) then
            counter:=counter+1;
        fi;
        i:=i+1;
    od;
    Print(Fibonacci(i-1));
end;

3

C, 186 183 byte

#include<stddef.h>
size_t a,b,c,d,m,x;size_t F(n){a=0,b=1;while(n){x=b;b+=a;a=x;c=0,m=1;while(x)d=x%16,m*=d<10?c+=m*d,10:1,x/=16;d=c>1;x=2;while(x<c)if(c%x++==0)d=0;d&&--n;}return a;}

Bài kiểm tra tính nguyên thủy rất kém hiệu quả, vì vậy việc tính toán sẽ phải vật lộn một chút n > 16và trở nên đau đớn kéo dàin = 19 . Tuy nhiên, nó hoạt động và cho kết quả mong đợi.

Mã này giả định size_tlà loại 64 bit, đúng với cả Linux và Windows 64 bit.


Tiền thưởng: thật không may, chúng tôi được yêu cầu sử dụng các loại 64 bit, dẫn đến chi phí là 33 byte. Phiên bản sau hoạt động để n <= 15sử dụng intvà dài 150 byte:

a,b,c,d,m,x;F(n){a=0,b=1;while(n){x=b;b+=a;a=x;c=0,m=1;while(x)d=x%16,m*=d<10?c+=m*d,10:1,x/=16;d=c>1;x=2;while(x<c)if(c%x++==0)d=0;d&&--n;}return a;}

Kiểm tra chính:

#include <stdio.h>

int main() {
  printf("Input - Output\n");
  for (int i = 1; i < 20; ++i) {
    printf("%2d    - %ld\n", i, F(i));
  }
}

Bạn có thể tiết kiệm một chút bằng cách sử dụng size_tvà bỏ bao gồm? Nó đặc trưng cho việc triển khai, nhưng dường như là 64 bit trong cả gcc 64 bit của Linux và Windows (và từ khi nào chúng ta quan tâm đến tính di động trong codegolf?). (lưu ý phụ: %ldkhông phải là 64 bit trong Windows 64 bit; cần %lld)
Bob

@Bob Tôi đã nghĩ về nó, nhưng size_tkhông phải là nội dung, nó được xác định trong stddef.h(lần lượt được bao gồm trực tiếp hoặc gián tiếp bởi hầu như bất kỳ tiêu đề nào khác). Cách này hay cách khác, tôi cần một #include. Mặc dù vậy, tôi vẫn có thể tiết kiệm 2 byte bằng cách sử dụng size_tthay vì uint64_t:)
Stefano Sanfilippo

Cũng cảm ơn vì một lldchút, tôi đã không có cơ hội thử nghiệm nó trên Windows (nhưng tính di động không thành vấn đề, phải không?)
Stefano Sanfilippo

Hừm, nó phải đến từ stdio.hkhi tôi đang thử nghiệm. Trong mọi trường hợp - bạn vẫn có thể lưu một vài bằng cách math.hthay vì stddef.h.
Bob

math.hkhông lừa tôi (GCC 4.9 với GNU libc)
Stefano Sanfilippo

2

Python 2, 127 byte

N=input();a,b=0,1
while N:a,b=b,a+b;t=int(''.join(c for c in hex(b)if ord(c)<65));N-=(t>1)*all(t%x for x in range(2,t))
print b

Thuật toán có thể hiệu quả hơn rất nhiều. Cụ thể, kiểm tra tính nguyên thủy kiểm (t>1)*all(t%x for x in range(2,t))tra tất cả các yếu tố tiềm năng t-1, khi thực sự nó sẽ chỉ phải kiểm tra đến tầng của căn bậc hai . Kể từ khi rangecửa hàng một toàn bộ danh sách trong bộ nhớ bằng Python 2, dẫn này cho một người MemoryErrorN=17(trên máy tính của tôi sử dụng các thiết lập mặc định).


2

Ruby, 160 byte

->i{t,o,k=[],[],0;f=->n{t[n]||=n<3?1:f[n-2]+f[n-1]};(r=('%x'%f[k]).scan(/\d/).join.to_i;(r>1&&(r==2||(2...r).none?{|j|r%j==0}))&&o<<r;k+=1)while !o[i-1];t[k-1]}

Ung dung:

-> i {
  t, o, k = [], [], 0
  f = -> n {
    t[n] ||= n < 3 ? 1 : f[n-2] + f[n-1]
  }
  while !o[i-1] do
    r=('%x'%f[k]).scan(/\d/).join.to_i
    o << r if (r > 1 && (r == 2 || (2...r).none?{|j| r%j == 0 }))
    k+=1
  end
  t[k-1]
}

Sử dụng:

# Assign the anonymous function to a variable
m = ->i{t,o,k=[],[],0;f=->n{t[n]||=n<3?1:f[n-2]+f[n-1]};(r=('%x'%f[k]).scan(/\d/).join.to_i;(r>1&&(r==2||(2...r).none?{|j|r%j==0}))&&o<<r;k+=1)while !o[i-1];t[k-1]}

m[2]
=> 3
m[19]
=> 7540113804746346429

2

R, 164 byte

g=function(n){f=function(m)ifelse(m<3,1,f(m-1)+f(m-2));p=0;while(n){p=p+1;x=gsub("\\D","",sprintf("%x",f(p)));x[x==""]=1;y=1:x;if(sum(!tail(y,1)%%y)==2)n=n-1};f(p)}

Được thụt lề, với các dòng mới:

g=function(n){
    f = function(m)ifelse(m<3,1,f(m-1)+f(m-2)) #Fibonacci function
    p = 0
    while(n){
        p = p+1
        x = gsub("\\D","",sprintf("%x",f(p))) #To Hex, and get rid of non-digits
        x[x==""] = 1 #If x is empty string
        y = 1:x #Converts to integer(!) and save the 1-to-x sequence to a variable
        if(sum(!tail(y,1)%%y)==2) n = n-1 #If prime, decrements counter
        }
    f(p)
    }

Ví dụ:

> g(1)
[1] 2
> g(5)
[1] 89
> g(10)
[1] 121393
> g(12)
[1] 5702887
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.