Nf Fibohexaprime'ı bulun


23

Zorluk bu kez bulmaktır n inci Fibohexaprime . Fibohexaprime tanımı aşağıdaki gibidir:

İlk önce Fibonacci sayıları ile bir liste gözlemliyoruz:

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

Ondan sonra sayıları onaltılık alana çeviririz:

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

Onaltılık sayılardan harfleri filtreleriz. Tek bıraktığımız rakamlar. Bu sayıların asal olup olmadığını kontrol etmeliyiz:

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

Filtrelenen sayı bir asal ise, buna Fibohexaprime diyoruz . Bunun N = 7için ilgili fibonacci sayısının 987 olduğunu görebilirsiniz.

Görevi, STDIN veya kabul edilebilir bir alternatif kullanarak bir girdi verildiğinde, STDOUT veya kabul edilebilir bir alternatif kullanarak F Fibohexaprime çıktısı veren bir program veya fonksiyon yazın.

Test durumları

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

Kurallar:

  • Arasında bir tamsayıyı verilen 1ve 19(değerler yukarıda 20bir 64-bit işaretli tamsayı için maksimum değeri aşması), çıkış karşılık gelen bir değer.
  • Bir işlev veya program yazabilirsiniz.
  • Bu , bu yüzden en az sayıda bayt olan gönderim kazanıyor!

İfade edildiği gibi, işlevlerin de STDIN'den okunması ve STDOUT'a yazması gerektiği gibi geliyor. Bu doğru mu? Genellikle işlevlerin argümanları kabul etmesine ve değerleri uygun şekilde döndürmesine izin veririz.
Alex A.

2
@AlexA. Her ikisi de kabul edilebilir alternatiflerdir. STDIN'den okumak ve STDOUT kullanmak zorunlu değildir.
Adnan

Yanıtlar:


4

Pyth, 27 bayt

Leu,eGsGbU2ye.fq1lPs-.HyZGQ

gösteri

ynt Fibonacci sayısını hesaplar. Bir .fdöngü, girişe göre fiboheksaprimi bulur.


12

MATL , 28 bayt

Bu kullanımlar Matl sürüm 1.0.0 yayınlandı, Esolangs daha önce bu mücadeleden daha 12 Aralık.

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

Örnek

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

açıklama

Kod, Martin Büttner'in cevabındakiyle aynı .

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
Dünyanın ilk MATL cevabı! İyi işti Luis!
kabı

1
MATL için hurra! Kod golf dünyasına hoş geldiniz!
rayryeng - Monica

8

CJam, 28 bayt

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

Burada test et.

açıklama

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 bayt

İlk işim sadece işe yaramasıydı:

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

Birleştirerek grepve mapben 10 bayt kaldırabilir

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

grepBunun yerine kullanırsam map, 5 bayt daha kaydederim:

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

kullanımı:

# 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 bayt

Ek golf oynamak için hala yer olabilir.

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 bayt

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

Bu bir tamsayıyı kabul eden ve bir tamsayı döndüren adsız bir işlevdir. Aramak için bir isim verin, örneğin 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 Bayt

Bu cevap oldukça dikkate değer değildir, ancak GAP, bir sonraki çift fiboheksaprimleri bulabilecek kadar soğuktur (ve yine de soğuk, bunları verilen kodla milisaniyede bulur).

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

F (24) 2 ^ 216 ile 2 ^ 217 arasında olduğuna dikkat edin.

İşte kod:

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;

Muhtemelen hala yapılabilecek bazı golf var. Uygulamanın oldukça basit olduğunu düşünüyorum.

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 bayt

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

Primallik testi çok verimsizdir, bu yüzden hesaplama biraz zorlanacak n > 16ve acı verici bir şekilde uzun sürecektir n = 19. Yine de çalışır ve beklenen sonuçları verir.

Kod size_t, hem 64 bit Linux hem de Windows için geçerli olan 64 bit türünde bir varsayımdır .


Bonus: Maalesef, 64 bitlik bir yük kullanmamız gerekiyor ve bu da 33 baytlık bir yük sağlıyor. Aşağıdaki versiyonu için çalışır n <= 15kullanarak intve 150 bayt uzun:

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

Ana test:

#include <stdio.h>

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

İnclude kullanarak size_tve bırakarak biraz tasarruf edebilir misiniz ? Uygulamaya özeldir, ancak hem 64 bit Linux hem de Windows gcc'de 64 bit gibi görünüyor (ve ne zamandan beri codegolf'ta taşınabilirliği önemsiyoruz?). (yan not: %ld64-bit Windows'ta 64 bit değildir; ihtiyaçlar %lld)
Bob

@Bob hakkında düşündüm, ama size_tbir yerleşik değil, tanımlandı stddef.h(sırayla hemen hemen başka herhangi bir başlık tarafından doğrudan veya dolaylı olarak dahil edildi). Öyle ya da böyle, bana ihtiyacım var #include. Yine de size_tyerine 2 byte tasarruf yapabilirim uint64_t:)
Stefano Sanfilippo

Ayrıca, teşekkürler lld, Windows’ta test etme şansım olmadı (ancak taşınabilirlik önemli değil mi?)
Stefano Sanfilippo

Hm, stdio.hben test ederken gelmiş olmalı . Her durumda - math.hyerine dahil ederek bir çift hala kaydedebilirsiniz stddef.h.
Bob

math.hbenim için hile yapmaz (GNU libc ile GCC 4.9)
Stefano Sanfilippo

2

Python 2, 127 bayt

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

Algoritma çok daha verimli olabilirdi. Özellikle, primallik kontrolü (t>1)*all(t%x for x in range(2,t))potansiyel karekterleri kontrol eder t-1, gerçekten sadece karekökün tabanını kontrol etmesi gerekir . Yana rangePython 2'de bellekte saklar bütün bir listeye bir bu yol açar MemoryErrorde N=17(benim makinede varsayılan ayarları kullanarak).


2

Yakut, 160 bayt

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

Kullanımı:

# 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 bayt

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

Yeni çizgilerle girintili:

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

Örnekler:

> g(1)
[1] 2
> g(5)
[1] 89
> g(10)
[1] 121393
> g(12)
[1] 5702887
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.