Вычислить минимум


12

Фон

Рассмотрим следующую последовательность ( A051935 в OEIS):

  • Начните с термина .2
  • Найдите младшее целое число большее 2, такое, что 2 + n простое.n22+n
  • Найдите наименьшее целое число больше n, такое, что 2 + n + n ' простое и т. Д.nn2+n+n

Более формальное определение:

an={2if n=0min{xNx>an1 and (x+i=0n1ai) is prime}otherwise

Первые несколько терминов последовательности (пожалуйста, обозначьте их как контрольные примеры):

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

задача

Ваша задача - сгенерировать эту последовательность любым из следующих способов:

  • Выводим его условия на неопределенный срок.
  • Для данного выведите a n ( n- й член, 0 или 1 проиндексированный).nannth01
  • Для заданного выведите { a 1 , a 2 , , a n } (первые n членов).n{a1,a2,,an}n

Вы можете соревноваться на любом языке программирования и можете принимать и выводить данные любым стандартным методом , при этом отмечая, что эти лазейки по умолчанию запрещены. Это , поэтому выигрывает самое короткое представление (в байтах) для каждого языка .


4
Советы, которых следует избегать при написании задач: простые числа . Вы могли бы использовать что-то еще, кроме первичности.
Okx

3
@Okx У меня была пара причин, когда я выбрал простоту на этот раз: 1) Есть несколько умных алгоритмов, специфичных для этой самой последовательности, например, реализованный Деннисом 2) Для этого уже есть запись OEIS
г-н Xcoder

Ответы:


4

Брахилог , 13 байт

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

Попробуйте онлайн!

Выходом является список первых n членов последовательности.

?~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

Желе , 11 9 байт

0Ḥ_ÆnɗСI

Это полная программа, которая принимает n в качестве аргумента и печатает первые n членов последовательности.

Попробуйте онлайн!

Как это устроено

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 байтов

2λλOD₁+ÅNα

Попробуйте онлайн!

Это работает только в устаревшей версии, переписать Elixir. Выводит бесконечный поток целых чисел. В основном тесте есть некоторые ошибки, которые были исправлены в последних коммитах, но еще не запущены на TIO. Это работает локально, хотя. Вот GIF его выполнения на моей машине, модифицированный для вывода первых нескольких терминов, а не всего потока.

Как это устроено

2λa(n)a(0)2

λO

λ[a(0),a(1),,a(n1)]O

D₁+

a(n1)

ÅN

Генерирует самое низкое простое число, которое больше, чем указанная выше сумма.

α

Наконец, извлеките абсолютную разницу между простым числом, вычисленным выше, и первой копией суммы, вычисленной ранее (сумма всех предыдущих итераций).

Затем поток неявно печатается в STDOUT на неопределенный срок.


2

Perl 6 , 45 байт

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

Попробуйте онлайн!

Возвращает ленивый список, который генерирует последовательность без конца.

Объяснение:

При этом используется оператор Sequence, ...который определяет последовательность как:

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

Пиф ,12 11 байт

.f&P-;Z=-;Z

Попробуйте онлайн!

Сохранено 1 байт благодаря isaacg.

Создает первые nтакие числа, используя индекс на основе 1.

.fнаходит первые kцелые числа, которые удовлетворяют определенному критерию, начиная с нуля. Здесь критерий состоит в том, что предыдущее простое число, которое мы вычислили ;, плюс текущее число Z, является простым ( P). Если это так, мы также обновляем последнее вычисленное простое число, используя короткое замыкание логики и функции ( &). К сожалению .f, переменная по умолчанию - Zэто байт в обновлении.

Хитрость, которую выяснил isaacg, состояла в том, чтобы сохранить отрицание последнего простого числа и проверить его на минус текущее значение. В Pyth это короче, так как проверка первичности перегружена: для положительных чисел он находит простую факторизацию, а для отрицательных чисел он определяет, является ли положительное значение числа простым.

Это более или менее означает:

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

Заменить _+с -и +с -по -1 байт.
Исаак

@isaacg Это довольно умно! Я отредактирую это в.
FryAmTheEggman

2

MATL , 21 байт

O2hGq:"t0)yd0)+_Yqh]d

Попробуйте онлайн!

Выходными данными являются первые n членов последовательности.

Объяснение:

Создает список простых чисел (с начальным 0) и в конце находит возвраты различий между последовательными простыми числами в списке.

              % 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 байт

(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

Попробуйте онлайн!

(1#1)2 2это функция, которая не требует ввода и выводит бесконечный список


старый ответ:

Haskell , 88 83 78 76 байтов

Тест на простоту взят из этого ответа и улучшен Кристианом Сиверсом (-2 байта).

-5 байт благодаря 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

Попробуйте онлайн!


Вы можете обойтись без ^2. Это изменит предикат от тестирования простое до тестирования простого или 4 , что не имеет значения в этом приложении.
Кристиан Сиверс

2

05AB1E (наследие) , 12 байтов

0U[XN+DpiN,U

Попробуйте онлайн!

объяснение

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

Возможно несколько различных 12-байтовых решений.
Этот конкретный мог бы быть 10 байтов, если бы мы имели пригодную для использования переменную, инициализированную как 0 (вместо 1 и 2).


1

Python 2 , 119 байт

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

Попробуйте онлайн!

Следующая простая функция f () взята из этого ответа .

Функция g () принимает неотрицательное целое число i и возвращает список всех элементов в последовательности до этого индекса.



1

Python 2 , 99 98 байт

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

Попробуйте онлайн!

1 байт спасибо мистеру Xcoder .


1
Я знаю ... Я знаю ... Я и моя педантичность по битам :) Но вы можете сэкономить байт с помощью k=s-~v.
г-н Xcoder

@Г-н. Xcoder: Твое нечестивое побитое колдовство будет твоим концом! :)
Час Браун

1

Haskell , 101 99 97 байт

Функция не lпринимает аргументов и возвращает бесконечный список. Не такой короткий, как более прямой подход @ovs (и я, очевидно, украл некоторые части из их ответа), но, возможно, все еще пригоден для игры в гольф?

Спасибо @ H.PWiz за -2 байта!

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]

Попробуйте онлайн!




Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.