Oblicz minimum

12

tło

Rozważ następującą sekwencję ( A051935 w OEIS):

  • Zacznij od terminu .2)
  • Znajdź najniższą liczbę całkowitą większą niż taką, że jest liczbą pierwszą.n2)2)+n
  • Znajdź najniższą liczbę całkowitą większą niż taką, że jest liczbą pierwszą itp.nn2)+n+n

Bardziej formalna definicja:

zan={2)Jeśli n=0min{xN.x>zan-1 i (x+ja=0n-1zaja) jest liczbą pierwszą}Inaczej

Pierwsze kilka warunków sekwencji to (określ je jako przypadki testowe):

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

Zadanie

Twoim zadaniem jest wygenerowanie tej sekwencji na jeden z następujących sposobów:

  • Generuj warunki na czas nieokreślony.
  • Biorąc pod uwagę , ( termin, lub indeksowany).nzannth01
  • Biorąc pod uwagę , wyjście (pierwsze wyrażeń).n{za1,za2),,zan}n

Możesz konkurować w dowolnym języku programowania i możesz przyjmować dane wejściowe i generować dane wyjściowe za pomocą dowolnej standardowej metody , zwracając uwagę, że te luki są domyślnie zabronione. To jest , więc wygrywa najkrótsze przesłanie (w bajtach) dla każdego języka .

Pan Xcoder
źródło
4
Wskazówki, których należy unikać podczas pisania wyzwań: liczby pierwsze . Mogłeś użyć czegoś innego niż pierwotność.
Okx,
3
@Okx Miałem kilka powodów, aby tym razem wybrać pierwszeństwo: 1) Istnieje kilka sprytnych algorytmów, które są specyficzne dla tej samej sekwencji, jak ten zaimplementowany przez Dennisa 2) Istnieje już wpis OEIS na ten temat
Mr. Xcoder,

Odpowiedzi:

4

Brachylog , 13 bajtów

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

Wypróbuj online!

Dane wyjściowe to lista pierwszych n terminów w sekwencji.

?~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]
sundar - Przywróć Monikę
źródło
4

Python 2 , 63 62 bajty

n=f=a=b=1
while 1:
 f*=n;n+=1;a+=1
 if~f%n<a-b:print a;b=a;a=0

Wypróbuj online!

Dennis
źródło
4

Galaretka , 11 9 bajtów

0Ḥ_ÆnɗСI

Jest to pełny program, który bierze n jako argument i wypisuje pierwsze n wyrażeń w sekwencji.

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
3

05AB1E v2 , 10 bajtów

2λλOD₁+ÅNα

Wypróbuj online!

Działa to tylko w nie-starszej wersji, przepisz Elixir. Wysyła nieskończony strumień liczb całkowitych. Istnieje kilka błędów z testem podstawowym, które zostały naprawione w najnowszych zatwierdzeniach, ale nie są jeszcze dostępne w TIO. Działa to jednak lokalnie. Oto GIF jego wykonania na moim komputerze, zmodyfikowany tak, aby wyświetlał kilka pierwszych terminów, a nie cały strumień.

Jak to działa

2)λza(n)za(0)2)

λO

λ[za(0),za(1),,za(n-1)]O

D₁+

za(n-1)

ÅN

Generuje najniższą liczbę pierwszą znacznie większą niż powyższa suma.

α

Na koniec pobierz bezwzględną różnicę między liczbą pierwszą obliczoną powyżej a pierwszą kopią sumy obliczonej wcześniej (sumą wszystkich poprzednich iteracji).

Strumień jest następnie domyślnie drukowany do STDOUT na czas nieokreślony.

Pan Xcoder
źródło
2

Perl 6 , 45 bajtów

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

Wypróbuj online!

Zwraca leniwą listę, która generuje sekwencję bez końca.

Wyjaśnienie:

Używa to operatora sekwencji, ...który definiuje sekwencję jako:

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
Jo King
źródło
2

Rubinowy -rprime , 34 bajty

2.step{|i|$.+=p(i)if($.+i).prime?}

Wypróbuj online!

Wydaje na czas nieokreślony.

Kirill L.
źródło
2

JavaScript (ES6), 63 bajty

nth

n=>(k=0,s=1,g=d=>s%d?g(d-1):d<2?--n?g(s-=k-(k=s)):s-k:g(s++))()

Wypróbuj online!

Arnauld
źródło
2

Pyth ,12 11 bajtów

.f&P-;Z=-;Z

Wypróbuj online!

Zaoszczędzono 1 bajt dzięki isaacg.

Generuje pierwsze ntakie liczby na podstawie indeksu 1.

