ค้นหา Fibohexaprime ที่ n


23

ความท้าทายในครั้งนี้คือการหาn TH Fibohexaprime คำจำกัดความของFibohexaprimeมีดังต่อไปนี้:

ก่อนอื่นเราสังเกตรายการที่มีหมายเลขฟีโบนักชี:

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

หลังจากนั้นเราแปลงตัวเลขเป็นเลขฐานสิบหก:

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

จากตัวเลขฐานสิบหกเรากรองตัวอักษร สิ่งที่เราเหลือคือตัวเลข เราต้องตรวจสอบว่าตัวเลขเหล่านี้ดีหรือไม่:

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

ถ้าจำนวนกรองเป็นนายกเราเรียกสิ่งนี้ว่าFibohexaprime คุณจะเห็นว่าN = 7จำนวนฟีโบนัชชีที่เกี่ยวข้องคือ 987

ภารกิจนั้นง่ายเมื่อให้อินพุตโดยใช้ STDIN หรือทางเลือกที่ยอมรับได้ให้เขียนโปรแกรมหรือฟังก์ชั่นที่ส่งออก Fibohexaprime ที่ n โดยใช้ STDOUT หรือทางเลือกที่ยอมรับได้

กรณีทดสอบ

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

กฎระเบียบ:

  • รับค่าจำนวนเต็มระหว่าง1และ19(ค่าด้านบนมีค่า20เกินค่าสูงสุดสำหรับจำนวนเต็มแบบ 64 บิต) ส่งออกค่าที่สอดคล้องกัน
  • คุณสามารถเขียนฟังก์ชั่นหรือโปรแกรม
  • นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!

วิธีการใช้คำพูดฟังก์ชั่นจะต้องอ่านจาก STDIN และเขียนไปยัง STDOUT ถูกต้องหรือไม่ โดยปกติเราอนุญาตให้ฟังก์ชั่นยอมรับข้อโต้แย้งและคืนค่าตามความสะดวก
Alex A.

2
@AlexA ทั้งสองเป็นทางเลือกที่ยอมรับได้ การอ่านจาก STDIN และการใช้ STDOUT นั้นไม่จำเป็น
Adnan

คำตอบ:



12

MATL , 28 ไบต์

สิ่งนี้ใช้ MATL เวอร์ชัน1.0.0ซึ่งเผยแพร่ในEsolangsในวันที่ 12 ธันวาคมซึ่งเร็วกว่าความท้าทายนี้

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

ตัวอย่าง

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

คำอธิบาย

รหัสคล้ายกับว่าในคำตอบที่มาร์ติน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
คำตอบ MATL แรกของโลก! ทำได้ดีมาก Luis!
บีกเกอร์

1
Hurray สำหรับ MATL! ยินดีต้อนรับสู่โลกแห่งการตีกอล์ฟ!
rayryeng - Reinstate Monica

8

CJam, 28 ไบต์

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

ทดสอบที่นี่

คำอธิบาย

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 ไบต์

ผ่านครั้งแรกของฉันเพียงแค่ไปทำงานคือ:

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

ด้วยการรวมกับgrepและmapฉันสามารถลบ 10 ไบต์

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

ถ้าฉันใช้grepแทนmapฉันจะประหยัดอีก 5 ไบต์:

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

การใช้งาน:

# 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

Mathematica 111 ไบต์

อาจมีห้องสำหรับเล่นกอล์ฟเพิ่มเติม

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

จูเลีย 123 ไบต์

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])

นี่เป็นฟังก์ชั่นนิรนามที่รับจำนวนเต็มและคืนค่าจำนวนเต็ม f=n->...เรียกว่าให้มันชื่อเช่น

Ungolfed:

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

GAP , 204 ไบต์

คำตอบนี้ค่อนข้างธรรมดา แต่ GAP นั้นเจ๋งพอที่จะหา fibohexaprimes คู่ต่อไปได้ (และยังเย็นกว่านั้นมันจะพบสิ่งเหล่านี้ในหน่วยมิลลิวินาทีด้วยรหัสที่กำหนด)

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

