নবম ফিবোহেক্সাপ্রিমে সন্ধান করুন


23

চ্যালেঞ্জ এই সময় খুঁজে পেতে এন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

যদি ফিল্টার করা নম্বরটি প্রধান হয় তবে আমরা এটিকে একটি ফিবোহেক্সাপ্রাইম বলি । আপনি দেখতে পাচ্ছেন যে N = 7সম্পর্কিত ফিবোনাচি নম্বরটি 987।

কাজটি সহজ, যখন STDIN বা একটি গ্রহণযোগ্য বিকল্প ব্যবহার করে কোনও ইনপুট দেওয়া হয়, তখন একটি প্রোগ্রাম বা একটি ফাংশন লিখুন যা 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(মান উপরে 2064-বিট সাইন্ড পূর্ণসংখ্যা, সর্বোচ্চ মান অতিক্রম), আউটপুট সংশ্লিষ্ট মান।
  • আপনি একটি ফাংশন বা একটি প্রোগ্রাম লিখতে পারেন।
  • এটি , তাই সর্বনিম্ন পরিমাণ বাইটের সাথে জমাটি জয়!

এটি যেভাবে শব্দযুক্ত, এটি মনে হচ্ছে ফাংশনগুলি অবশ্যই STDIN থেকে পড়তে হবে এবং STDOUT এ লিখতে হবে। এটা কি ঠিক? সাধারণত আমরা ফাংশনগুলিকে আর্গুমেন্ট গ্রহণ করতে এবং সুবিধা হিসাবে মানগুলি ফিরিয়ে দেওয়ার অনুমতি দিই।
অ্যালেক্স এ।

2
@AlexA। উভয়ই গ্রহণযোগ্য বিকল্প। STDIN থেকে পড়া এবং STDOUT ব্যবহার বাধ্যতামূলক নয়।
আদনান

উত্তর:


4

পাইথ, 27 বাইট

Leu,eGsGbU2ye.fq1lPs-.HyZGQ

প্রদর্শন

yনবম ফিবোনাচি সংখ্যাটি গণনা করে। একটি .fলুপ ইনপুট অনুসারে fibohexaprime সন্ধান করে।


12

এমএটিএল , 28 বাইট

এটি এমএটিএল সংস্করণ 1.0.0 ব্যবহার করে যা এই চ্যালেঞ্জের আগে 12 ই ডিসেম্বর এসোলাংসে প্রকাশিত হয়েছিল ।

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

উদাহরণ

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

ব্যাখ্যা

কোডটি মার্টিন বাটনার এর উত্তরে অনুরূপ ।

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
বিশ্বের প্রথম এমএটিএল উত্তর! ভাল কাজ, লুইস!
বেকার

1
এমএটিএল এর জন্য হুড়ো! কোড গল্ফিং বিশ্বের আপনাকে স্বাগতম!
রায়রিং - মনিকা

8

সিজেম, 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

পার্ল 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

গণিত 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

জিএপি , 204 বাইট

এই উত্তরটি বেশ অবিস্মরণীয়, এ ছাড়া যে পরের দম্পতি ফাইবোহেক্সাপ্রাইমগুলি খুঁজে পেতে (এবং আরও শীতল এখনও এটি প্রদত্ত কোড সহ এটি মিলিসেকেন্ডে খুঁজে পায়) গ্যাপটি যথেষ্ট শীতল।

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

নোট করুন যে চ (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

সি, 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_tbit৪ বিট টাইপ যা 64৪ বিট লিনাক্স এবং উইন্ডোজ উভয়েরই জন্য সত্য is


বোনাস: দুর্ভাগ্যক্রমে আমাদের bit৪ বিট প্রকারের ব্যবহার প্রয়োজন, যা 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৪-বিট বলে মনে হচ্ছে (এবং কখন থেকে আমরা কোডগল্ফের বহনযোগ্যতার যত্ন নিয়েছিলাম?) (পার্শ্ব নোট: %ld64-বিট উইন্ডোজে 64৪-বিট নয়; প্রয়োজন %lld)
বব

@ বোবি আমি এটি সম্পর্কে ভেবেছিলাম, তবে এটি কোনও বিল্টিন size_tনয়, এটি সংজ্ঞায়িত হয়েছে stddef.h(যার পরিবর্তে প্রত্যক্ষ বা অপ্রত্যক্ষভাবে কার্যত অন্য কোনও শিরোনাম অন্তর্ভুক্ত থাকে)। একটি উপায় বা অন্যটি, আমার একটি দরকার #include। আমি এর size_tপরিবর্তে 2 বাইট বাঁচাতে পারি uint64_t, যদিও :)
স্টেফানো সানফিলিপো

lldবিটের জন্য ধন্যবাদ , আমি এটি উইন্ডোতে এটি পরীক্ষা করার সুযোগ পাইনি (তবে বহনযোগ্যতা কোনও বিষয় নয়, তাই না)
স্টেফানো সানফিলিপো

হুম, stdio.hআমি পরীক্ষা করার সময় এটি অবশ্যই এসেছে । যে কোনও ক্ষেত্রে - আপনি এর math.hপরিবর্তে অন্তর্ভুক্ত করে একটি দম্পতি বাঁচাতে পারেন stddef.h
বব

math.hআমার জন্য কৌতুক করবেন না (জিএনইউ লিবিসি সহ জিসিসি 4.9)
স্টেফানো সানফিলিপো

2

পাইথন 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

অ্যালগরিদম অনেক বেশি দক্ষ হতে পারে। বিশেষত, প্রাথমিকতা চেকটি (t>1)*all(t%x for x in range(2,t))সমস্ত দিক পর্যন্ত সম্ভাব্য কারণগুলি পরীক্ষা করে t-1, যখন সত্যই এটি কেবল বর্গমূলের মেঝে পর্যন্ত চেক করতে হয় । যেহেতু rangeপাইথন 2 মেমরি দোকানে একটি সম্পূর্ণ তালিকা, একটি এই বিশালাকার MemoryErrorN=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

আর, 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.