Il numero intero positivo più piccolo che è coprime agli ultimi due predecessori e non è ancora apparso; a (1) = 1, a (2) = 2


10

Definizione

  • Due interi sono coprimi se non condividono divisori comuni positivi diversi da 1.
  • a(1) = 1
  • a(2) = 2
  • a(n)è il più piccolo intero positivo che è coprimi alla a(n-1)e a(n-2)e non è ancora apparso, per intero n >= 3.

Compito

  • Dato intero positivo n, output / stampa a(n).

Esempio

  • a(11) = 6perché 6è coprime con gli ultimi due predecessori (vale a dire, 11e 13) e 6non è mai apparso prima.

Appunti

  • Nota che la sequenza non è crescente, il che significa che un elemento può essere più piccolo del suo predecessore.

Specifiche

  • È necessario utilizzare 1-indicizzato.

Casi test

n      a(n)
1      1
2      2
3      3
4      5
5      4
6      7
7      9
8      8
9      11
10     13
11     6
12     17
13     19
14     10
15     21
16     23
17     16
18     15
19     29
20     14
100    139
1000   1355
10000  13387
100000 133361

punteggio

  • Poiché coprime significa che i due numeri condividono solo un divisore ( 1), ed 1è un numero piccolo, il tuo codice dovrebbe essere il più piccolo possibile in termini di conteggio dei byte.

Riferimenti


4
Quelle "ragioni" del codice funzione ...
Luis Mendo,

1
Mi chiedo perché questo sia stato sottoposto a downgrade. Sicuramente non a causa della terribile logica?
Conor O'Brien,

@Conor Non io. In realtà ho votato. Spero che la gente vedrà sia la logica che il mio commento come battute
Luis Mendo,

3
Il problema con queste giustificazioni "divertenti" per il code golf è che ho bisogno di leggere una battuta sbagliata che si estende su quattro righe solo per scoprire che si tratta di un codice golf standard. Sta semplicemente oscurando le regole della sfida senza una buona ragione.
Martin Ender,

1
@ ConorO'Brien Non tutti i browser mostrano sempre il titolo (e poi c'è l'app per dispositivi mobili), e generalmente descriviamo il punteggio nel post oltre a usare il tag, perché il tag da solo non significa nulla per le persone che sono nuove al sito. Anche se io sono familiarità con i nostri tag di tipo sfida, non ho mai letto loro di capire come una sfida è segnato, ma cercare di trovare che nel corpo sfida. Il tag serve per la categorizzazione, la ricerca e le informazioni specifiche sul tipo di sfida nel tag wiki.
Martin Ender,

Risposte:


5

Python 3.5, 160 141 126 124 121 109 byte

Questa è una semplice implementazione della definizione della sequenza. Suggerimenti di golf benvenuti.

Modifica: -17 byte grazie a Leaky Nun. -9 byte grazie a Peter Taylor. -6 byte grazie a Sp3000 e passaggio a Python 3.5.

import math;f=lambda n,r=[2,1],c=3:n<2and r[1]or(c in r)+math.gcd(c,r[0]*r[1])<2and f(n-1,[c]+r)or f(n,r,c+1)

Ungolfing:

import math
def f(n, r=[2,1], c=3):
    if n<2:
        return r[1]
    elif (c in r) + math.gcd(c,r[0]*r[1]) < 2:
        return f(n-1, [c]+r)
    else:
        return f(n, r, c+1)

Per Python 3.5+, import mathquindi g=math.gcddovrebbe essere più breve di definire il proprio g. Prima del 3.5, puoi fare from fractions import*per gcd.
Sp3000,

Se esegui c=3l' inizializzazione all'interno del loop, devi farlo una sola volta. Con il mio conteggio risparmi 3 caratteri.
Peter Taylor,

C'è anche un risparmio di 2 caratteri dalla costruzione dell'array al contrario: devi usare r=[c]+rpiuttosto che +=, ma tre indici negativi diventano positivi. E poi c'è un ulteriore risparmio di 2 caratteri dalla riscrittura come lambda, anche se questo è un cambiamento piuttosto drastico: from fractions import*;F=lambda n,r=[2,1],c=3:n<2and r[1]or(c in r)+gcd(r[0]*r[1],c)<2and F(n-1,[c]+r)or F(n,r,c+1)e non c'è bisogno di un printperché non è più un programma completo.
Peter Taylor,

2

MATL , 28 27 byte

2:i:"`@ym1MTF_)Zdqa+}@h]]G)

Il codice è lento, ma dà il risultato corretto.

Provalo online! Oppure verifica i primi dieci casi .

Una piccola modifica del codice produce un diagramma della sequenza:

2:i:"`@ym1MTF_)Zdqa+}@h]]G:)XG

Vedilo come arte ASCII o con output grafico nel compilatore offline:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Spiegazione