โปรดทราบว่า f (24) อยู่ระหว่าง 2 ^ 216 ถึง 2 ^ 217

นี่คือรหัส:

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;

อาจยังมีสนามกอล์ฟที่สามารถทำได้ ฉันคิดว่าการนำไปปฏิบัตินั้นค่อนข้างตรงไปตรงมา

Ungolfed:

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 ไบต์

#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;}

การทดสอบแบบดั้งเดิมนั้นไม่มีประสิทธิภาพมากดังนั้นการคำนวณจะต้องดิ้นรนเพื่อให้ได้n > 16มาซึ่งความเจ็บปวดn = 19และกลายเป็นความเจ็บปวดนานสำหรับอย่างไรก็ตามมันใช้งานได้และให้ผลลัพธ์ที่คาดหวัง

รหัสจะถือว่าsize_tเป็นประเภท 64 บิตซึ่งเป็นจริงสำหรับทั้ง 64 บิต Linux และ Windows


โบนัส: น่าเสียดายที่เราจำเป็นต้องใช้ชนิด 64 บิตซึ่งนำไปสู่ค่าใช้จ่าย 33 ไบต์ รุ่นต่อไปนี้การทำงานสำหรับn <= 15การใช้intและ 150 ไบต์ยาว:

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;}

ทดสอบหลัก:

#include <stdio.h>

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

คุณสามารถบันทึกได้เล็กน้อยโดยใช้size_tและวางการรวมหรือไม่ มันใช้งานเฉพาะ แต่ดูเหมือนว่าจะเป็น 64- บิตทั้งใน 64-bit Linux และ Windows gcc (และตั้งแต่เมื่อไหร่ที่เราสนใจเรื่องความสะดวกในการพกพาใน codegolf?) (หมายเหตุด้านข้าง: %ldไม่ใช่ 64 บิตใน Windows 64 บิตต้องการ%lld)
Bob

@ Bob ฉันคิดเกี่ยวกับมัน แต่size_tไม่ใช่ builtin มันกำหนดไว้ในstddef.h(ซึ่งจะรวมโดยตรงหรือโดยอ้อมโดยส่วนหัวอื่น ๆ แทบ) วิธีการหนึ่งหรืออื่น ๆ #includeฉันต้องการ ฉันยังคงบันทึก 2 ไบต์โดยสามารถใช้size_tแทนuint64_tแม้ว่า :)
สเตฟาโน Sanfilippo

นอกจากนี้ขอขอบคุณสำหรับlldบิตฉันไม่ได้รับโอกาสในการทดสอบบน Windows (แต่การพกพาไม่สำคัญใช่มั้ย)
Stefano Sanfilippo

หืมมต้องมาจากstdio.hตอนที่ข้ากำลังทดสอบอยู่ ในกรณีใด ๆ - คุณยังสามารถบันทึกคู่โดยรวมแทนmath.h stddef.h
บ๊อบ

math.hไม่ได้ทำเคล็ดลับสำหรับฉัน (GCC 4.9 กับ GNU libc)
Stefano Sanfilippo

2

Python 2, 127 ไบต์

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

อัลกอริทึมอาจมีประสิทธิภาพมากขึ้น โดยเฉพาะอย่างยิ่ง primality การตรวจสอบ(t>1)*all(t%x for x in range(2,t))การตรวจสอบปัจจัยที่มีศักยภาพทั้งหมดทางขึ้นไปt-1เมื่อจริงๆมันจะมีเพียงแค่การตรวจสอบไปยังพื้นของราก เนื่องจากrangeเก็บรายการทั้งหมดในหน่วยความจำใน Python 2 สิ่งนี้นำไปสู่การMemoryErrorที่N=17(บนเครื่องของฉันโดยใช้การตั้งค่าเริ่มต้น)


2

ทับทิม 160 ไบต์

->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]}

Ungolfed:

-> 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]
}

การใช้งาน:

# 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 ไบต์

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)}

เยื้องกับบรรทัดใหม่:

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)
    }

ตัวอย่าง:

> g(1)
[1] 2
> g(5)
[1] 89
> g(10)
[1] 121393
> g(12)
[1] 5702887
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.