Plus petit entier positif qui est un coprime des deux derniers prédécesseurs et qui n'est pas encore apparu; a (1) = 1, a (2) = 2


10

Définition

  • Deux nombres entiers sont premiers s'ils ne partagent aucun diviseur commun positif autre que 1.
  • a(1) = 1
  • a(2) = 2
  • a(n)est le plus petit entier positif qui est un premier entre le a(n-1)et a(n-2)et n'est pas encore apparu, pour l'entier n >= 3.

Tâche

  • Étant donné un entier positif n, sortie / impression a(n).

Exemple

  • a(11) = 6parce qu'il 6est coprime avec les deux derniers prédécesseurs (à savoir, 11et 13) et 6n'a pas paru auparavant.

Remarques

  • Notez que la séquence n'est pas ascendante, ce qui signifie qu'un élément peut être plus petit que son prédécesseur.

Spécifications

  • Vous devez utiliser 1 indexé.

Cas de 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

Notation

  • Étant donné que coprime signifie que les deux nombres partagent un seul diviseur ( 1) et qu'il 1s'agit d'un petit nombre, votre code doit être aussi petit que possible en termes de nombre d'octets.

Références


4
Ces "raisons" pour le code court ...
Luis Mendo

1
Je me demande pourquoi cela a été rejeté. Sûrement pas à cause de l'horrible justification?
Conor O'Brien

@Conor Pas moi. En fait, j'ai voté positivement. J'espère que les gens verront à la fois la justification et mon commentaire comme des blagues
Luis Mendo

3
Le problème avec ces justifications "drôles" pour le golf de code est que je dois lire une mauvaise blague couvrant quatre lignes juste pour découvrir qu'il s'agit de golf de code standard. Cela masque simplement les règles du défi sans raison valable.
Martin Ender

1
@ ConorO'Brien Tous les navigateurs n'affichent pas toujours le titre (et puis il y a l'application mobile), et nous décrivons généralement le score dans le post en plus d'utiliser la balise, car la balise seule ne signifie rien pour les personnes nouvelles sur le site. Même si je suis au courant de nos balises de type challenge, je ne les lis jamais de comprendre comment un défi est marqué , mais essayer de trouver que dans le corps de défi. La balise est destinée à la catégorisation, à la recherche et aux informations spécifiques au type de défi dans le wiki de la balise.
Martin Ender

Réponses:


5

Python 3.5, 160 141 126 126 124 121 109 octets

Il s'agit d'une implémentation simple de la définition de la séquence. Suggestions de golf bienvenues.

Edit: -17 octets grâce à Leaky Nun. -9 octets grâce à Peter Taylor. -6 octets grâce à Sp3000 et passage à 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)

Pour Python 3.5+, import mathalors g=math.gcddevrait être plus court que de définir le vôtre g. Pour avant 3.5, vous pouvez faire from fractions import*pour gcd.
Sp3000

Si vous initialisez c=3à l'intérieur de la boucle, vous ne devez le faire qu'une seule fois. À mon avis, vous enregistrez 3 caractères.
Peter Taylor

Il y a aussi une économie de 2 caractères de la construction du tableau dans l'autre sens: vous devez utiliser r=[c]+rplutôt que +=, mais trois indices négatifs deviennent positifs. Et puis il y a une autre économie de 2 caractères de la réécriture en tant que lambda, bien que ce soit un changement assez radical: 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)et pas besoin d'un printcar ce n'est plus un programme complet.
Peter Taylor

2

MATL , 28 27 octets

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

Le code est lent, mais donne le résultat correct.

Essayez-le en ligne! Ou vérifiez les dix premiers cas .

Une petite modification du code produit un tracé de la séquence:

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

Voyez-le comme de l'art ASCII , ou avec une sortie graphique dans le compilateur hors ligne:

entrez la description de l'image ici

entrez la description de l'image ici

Explication

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 octets

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

En fait , 38 37 35 33 31 30 octets

Il s'agit d'une implémentation simple de la définition de fonction. Suggestions de golf bienvenues. Essayez-le en ligne!

Edit: -3 octets grâce à 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
Manipulation de pile beaucoup
Leaky Nun

0

Haskell, 81 73 octets

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

Exemple d'utilisation: ((0:1:c[2,1])!!) 12-> 17.

Construisez la liste de tous a(n), en commençant par 0fixer l'index basé sur 1 1et puis en suivant c[2,1]. cprend la tête de sa liste d'arguments lsuivie d'un appel récursif avec le numéro suivant qui correspond (co-amorcé, non vu auparavant) ajouté devant l. Choisissez le ne élément de cette liste.


0

R, 141 octets

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

non golfé

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 octets

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

Basé sur ma conjecture que a(n) < 2n pour tous n.

Pour obtenir une exécution plus rapide, ajoutez a@n=après l'original :=afin que la fonction n'ait pas besoin de recalculer les valeurs précédentes .

Sauvegardé 7 octets grâce à Sherlock9 (si gcd(a,b)=1alors gcd(ab,m) = gcd(a,m)*gcd(b,m))


Ce n'est pas une conjecture, car il est écrit dans la page OEIS que " ABS(a(n)-n) < n"
Leaky Nun

@LeakyNun Merci. La page OEIS était en panne jusqu'à il y a quelques instants, et je m'inquiétais d'un éventuel contre-exemple pour les grands n.

0

Pyth, 23 octets

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

Suite de tests

Une implémentation assez simple, mais avec de belles astuces de 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.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.