Zıplayan dizi


19

Bir dizi tanımlayalım. bir(n) nin, aşağıdaki özelliklere sahip en küçük sayı olan x olduğunu söyleyeceğiz :

  • x ven eş zamanlı (faktör paylaşmıyorlar)

  • x , dizinin başlarında görünmüyor

  • |n-x|>1

Çoğu dizinin aksine dizimizin etki alanı ve aralığı 1'den büyük tamsayılardır .


İlk terimleri hesaplayalım.

bir(2) , en az bir olması gereken4, ancak4ve2pay bir etken2böylecebir(2) olması gerekmektedir5.

bir(3) , en az bir olması gereken5ama5tarafından alınanbir(2) bu en az olacak şekilde,6, ama6hisse bir faktör ile3En az olmalıdır kadar7,7ve böylece yerine getirmektir üç şartlabir(3)=7 .

bir(4)

  • 2 Bir faktörü paylaşır
  • 3 Çok yakın
  • 4 Çok yakın
  • 5 Çok yakın
  • 6 Bir faktörü paylaşır
  • 7 Alınan bir (3)
  • 8 Faktörü paylaşır
  • 9 iyi

bir(5)

  • 2 iyi

Görev

Bu meydan okumada, 1'den büyük bir sayı alan ve bir(n) döndüren bir program yazmalısınız .

Bu bir sorusudur, bu nedenle cevaplar bayt cinsinden puanlandırılacak, daha az bayt daha iyi olacaktır.

Test Durumları

İşte dizinin ilk çift terimleri (Elbette 2 dizine eklenmiştir):

5,7,9,2,11,3,13,4,17,6,19,8,23,22,21,10,25,12,27,16,15,14

Bonus Fun gerçeği

Robert Israel tarafından Math.se ( link ) üzerinde kanıtlandığı gibi, bu dizi kendi tersidir, yani tüm n için bir(bir(n))=n anlamına gelir .

OEIS

Bu soruyu sorduktan sonra bu diziyi OEIS'e gönderdim ve birkaç gün sonra eklendi.

OEIS A290151


Kaç değer hesapladınız? (Bonus hakkında konuşmak)
Socratic Phoenix

@SocraticPhoenix El ile yapıyorum, bu yüzden sadece test vakalarında gösterilenler. Şu anda daha büyük değerleri kontrol etmek için bir programda hata ayıklama.
Buğday Büyücüsü

1
Olduğum gibi ... şu anda çalışmıyor, dizinlemem kapalı (değiştir :) ve şimdi çalışıyor ... ilk 1000 güvenli xD
Socratic Phoenix

(X) için bir üst sınır biliyor musunuz? Örneğin, bazı u için bir (x) <u * x. İlk birkaç milyon değer güvenli.
nimi

@nimi Üst sınır bilmiyorum.
Buğday Büyücüsü

Yanıtlar:


8

Haskell , 61 bayt

f n=[i|i<-[2..],gcd i n<2,all((/=i).f)[2..n-1],abs(n-i)>1]!!0

Çevrimiçi deneyin!

Haskell için oldukça yeniyim, bu yüzden herhangi bir golf ipucu var.

2 baytlık buğday sihirbazı ve 4 baytlık nimi için teşekkürler

Açıklama:

f n=[i|i<-[2..],gcd i n<2,all((/=i).f)[2..n-1],abs(n-i)>1]!!0
f n=                                                          -- define a function f :: Int -> Int
    [i|i<-[2..],                                              -- out of positive integers greater than two
                gcd i n<2,                                    -- gcd of i and n is 1
                          all((/=i).f)[2..n-1],               -- i isn't already in the sequence
                                               abs(n-i)>1]    -- and |n-i| > 1
                                                          !!0 -- take the first element

2

Alice , 42 bayt

/oi
\1@/2-&whq&[]w].q-H.t*n$K.qG?*h$KW.!kq

Çevrimiçi deneyin!

açıklama

/oi
\1@/.........

Bu, sayıyı girdi olarak alan ve sayı çıkaran, girdi numarasının altındaki yığına 1 yerleştirmek üzere değiştirilmiş programlar için standart bir şablondur.

Programın ana kısmı her sayıyı kasetteki kyuvaya a(k)yerleştirir. İç döngü bir (k) hesaplar ve dış döngü bir (n) hesaplanıncaya kadar k üzerinde yinelenir.

1       push 1
i       take input
2-&w    repeat n-1 times (push return address n-2 times)
h       increment current value of k
q&[     return tape to position 0
]       move right to position 1
w       push return address to start inner loop
]       move to next tape position
.q-     subtract tape position from k
H       absolute value
.t*     multiply by this amount minus 1
n$K     if zero (i.e., |k-x| = 0 or 1), return to start of inner loop
.qG     GCD(k, x)
?       current value of tape at position: -1 if x is available, or something positive otherwise
*       multiply
h$K     if not -1, return to start of inner loop
W       pop return address without jumping (end inner loop)
.!      store k at position a(k)
k       end outer loop
q       get tape position, which is a(n)
o       output
@       terminate

1

VB.NET (.NET 4.5), 222 bayt

Function A(n)
Dim s=New List(Of Long)
For i=2To n
Dim c=2
While Math.Abs(i-c)<2Or g(c,i)>1Or s.Contains(c)
c+=1
End While
s.Add(c)
Next
Return s.Last
End Function
Function g(a, b)
Return If(b=0,a,g(b,a Mod b))
End Function

Kendi GCD'nizi almak zorunda kaldım. Ayrıca tüm bir işlev olmamasını nasıl sağlayacağımı da anlayamadım.

GCD her zaman> = 1'dir, bu nedenle sadece 1'i yok saymanız gerekir

Golfte kısa devre yaptı çünkü daha kısa

Un-golfed

Function Answer(n As Integer) As Integer
    Dim seqeunce As New List(Of Integer)
    For i As Integer = 2 To n
        Dim counter As Integer = 2
        ' took out short-circuiting in the golf because it's shorter
        ' GCD is always >= 1, so only need to ignore 1
        While Math.Abs(i - counter) < 2 OrElse GCD(counter, i) > 1 OrElse seqeunce.Contains(counter)
            counter += 1
        End While
        seqeunce.Add(counter)
    Next
    Return seqeunce.Last
End Function

' roll your own GCD
Function GCD(a, b)
    Return If(b = 0, a, GCD(b, a Mod b))
End Function

.NET'in BigInteger sınıfının dışında yerleşik bir GCD'ye sahip olmadığı aklıma geliyor.
Mego



0

05AB1E , 26 bayt

2IŸεDU°2Ÿ¯KʒX¿}ʒXα1›}θDˆ}θ

Çevrimiçi deneyin veya ilkini çıktılayınnlisteler olarak terimler . (NOT: °açıkça son derece yavaştır, bu nedenle T*TIO bağlantılarında (10*n onun yerine 10n)).

Açıklama:

2IŸ               # Create a list in the range [2, input]
   ε              # Map each value `y` to:
    DU            #  Store a copy of `y` in variable `X`
    °2Ÿ           #  Create a list in the range [10**`y`,2]
       ¯K         #  Remove all values already in the global_array
       ʒX¿}       #  Only keep values with a greatest common divider of 1 with `X`
       ʒXα1›}     #  Only keep values with an absolute difference larger than 1 with `X`
             θ    #  After these filters: keep the last (the smallest) element
              Dˆ  #  And add a copy of it to the global_array
                # After the map: only leave the last value
                  # (and output the result implicitly)
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.