.fznajduje pierwsze kliczby całkowite, które spełniają określone kryterium, zaczynając od zera. Tutaj kryterium jest to, że poprzednia liczba pierwsza, którą obliczyliśmy ;, plus bieżąca liczba Z, jest liczbą pierwszą ( P). Jeśli tak jest, aktualizujemy również ostatnią obliczoną liczbę pierwszą przy użyciu zachowania logicznego i funkcji ( &) w przypadku zwarcia . Niestety .fdomyślną zmienną jest Zbajt, który kosztuje aktualizację.

Sztuczka, którą wymyślił isaacg, polegała na zapisaniu negacji ostatniej liczby pierwszej i przetestowaniu na niej minus bieżącej wartości. Jest to krótsze w Pyth, ponieważ kontrola pierwotności jest przeciążona: na liczbach dodatnich znajduje faktoryzację pierwszą, podczas gdy na liczbach ujemnych określa, czy dodatnia wartość liczby jest liczbą pierwszą.

To mniej więcej przekłada się na:

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
FryAmTheEggman
źródło
Wymienić _+z -i +z -o -1 bajt.
isaacg
@isaacg To całkiem sprytne! Zmienię to w.
FryAmTheEggman,
2

MATL , 21 bajtów

O2hGq:"t0)yd0)+_Yqh]d

Wypróbuj online!

Dane wyjściowe są pierwszymi n członami sekwencji.

Wyjaśnienie:

Konstruuje listę liczb pierwszych (z początkowym 0), a na końcu znajduje zwraca różnice między kolejnymi liczbami pierwszymi na liście.

              % 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
sundar - Przywróć Monikę
źródło
2

Haskell , 67 bajtów

(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

Wypróbuj online!

(1#1)2 2to funkcje, które nie pobierają żadnych danych wejściowych i generują nieskończoną listę.


stara odpowiedź:

Haskell , 88 83 78 76 bajtów

Test pierwszeństwa pochodzi z tej odpowiedzi i został ulepszony przez Christian Sievers (-2 bajty).

-5 bajtów dzięki WW .

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

Wypróbuj online!

ovs
źródło
Możesz się obejść bez ^2. To zmieni predykat z testowania na główny na testowanie na pierwsze lub 4 , co nie ma znaczenia w tej aplikacji.
Christian Sievers,
2

05AB1E (starsza wersja) , 12 bajtów

0U[XN+DpiN,U

Wypróbuj online!

Wyjaśnienie

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

Istnieje kilka różnych 12-bajtowych rozwiązań.
Ten konkretny mógłby mieć 10 bajtów, gdybyśmy zainicjalizowali użyteczną zmienną jako 0 (zamiast 1 i 2).

Emigna
źródło
1

Python 2 , 119 bajtów

f=lambda n,k=1,m=1:m%k*k>n or-~f(n,k+1,m*k*k)
def g(i):
 r=[2]
 for j in range(i):r+=[f(sum(r)+r[-1])-sum(r)]
 return r

Wypróbuj online!

Następna funkcja Prime f () zaczerpnięta z tej odpowiedzi .

Funkcja g () przyjmuje nieujemną liczbę całkowitą i i zwraca listę wszystkich elementów w sekwencji do tego indeksu.

Triggernometria
źródło
-7 bajtów .
Pan Xcoder,
1

Python 2 , 99 98 bajtów

def f(n,s=2,v=2):
 k=s-~v
 while any(k%i<1for i in range(2,k)):k+=1
 return n and f(n-1,k,k-s)or v

Wypróbuj online!

1 bajt dzięki dla pana Xcodera .

Chas Brown
źródło
1
Wiem ... Wiem ... Ja i moja pedantyczna sztuczka :) Ale możesz uratować bajt k=s-~v.
Pan Xcoder,
@Pan. Xcoder: Wasza bezbożna bitowa magia będzie jeszcze dla was końcem! :)
Chas Brown,
1

Haskell , 101 99 97 bajtów

Funkcja lnie przyjmuje argumentów i zwraca nieskończoną listę. Nie tak krótkie, jak bardziej bezpośrednie podejście @ovs (i oczywiście ukradłem niektóre części z ich odpowiedzi), ale może nadal gra w golfa?

Dzięki @ H.PWiz za -2 bajty!

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]

Wypróbuj online!

wada
źródło
1

Python 2 , 82 80 bajtów

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

Wypróbuj online!

Daje to n-ty numer sekwencji (w oparciu o 0). Przesuwając printpętlę, można to zmodyfikować, aby wyświetlać pierwsze nelementy w tym samym bajcie: Wypróbuj online!

ovs
źródło
0

Japt, 17 bajtów

Wysyła ntermin th, indeksowany 0.

@_+T j}aXÄT±X}g2ì

Spróbuj

Kudłaty
źródło