Trouver le nième Fibohexaprime

23

Le défi cette fois est de trouver le n ème Fibohexaprime . La définition d'un Fibohexaprime est la suivante:

Nous observons d'abord une liste avec des nombres de 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

Après cela, nous convertissons les nombres en hexadécimal:

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

À partir des nombres hexadécimaux, nous filtrons les lettres. Il ne nous reste que des chiffres. Nous devons vérifier si ces nombres sont premiers:

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

Si le nombre filtré est un nombre premier, nous appelons cela un Fibohexaprime . Vous pouvez voir que pour N = 7, le nombre de fibonacci associé est 987.

La tâche est simple, quand on lui donne une entrée en utilisant STDIN ou une alternative acceptable, écrire un programme ou une fonction qui sort le nième Fibohexaprime en utilisant STDOUT ou une alternative acceptable.

Cas de test

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

Les règles:

  • Étant donné un entier compris entre 1et 19(les valeurs ci-dessus 20dépassent la valeur maximale pour un entier signé 64 bits), affichez la valeur correspondante.
  • Vous pouvez écrire une fonction ou un programme.
  • C'est du , donc la soumission avec le moins d'octets gagne!
Adnan
la source
La façon dont il est formulé semble que les fonctions doivent également lire depuis STDIN et écrire dans STDOUT. Est-ce exact? En règle générale, nous autorisons les fonctions à accepter des arguments et à renvoyer des valeurs comme il convient.
Alex A.
2
@AlexA. Les deux sont des alternatives acceptables. La lecture depuis STDIN et l'utilisation de STDOUT ne sont pas obligatoires.
Adnan

Réponses:

4

Pyth, 27 octets

Leu,eGsGbU2ye.fq1lPs-.HyZGQ

Manifestation

ycalcule le nième nombre de Fibonacci. Une .fboucle trouve le fibohexaprime en fonction de l'entrée.

isaacg
la source
12

MATL , 28 octets

Cela utilise MATL version 1.0.0 , qui a été publiée dans Esolangs le 12 décembre, avant ce défi.

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

Exemple

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

Explication

Le code est similaire à celui de la réponse de 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
Luis Mendo
la source
4
La première réponse MATL au monde! Bon travail, Luis!
bécher
1
Vive MATL! Bienvenue dans le monde du golf à code!
rayryeng
8

CJam, 28 octets

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

Testez-le ici.

Explication

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.
Martin Ender
la source
7

Perl 6 , 62 octets

Mon premier passage pour le faire fonctionner était:

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

En combinant le grepet le map, je peux supprimer 10 octets

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

Si j'utilise à la grepplace de map, j'économise 5 octets supplémentaires:

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

usage:

# 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
Brad Gilbert b2gills
la source
3

Mathematica 111 octets

Il peut encore y avoir de la place pour jouer au 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

DavidC
la source
3

Julia, 123 octets

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

Il s'agit d'une fonction anonyme qui accepte un entier et renvoie un entier. Pour l'appeler, donnez-lui un nom, par exemple f=n->....

Non golfé:

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
Alex A.
la source
3

ÉCART , 204 octets

Cette réponse est assez banale, sauf que GAP est assez cool pour être en mesure de trouver les deux prochains fibohexaprimes (et plus cool encore, il les trouve en millisecondes avec le code donné).

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

Notez que f (24) est compris entre 2 ^ 216 et 2 ^ 217.

Voici le code:

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;

Il y a probablement encore du golf à faire. Je pense que la mise en œuvre est assez simple.

Non golfé:

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;
Liam
la source
3

C, 186 183 octets

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

Le test de primalité est très inefficace, donc le calcul peinera un peu n > 16et deviendra douloureusement long pourn = 19 . Néanmoins, cela fonctionne et donne les résultats escomptés.

Le code suppose qu'il size_ts'agit d'un type 64 bits, ce qui est vrai pour Linux 64 bits et Windows.


Bonus: malheureusement, nous sommes tenus d'utiliser des types 64 bits, ce qui entraîne une surcharge de 33 octets. La version suivante fonctionne pour l' n <= 15utilisation intet a une longueur de 150 octets:

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

Test principal:

#include <stdio.h>

int main() {
  printf("Input - Output\n");
  for (int i = 1; i < 20; ++i) {
    printf("%2d    - %ld\n", i, F(i));
  }
}
Stefano Sanfilippo
la source
Pourriez-vous économiser un peu en utilisant size_tet en supprimant l'inclusion? Il est spécifique à l'implémentation, mais semble être 64 bits dans gcc Linux et Windows 64 bits (et depuis quand nous sommes-nous souciés de la portabilité dans codegolf?). (note latérale: %ldn'est pas 64 bits dans Windows 64 bits; a besoin %lld)
Bob
@Bob J'y ai pensé, mais ce size_tn'est pas une fonction intégrée, il est défini dans stddef.h(qui à son tour est directement ou indirectement inclus par pratiquement n'importe quel autre en-tête). D'une manière ou d'une autre, j'ai besoin d'un #include. Je peux toujours enregistrer 2 octets en utilisant size_tau lieu de uint64_t, cependant :)
Stefano Sanfilippo
Merci aussi pour le lldbit, je n'ai pas eu la chance de le tester sur Windows (mais la portabilité n'a pas d'importance, non?)
Stefano Sanfilippo
Hm, ça doit provenir de stdio.hmes tests. Dans tous les cas, vous pouvez toujours enregistrer un couple en incluant math.hau lieu de stddef.h.
Bob
math.hne fait pas l'affaire pour moi (GCC 4.9 avec GNU libc)
Stefano Sanfilippo
2

Python 2, 127 octets

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

L'algorithme pourrait être beaucoup plus efficace. En particulier, le contrôle de primalité (t>1)*all(t%x for x in range(2,t))vérifie les facteurs potentiels jusqu'à la fin t-1, alors qu'il ne faudrait que vérifier jusqu'au sol de la racine carrée . Étant donné que rangestocke une liste entière en mémoire dans Python 2, cela conduit à un MemoryErrorat N=17(sur ma machine en utilisant les paramètres par défaut).

mathmandan
la source
2

Rubis, 160 octets

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

Non golfé:

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

Usage:

# 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
Vasu Adari
la source
2

R, 164 octets

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

En retrait, avec de nouvelles lignes:

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

Exemples:

> g(1)
[1] 2
> g(5)
[1] 89
> g(10)
[1] 121393
> g(12)
[1] 5702887
plannapus
la source