Son iki selefle aynı anda olan ve henüz ortaya çıkmamış en küçük pozitif tam sayı; a (1) = 1, a (2) = 2


10

Tanım

  • İki tamsayı, dışında pozitif ortak bölenleri paylaşmazlarsa sürpriz olurlar 1.
  • a(1) = 1
  • a(2) = 2
  • a(n)için aralarında asal olduğu en küçük pozitif tam sayıdır a(n-1)ve a(n-2)tamsayı için ve henüz görünmeyen n >= 3.

Görev

  • Pozitif tamsayı n, çıktı / baskı verilir a(n).

Misal

  • a(11) = 6çünkü 6son iki öncekilerden aralarında asal olduğu (yani, 11ve 13) ve 6daha önce görünmeyen.

notlar

  • Dizinin artan olmadığını, yani bir öğenin öncekinden daha küçük olabileceğini unutmayın.

gözlük

  • Sen gerekir 1-endeksli kullanın.

testcases

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

puanlama

  • Çarpışma, iki sayının yalnızca bir böleni ( 1) paylaştığı ve 1küçük bir sayı olduğu anlamına geldiğinden, kodunuzun bayt sayısı açısından mümkün olduğunca küçük olması gerekir.

Referanslar


4
Kısa kod için bu "nedenler ..."
Luis Mendo

1
Bunun neden reddedildiğini merak ediyorum. Kesinlikle korkunç mantık yüzünden değil mi?
Conor O'Brien

@Conor Ben değilim. Aslında iptal ettim. Umarım insanlar hem mantığı hem de
yorumumu

3
Kod golf için bu "komik" gerekçeleri ile sorun ben sadece bu standart kod golf olduğunu bulmak için dört satır kapsayan kötü bir şaka okumak zorunda olmasıdır. Basitçe, iyi bir sebep olmadan meydan okuma kurallarını gizliyor.
Martin Ender

1
@ ConorO'Brien Tüm tarayıcılar her zaman başlığı göstermez (ve ardından mobil uygulama vardır) ve etiketi kullanmanın yanı sıra genellikle yazıdaki puanlamayı açıklarız, çünkü etiket tek başına yeni olanlara bir şey ifade etmez Siteye. Ben bile duyuyorum bizim meydan tipi etiketlerini bilen, bir meydan okuma attı nasıl anlamaya ama meydan vücutta bulmak için denemek için bunları okumadı. Etiketi, wiki etiketindeki kategorizasyon, aranabilirlik ve sınama türüne özgü bilgiler içindir.
Martin Ender

Yanıtlar:


5

Python 3.5, 160 141 126 124 121 109 bayt

Bu, dizinin tanımının basit bir uygulamasıdır. Golf önerileri hoş geldiniz.

Düzenleme: Leaky Nun sayesinde -17 bayt. Peter Taylor sayesinde -9 bayt. Sp3000 ve Python 3.5'e geçiş sayesinde -6 bayt.

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)

Python 3.5+ için, import mathdaha sonra g=math.gcdkendi tanımlamak yerine kısa olmalıdır g. 3.5'ten önce from fractions import*için yapabilirsiniz gcd.
Sp3000

c=3Döngünün içinde başlangıç yaparsanız, yalnızca bir kez yapmanız gerekir. Sayımla 3 karakter kaydedersiniz.
Peter Taylor

Ayrıca diziyi başka bir yoldan oluşturmaktan 2 karakterlik bir tasarruf da vardır: kullanmak r=[c]+ryerine kullanmak zorundasınız +=, ancak üç negatif endeks olumlu olur. Ve sonra lambda olarak yeniden yazmaktan 2 karakterlik bir tasarruf daha var, ancak bu oldukça şiddetli bir değişiklik: 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)ve buna gerek yok printçünkü artık tam bir program değil.
Peter Taylor

2

MATL , 28 27 bayt

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

Kod yavaş, ancak doğru sonucu veriyor.

Çevrimiçi deneyin! Veya ilk on vakayı doğrulayın .

Kodda yapılan küçük bir değişiklik dizinin bir grafiğini oluşturur:

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

Olarak görüyorum ASCII sanatı veya çevrimdışı derleyici grafik çıkışı ile:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

açıklama

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 bayt

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

Aslında , 38 37 35 33 31 30 bayt

Bu, işlev tanımının basit bir uygulamasıdır. Golf önerileri hoş geldiniz. Çevrimiçi deneyin!

Düzenleme: Leaky Nun sayesinde -3 bayt.

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
Yığın manipülasyonu çok
Leaky Nun

0

Haskell, 81 73 bayt

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

Kullanım örneği: ((0:1:c[2,1])!!) 12-> 17.

Her şeyden listesi oluşturun a(n)başlayarak 01 tabanlı dizini sabitlemek ve 1ve bunu takiben c[2,1]. cargüman listesinin başına gelir ve lardından tekrarlayan bir sonraki numaraya eklenir (daha sonra görülmeyen), önüne eklenir l. Seçim nbu listenin inci elemanı.


0

R, 141 bayt

 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 bayt

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

Benim düşünceme dayanarak a(n) < 2nherkes için n.

Daha hızlı koşmak olsun eklemek için a@n=orijinal sonra :=böylece fonksiyon önceki değerlerini yeniden hesaplamak gerekmez .

Sherlock9 sayesinde 7 bayt tasarruf edildi (eğer gcd(a,b)=1öyleyse gcd(ab,m) = gcd(a,m)*gcd(b,m))


Bu bir varsayım değil, çünkü OEIS sayfasında " ABS(a(n)-n) < n" yazılmıştır
Leaky Nun

@LeakyNun Teşekkürler. OEIS sayfası birkaç dakika öncesine kadar kapandı ve büyük olasılıkla karşı örnek için endişeleniyordum n.

0

Pyth, 23 bayt

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

Test odası

Oldukça basit bir uygulama, ancak bazı güzel golf hileleri ile.

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