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 .


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]


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.

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.


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



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

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

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!


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




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!


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!



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.