2:         % Push [1 2] to initiallize the sequence
i:         % Input n. Push [1 2 ... n]
"          % For loop: repeat n times
  `        %   Do while loop
    @      %     Push iteration index, starting at 1. This is the candidate number
           %     to extend the sequence
    y      %     Duplicate vector containing the sequence so far
    m      %     Is member? Gives true if the candidate is in the sequence
    1M     %     Push candidate and vector again
    TF_)   %     Get last two elements of the vector
    Zd     %     GCD between the candidate and those two elements. Produces a
           %     two-element vector
    qa     %     True if any of the two results exceeds 1, meaning
           %     the candidate is not coprime with the latest two sequence values
    +      %     Add. This corresponds to logical "or" of the two conditions, namely
           %     whether the candidate is member of the sequence so far, and
           %     whether it is not coprime with the latest two. In either case
           %     the do...while must continue with a next iteration, to try a new
           %     candidate. Else the loop is exited, and the current candidate
           %     is the new value of the sequence
  }        %   Finally (execute when the loop is exited)
    @h     %     Push current candidate and concatenate to the sequence vector
  ]        %   End do...while
]          % End for
G)         % Get n-th value of the sequence. Implicitly display

1

C, 185 byte

G(a,b){return a%b?G(b,a%b):b;}
i,j,k;f(n){int a[n+2];for(i=0;i++<n;){a[i]=i<3?i:0;for(j=2;!a[i];++j){for(k=i;--k;){if(a[k]==j)++j,k=i;}a[G(a[i-1],j)*G(a[i-2],j)<2?i:0]=j;}}return a[n];}

1

In realtà , 38 37 35 33 31 30 byte

Questa è una semplice implementazione della definizione della funzione. Suggerimenti di golf benvenuti. Provalo online!

Modifica: -3 byte grazie a Leaky Nun.

2R#╗,;`1";2±╜tπg@╜í+Y"£╓╖`nD╜E

Ungolfing:

2R#╗    Push [1,2] and store it in register 0
,;      Take input and duplicate
`1      Start function, push 1
  "       Start string
  ;       Duplicate i
  2±╜t    Push (list in register 0)[-2:]
  πg      gcd(i, product of list[-2:])
  @╜í     Rotate the gcd and bring up i, check for i in list (0-based, -1 if not found)
  +Y      Add the gcd and the index, negate (1 if coprime and not found in list, else 0)
  "£      End string, turn into a function
╓       Push first (1) values where f(x) is truthy, starting with f(0)
╖`      Append result to the list in register 0, end function
n       Run function (input) times
D╜E     Return (final list)[n-1]

1
Stack manipolazione molto
Leaky Nun

0

Haskell, 81 73 byte

c l@(m:n:_)=m:c([x|x<-[1..],gcd(m*n)x<2,all(/=x)l]!!0:l)
((0:1:c[2,1])!!)

Esempio di utilizzo: ((0:1:c[2,1])!!) 12-> 17.

Crea l'elenco di tutti a(n), iniziando con 0per correggere l'indice basato su 1 1e seguito da c[2,1]. cprende la testa della sua lista di argomenti lseguita da una chiamata ricorsiva con poi il numero successivo che si adatta (co-prime, non visto prima) aggiunto di fronte l. Scegli l' nelemento th di questo elenco.


0

R, 141 byte

 f=Vectorize(function(n)ifelse(n>3,{c=3;a=f(n-1);b=f(n-2);d=f(4:n-3);while(!c%%which(!a%%1:a)[-1]||!c%%which(!b%%1:b)[-1]||c%in%d)c=c+1;c},n))

ungolfed

f=Vectorize( function(n)     #build a recursive function. Vectorize allows
    if(n>3) {                #the function to be called on vectors.
        c=3                  #Tests size. Builds some frequent variables.
        a=f(n-1)
        b=f(n-2)
        d=f(4:n-3)           #Should really golf this out, but its horribly slow.
        while(!c%%which(!a%%1:a)[-1]||!c%%which(!b%%1:b)[-1]||c%in%d)
              c=c+1          #If we are coprime and not already seen. add.
        c
     } else n)               #First three are 1,2,3.

0

Mathematica, 97 90 byte

a@1=1;a@2=2;a@n_:=SelectFirst[Range[2n],GCD[a[n-1]a[n-2],#]<2&&!MemberQ[a/@Range[n-1],#]&]

Basato sulla mia congettura che a(n) < 2n per tutti n.

Per ottenere una corsa più veloce, aggiungere a@n=dopo l'originale in :=modo che la funzione non debba ricalcolare i valori precedenti .

Salvati 7 byte grazie a Sherlock9 (se gcd(a,b)=1poi gcd(ab,m) = gcd(a,m)*gcd(b,m))


Non è una congettura, dal momento che è scritto nella pagina OEIS che " ABS(a(n)-n) < n"
Leaky Nun

@LeakyNun Grazie. La pagina OEIS era inattiva fino a pochi minuti fa, ed ero preoccupato per un possibile controesempio per grandi n.

0

Pyth, 23 byte

eu+Gf&-TGq1iT*F>2G1tQ]1

Suite di test

Un'implementazione abbastanza semplice, ma con alcuni trucchi da golf.

eu+Gf&-TGq1iT*F>2G1tQ]1
 u                 tQ]1    Apply the following function input - 1 times,
                           where G is the current state (List of values so far)
  +G                       Add to G
    f             1        The first number, counting up from 1
      -TG                  That has not been seen so far
     &                     And where
               >2G         The most recent two numbers
             *F            Multiplied together
           iT              Gcd with the current number being checked
         q1                Equals 1
e                          Output the final element of the list.
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.