Minimum değerini , asal olacak şekilde hesaplayın (OEIS A051935)


12

Arka fon

Aşağıdaki sırayı düşünün ( OEIS'te A051935 ):

  • terim ile başlayın .2
  • En düşük tamsayı bulun daha büyük öyle ki asal olduğunu.n22+n
  • En düşük tamsayı bulun Büyüktür öyle ki asal vbn'n2+n+n'

Daha resmi bir tanım:

birn={2Eğer n=0min{xN-|x>birn-1 ve (x+Σben=0n-1birben) asal}aksi takdirde

Sekansın ilk birkaç terimi (lütfen test senaryoları olarak bakınız):

2, 3, 6, 8, 10, 12, 18, 20, 22, 26, 30, 34, 36, 42, 44, 46, 50, 52, 60, 66, 72, 74, ...

Görev

Göreviniz bu sırayı aşağıdaki yollardan biriyle oluşturmaktır:

  • Şartlarını süresiz olarak verin.
  • N verildiğinde n, çıktı birn ( ninci terimi, 0 veya 1 dizine eklenmiş).
  • N verildiğinde n, çıktı {bir1,bir2,...,birn} (ilk n terim).

Herhangi rekabet edebilir programlama dili ve giriş almak ve herhangi içinden çıktı sağlayabilir standart yöntemle O notu alırken, bu boşluklar varsayılan olarak yasaktır. Bu , bu nedenle her dil için en kısa gönderme (bayt cinsinden) kazanır.


4
Zorluklar yazarken kaçınmak için ipuçları: Asal sayılar . Öncelikten başka bir şey kullanabilirdin.
Okx

3
@Okx Bu sefer ilkeliği seçtiğimde aklıma birkaç neden vardı: 1) Dennis'in uyguladığı gibi bu sıralamaya özgü bazı akıllı algoritmalar var 2) Bunun için zaten bir OEIS girişi var
Bay Xcoder

Yanıtlar:


4

Brachylog , 13 bayt

~l.<₁a₀ᵇ+ᵐṗᵐ∧

Çevrimiçi deneyin!

Çıktı, dizinin ilk n teriminin listesidir .

?~l.<₁a₀ᵇ+ᵐṗᵐ∧    Full code (? at beginning is implicit)

?~l.              Output is a list whose length is the input
    <₁            Output is an increasing list
      a₀ᵇ+ᵐ       And the cumulative sum of the output
           ṗᵐ     Consists only of prime numbers
             ∧    No further constraints on output

Explanation for a₀ᵇ+ᵐ:
a₀ᵇ               Get the list of all prefixes of the list
                  Is returned in increasing order of length
                  For eg. [2, 3, 6, 8] -> [[2], [2, 3], [2, 3, 6], [2, 3, 6, 8]]
   +ᵐ             Sum each inner list  -> [2, 5, 11, 19]


4

Jöle , 11 9 bayt

0Ḥ_ÆnɗСI

Bu, n'yi bağımsız değişken olarak alan ve dizinin ilk n terimini basan tam bir programdır .

Çevrimiçi deneyin!

Nasıl çalışır

0Ḥ_ÆnɗСI  Main link. Argument: n

0          Set the return value to 0.
      С   Accumulating iterate. When acting on a dyadic link d and called with
           arguments x and y, the resulting quicklink executes
           "x, y = d(x, y), x" n times, returning all intermediate values of x.
           Initially, x = 0 and  y = n.
     ɗ       Drei; combine the three links to the left into a dyadic chain.
 Ḥ             Unhalve; double the left argument.
  _            Subtract the right argument.
   Æn          Compute the next prime.
           This computes the partial sums of the sequence a, starting with 0.
        I  Increments; compute the forward differences.

3

05AB1E v2 , 10 bayt

2λλOD₁+ÅNα

Çevrimiçi deneyin!

Bu yalnızca eski olmayan sürüm olan Elixir yeniden yazma işleminde çalışır. Sonsuz bir tamsayı akışı çıkarır. Asal testte en son taahhütlerde düzeltilmiş, ancak henüz TIO'da canlı olmayan bazı hatalar var. Yine de yerel olarak çalışıyor. İşte makinemde, tüm akış yerine ilk birkaç terimi çıkarmak için değiştirilmiş bir GIF.

Nasıl çalışır

2λbir(n)bir(0)2

λO

λ[bir(0),bir(1),...,bir(n-1)]O

D₁+

bir(n-1)

ÅN

Yukarıdaki toplamdan çok daha düşük en düşük asal değeri üretir.

α

Son olarak, yukarıda hesaplanan asal ile daha önce hesaplanan toplamın ilk kopyası (önceki tüm tekrarların toplamı) arasındaki mutlak farkı alın.

Akış daha sonra örtülü olarak STDOUT'a süresiz olarak yazdırılır.


2

Perl 6 , 45 bayt

2,{first (*+@_.sum).is-prime,@_[*-1]^..*}...*

Çevrimiçi deneyin!

Dizisi sonu olmayan bir tembel liste döndürür.

Açıklama:

Bu ..., sekansı şu şekilde tanımlayan Sekans işlecini kullanır :

2,  # The first element is 2
  {  # The next element is:
    first  # The first value that:
          (*+@_.sum).is-prime,  # When added to the sum is a prime
          @_[*-1]^..*  # And is larger than the previous element
  }
...*  # And continue the sequence indefinitely



2

Pyth ,12 11 bayt

.f&P-;Z=-;Z

Çevrimiçi deneyin!

İsaacg sayesinde 1 bayt kaydedildi.

n1 tabanlı bir dizin kullanarak bu tür ilk sayıları oluşturur .

.fksıfırdan başlayarak belirli bir kriteri karşılayan ilk tam sayıları bulur . Burada ölçüt, hesapladığımız önceki asal ;artı mevcut sayının Zasal ( P) olmasıdır. Öyleyse, mantıksal ve işlevin ( &) kısa devre davranışını kullanarak son hesaplanan ana değeri de güncelleriz . Ne yazık ki .fvarsayılan değişken, Zgüncellemede bir bayt maliyeti.

Anlaşılan hile, son asalın olumsuzluğunu saklamak ve mevcut değer eksi üzerinde bunu test etmekti. Öncelik kontrolü aşırı yüklendiğinden bu Pyth içinde daha kısadır: pozitif sayılarda asal çarpanlara ayırırken negatif sayılarda sayının pozitif değerinin asal olup olmadığını belirler.

Bu aşağı yukarı şu anlama gelir:

to_find = input()
last_prime = 0
current = 0
results = []
while to_find > 0:
    if is_prime( current + last_prime ):
        results.append( current )
        to_find -= 1
        last_prime += current
    current += 1
print results

Yerine _+ile -ve +ile -için -1 bayt.
isaacg

@isaacg Bu oldukça zekice! Bunu düzenleyeceğim.
FryAmTheEggman

2

MATL , 21 bayt

O2hGq:"t0)yd0)+_Yqh]d

Çevrimiçi deneyin!

Çıktı, dizinin ilk n terimidir.

Açıklama:

Asal bir liste oluşturur (başlangıcı 0 olan) ve sonunda listedeki ardışık primerler arasındaki farkları bulur.

              % Implicit input, say n
O2h           % Push P = [0, 2] on the stack 
Gq:"          % for loop: 1 to n-1
  t0)           % Take the last element of P
                %  Stack: [[0, 2], [2]] (in first iteration)
  yd0)          % Take the difference between the last
                %   two elements of P
                %  Stack: [[0, 2], [2], [2]]
  +             % Add those up
                %  Stack: [[0, 2], [4]]
  _Yq           % Get the next prime higher than that sum
                %  Stack: [[0, 2], [5]]
  h             % Concatenate that to the list P
                %  Stack: [[0, 2, 5]]
]             % End for loop
d             % Get the differences between successive elements of
              %   the final list P

