Trova l'ennesimo Fibohexaprime


23

La sfida questa volta è quello di trovare il n ° Fibohexaprime . La definizione di Fibohexaprime è la seguente:

Osserviamo innanzitutto un elenco con i numeri di 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

Successivamente, convertiamo i numeri in esadecimali:

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

Dai numeri esadecimali, filtriamo le lettere. Tutto ciò che ci rimane sono i numeri. Dobbiamo verificare se questi numeri sono primi:

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

Se il numero filtrato è un numero primo, lo chiamiamo Fibohexaprime . Puoi vedere che per N = 7, il relativo numero di fibonacci è 987.

Il compito è semplice, quando viene dato un input usando STDIN o un'alternativa accettabile, scrivere un programma o una funzione che emetta l'ennesimo Fibohexaprime usando STDOUT o un'alternativa accettabile.

Casi 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

Le regole:

  • Dato un numero intero compreso tra 1e 19(i valori sopra 20superano il valore massimo per un numero intero con segno a 64 bit), genera il valore corrispondente.
  • È possibile scrivere una funzione o un programma.
  • Questo è , quindi vince l'invio con il minor numero di byte!

Nel modo in cui è formulato, sembra che le funzioni debbano anche leggere da STDIN e scrivere su STDOUT. È corretto? In genere, consentiamo alle funzioni di accettare argomenti e restituire i valori come più conveniente.
Alex A.

2
@AlexA. Entrambe sono alternative accettabili. La lettura da STDIN e l'utilizzo di STDOUT non sono obbligatori.
Adnan,

Risposte:


4

Pyth, 27 byte

Leu,eGsGbU2ye.fq1lPs-.HyZGQ

Dimostrazione

ycalcola l'ennesimo numero di Fibonacci. Un .floop trova il fibohexaprime in base all'input.


12

MATL , 28 byte

Questo utilizza MATL versione 1.0.0 , che è stata pubblicata in Esolangs il 12 dicembre, prima di questa sfida.

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

Esempio

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

Spiegazione

Il codice è simile a quello nella risposta di 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
La prima risposta MATL al mondo! Ottimo lavoro, Luis!
becher

1
Evviva MATL! Benvenuti nel mondo del golf di codice!
Rayryeng - Ripristina Monica il

8

CJam, 28 byte

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

Provalo qui.

Spiegazione

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

Il mio primo passaggio per farlo funzionare è stato:

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

Combinando il grepe il map, posso rimuovere 10 byte

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

Se uso grepinvece di map, salvo 5 byte in più:

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

utilizzo:

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

Potrebbe esserci ancora spazio per ulteriori 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])

Questa è una funzione anonima che accetta un numero intero e restituisce un numero intero. Per chiamarlo, dagli un nome, ad esf=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 byte

Questa risposta è piuttosto insignificante, tranne per il fatto che GAP è abbastanza interessante da riuscire a trovare i successivi fibohexaprimes (e ancora più interessante, li trova in millisecondi con il codice specificato).

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

Si noti che f (24) è compreso tra 2 ^ 216 e 2 ^ 217.

Ecco il codice:

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;

Probabilmente c'è ancora del golf che si potrebbe fare. Penso che l'implementazione sia piuttosto semplice.

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

Il test di primalità è molto inefficiente, quindi il calcolo farà fatica n > 16e diventerà dolorosamente lungon = 19 . Tuttavia funziona e dà i risultati previsti.

Il codice presuppone che size_tsia un tipo a 64 bit, che è vero sia per Linux che per Windows a 64 bit.


Bonus: purtroppo ci viene richiesto di utilizzare tipi a 64 bit, che portano a un overhead di 33 byte. La seguente versione funziona per l' n <= 15utilizzo inted è lunga 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;}

Test principale:

#include <stdio.h>

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

Potresti risparmiare un po 'usando size_te rilasciando l'inclusione? È specifico dell'implementazione, ma sembra essere a 64 bit sia in Linux a 64 bit che in Windows gcc (e da quando ci siamo preoccupati della portabilità in codegolf?). (nota a margine: %ldnon è a 64 bit in Windows a 64 bit; necessita %lld)
Bob

@Bob Ci ho pensato, ma size_tnon è incorporato, è definito in stddef.h(che a sua volta è incluso direttamente o indirettamente da qualsiasi altra intestazione). In un modo o nell'altro, ho bisogno di un #include. Posso ancora salvare 2 byte usando size_tinvece di uint64_t, però :)
Stefano Sanfilippo il

Grazie anche per il lld bit, non ho avuto la possibilità di testarlo su Windows (ma la portabilità non ha importanza, giusto?)
Stefano Sanfilippo,

Dev'essere venuto stdio.hmentre stavo testando. In ogni caso, potresti comunque salvare un paio includendo math.hinvece di stddef.h.
Bob,

math.h non fa il trucco per me (GCC 4.9 con 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

L'algoritmo potrebbe essere molto più efficiente. In particolare, il controllo di primalità (t>1)*all(t%x for x in range(2,t))controlla i potenziali fattori fino in fondo t-1, quando in realtà dovrebbe solo controllare fino al pavimento della radice quadrata . Poiché rangememorizza un intero elenco in memoria in Python 2, questo porta ad un MemoryErrorat N=17(sulla mia macchina utilizzando le impostazioni predefinite).


2

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

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

Uso:

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

Rientrato, con nuove linee:

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

Esempi:

> g(1)
[1] 2
> g(5)
[1] 89
> g(10)
[1] 121393
> g(12)
[1] 5702887
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.