2

Haskell , 67 bayt

(1#1)2 2
(p#n)s k|p`mod`n>0,n-s>k=k:(p#n)n(n-s)|w<-p*n=(w#(n+1))s k

Çevrimiçi deneyin!

(1#1)2 2girdi almayan ve sonsuz bir liste çıkaran bir fonksiyondur .


eski cevap:

Haskell , 88 83 78 76 bayt

Öncelik testi bu cevaptan alınmıştır ve Christian Sievers (-2 bayt) tarafından geliştirilmiştir .

WW sayesinde -5 bayt .

2#2
(p#s)n|n<1=p|w<-until(\m->mod(product[1..m-1])m>0)(+1)$s+p+1=(w-s)#w$n-1

Çevrimiçi deneyin!


Sen olmadan yapabilirsin ^2. Bu testten başlangıcı test başbakan değiştirir Bu uygulamada önemli değil başbakan ya da 4 ,.
Christian Sievers

2

05AB1E (eski) , 12 bayt

0U[XN+DpiN,U

Çevrimiçi deneyin!

açıklama

0U              # initialize X as 0
  [             # start an infinite loop
   XN+          # add X to N (the current iteration number)
      Dpi       # if the sum is prime:
         N,     #   print N
           U    #   and store the sum in X

Birkaç farklı 12 baytlık çözüm vardır.
0 olarak başlatılan kullanılabilir bir değişkenimiz olsaydı (1 ve 2 yerine) bu özel 10 bayt olabilirdi.




1

Haskell , 101 99 97 bayt

İşlev lbağımsız değişken almaz ve sonsuz bir liste döndürür. @Ovs tarafından daha doğrudan yaklaşım kadar kısa değil (ve açıkçası cevaplarını oluşturan bazı parçaları çaldı), ama belki de hala golf edilebilir?

-2 bayt için @ H.PWiz teşekkürler!

import Data.List
p m=mod(product[1..m-1])m>0
l=2:[until(p.(+sum a))(+1)$last a+1|a<-tail$inits l]

Çevrimiçi deneyin!


1

Python 2 , 82 80 bayt

s=p=2
i=input()
P=n=1
while i:
 P*=n;n+=1
 if P%n>0<n-s-p:p=n-s;s=n;i-=1
print p

Çevrimiçi deneyin!

Bu sekansın n'inci sayısını (0 tabanlı) verir. printDöngüyü hareket ettirerek , bu naynı bayttaki ilk öğelerin çıktısını almak için değiştirilebilir : Çevrimiçi deneyin!



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.