Добавочные простые числа среди первых x простых чисел

16

Определение аддитивных простых чисел:

  • Числа, имеющие ровно 2 делителя, называются простыми числами.

  • Числа, которые являются простыми и их сумма цифр также является простым числом, называются аддитивными простыми числами.


Задача:

Учитывая целое число x, вычислите все аддитивные простые числа среди первых xпростых чисел, 2считая и первое простое и аддитивное простое число. Числа представлены в базе 10.

Правила:

  • Результат состоит из всех аддитивных простых чисел среди первых xпростых
  • 0 < x < 151, для этой задачи, для функциональных целей
  • Поскольку аддитивные простые числа являются целыми числами, десятичные числа не допускаются (например, вы должны выводить 2, а не 2.0), и они не должны отображаться в виде дроби.

Примеры:

10 -> 2 3 5 7 11 23 29

Объяснение:

Первые 10 простых чисел 2 3 5 7 11 13 17 19 23 29, и 2 3 5 7 11 23 29имеют только сумму цифр простых чисел, которые, соответственно 2,3,5,7,2,5,11, являются аддитивными простыми числами.

Следуя объяснениям example 1, другие тестовые случаи могут быть:

2 -> 2 3

25 -> 2 3 5 7 11 23 29 41 43 47 61 67 83 89

7 -> 2 3 5 7 11

Leaderboard:


ПРИМЕЧАНИЕ. Пожалуйста, прочитайте вновь отредактированное правило 1, оно немного вносит изменения в выходной формат.


Ваш код должен быть максимально коротким, так как это , поэтому выигрывает самый короткий ответ в байтах. Удачи!

Мистер Xcoder
источник
Все в порядке. Я бы рекомендовал подождать около 24 часов, потому что каждый раз, когда вы принимаете ответ, они получают 15 повторений, но теряют его, когда вы не принимаете. Иногда бывает неприятно кататься на американских горках, постоянно проигрывать и набирать репутацию.
Rɪᴋᴇʀ

Ответы:

8

Пайк, 9 7 байт

~p>#Yss

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

Единственный байт is_primeбыл выдвинут только 3 часа назад. Github коммит .

~p      -    All the prime numbers
  >     -   first input of them
   #Yss -  filter(^)
    Y   -     digits(^)
     s  -    sum(^)
      s -   is_prime(^)
синий
источник
3
Вы только что отредактировали свой язык в соответствии с этой задачей? : D
Джурис
так ... sзначит is_prime по числам, а sum по спискам?
Конор О'Брайен,
@ ConorO'Brien да, я перегружаю его для списков и целых чисел
Blue
@ Джурис нет, я давно хотел этого сделать, потому что у меня не было ни одного узла для простой проверки, а только деления на простые и делители. Прежде чем мне пришлось бы делать, _Pчто в данном случае на 1 байт больше
Blue
1
новый претендент на "самую молодую языковую особенность, чтобы выиграть испытание"? под проводом ~ 2 часа?
Спарр
8

Python 2, 124 118 байт

С помощью Riker:

n,f,P=input(),filter,lambda n:all(n%i for i in range(2,n))
f(lambda x:P(sum(map(int,`x`)))&P(x),f(P,range(2,n*n))[:n])

Оригинал:

n,o,c,P=input(),0,2,lambda n:all(n%i for i in range(2,n))
while o<n:
 o+=P(c)
 if P(sum(map(int,`c`)))and P(c):print c
 c+=1

Проверять первичность в Python не весело.

Даниил
источник
Я (читай: получил conor, чтобы написать для меня классный код J) проверил это с 9n, не работает. : / n ** 2 работает, но по стоимости 1 байт.
Rɪᴋᴇʀ
Попробуйте n*nдляn**2
Конор О'Брайен
8

Röda , 136 135 байтов

f n{P=[2]S=[2]seq 3,863|{|i|{P|{P+=i;s=0;((""..i)/"")|parseInteger _|s+=_;S+=i if[s in P and not(i in S)]}if{|p|[i%p>0]}_}if[#P<n]}_;S}

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

Это функция, которая возвращает запрошенные аддитивные простые числа.

Использование: main { f(25) | print ap for ap }Код использует версию 0.12, которая находится в ветке roda-0.12.

Ungolfed:

function f(n) {
    primes := [2]
    ultraprimes := [2]
    seq(3, 863) | for i do
        break if [ #primes = n ]
        if [ i%p != 0 ] for p in primes do
            primes += i
            sum := 0
            ((""..i)/"") | parseInteger _ | sum += digit for digit
            ultraprimes += i if [ sum in primes and not (i in ultraprimes) ]
        done
    done
    ultraprimes
}
fergusq
источник
1
Хороший язык! Вы сделали это сами давным-давно это выглядит? 10/10, выглядит довольно круто.
Rɪᴋᴇʀ
Аккуратный язык! Как вы запускаете программу?
Kritixi Lithos
Собирался спросить то же самое. Хотя я просмотрел документацию, я не могу запустить или скомпилировать исходный код вообще. Какой у тебя подход?
г-н Xcoder
@KritixiLithos @ Xcoder123 Требуется Java 8 и Gradle. Версия, которую я использую в этом ответе - 0.12 (в своей ветке). Хранилище должно быть рекурсивно клонировано. Чтобы сделать пригодную для бега флягу, вызовите gradle fatJar. Вы получаете какие-либо ошибки при компиляции?
fergusq
@fergusq Бег, gradle fatJarкажется, не создает банку для меня
Kritixi Lithos
5

Perl 6 , 53 байта

{grep *.comb.sum.is-prime,grep(*.is-prime,0..*)[^$_]}

Попытайся

Expanded:

{
  grep
    *.comb.sum.is-prime, # find the ultra primes from:
    grep(
      *.is-prime,        # find the primes
      0..*               # from all integers
    )[ ^$_ ]             # grab only the first x primes
}

Если этот вызов был изменен так, что вы взяли первые x ультрапрайм, это можно было бы сократить до

{grep({($_&.comb.sum).is-prime},0..*)[^$_]}
Брэд Гилберт b2gills
источник
5

Python 2 , 96 87 байт

p=-input(),0;m=k=1
while sum(p):
 m*=k*k;k+=1;p+=m%k,
 if m%k*p[int(`k`,36)%35]:print k

Спасибо @xnor за 9 байтов!

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

Деннис
источник
Цифровую сумму можно сделать короче, как есть int(`k`,36)%35. Все входы будут достаточно маленькими, чтобы этого было достаточно.
xnor
Вот это да! Я не уверен, как я думал о булевом дикте, но не о булевом кортеже (ретроспективный анализ - 20/20), но sum(p)и о int(`k`,36)%35чем-то другом ... Спасибо!
Деннис
5

Mathematica, 61 47 байт

Prime@Range@#~Select~PrimeQ@*Tr@*IntegerDigits&
Мартин Эндер
источник
Не совсем знакомы с сокращенными синтаксисами Mathematica - что это @*? *Не выглядит , как будто это в нужном месте , чтобы быть умножение?
Numbermaniac
3
@numbermaniac это функциональная композиция. f@*gпо существу f@g@##&.
Мартин Эндер
4

Желе , 10 байт

ÆNDS$€ĖÆPM

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

Как?

Немного другой подход ...

ÆNDS$€ĖÆPM - Main link: n (>0)           e.g. 10
ÆN         - nth prime number                 29
     €     - for each in range(1,nth prime)   [1,    2,    3,   ..., 27,    28,     29]
    $      - last two links as a monad
  D        -     decimal digit list          [[1],  [2],  [3],  ...,[2,7], [2,8],  [2,9]]
   S       -     sum                          [1,    2,    3,   ..., 9,     10,     11]
      Ė    - enumerate                       [[1,1],[2,2],[3,3],...,[9,27],[10,28],[11,29]]
       ÆP  - is prime? (vectorises)          [[0,0],[1,1],[1,1],...,[0,1], [0,0],  [1,1]]
         M - indices of maximal elements     [       2,    3,   ...,                29]
Джонатан Аллан
источник
3
Хорошее использование Ė.
Деннис
3

Jelly, 11 bytes

ÆN€DS$ÆP$Ðf

Try it online!

Explanation:

ÆN€DS$ÆP$Ðf Main link (args: z)
ÆN€         Generate first z primes.
   DS$      Take the digital sum.
      ÆP    Check if it's prime.
        $   Join last two links and make a monad.
         Храните только те элементы, которые соответствуют критерию выше.

Я перехитрил.

Эрик Outgolfer
источник
2

MATL, 15 13 байт

2 байта сохранены благодаря @Luis

:Yq"@V!UsZp?@

Попробуйте это на MATL Online

объяснение

        % Implicitly grab input as a number (N)
:       % Create an array [1...N]
Yq      % Get the k-th prime for each element k in that array
"       % For each element in this list
  @     % Get the current element
  V!U   % Break it into digits
  s     % Sum up the digits
  Zp    % Determine if this is a prime number
  ?@    % If it is, push the value to the stack
        % Implicit end of for loop and implicit display of the stack
Suever
источник
@ LuisMendo Ах! Я знал, что есть какой-то способ сократить эту первую часть. Спасибо
Suever
1

Ом , 10 байт (CP437)

@▓_π;░_}Σp

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

Объяснение:

@▓_π;░_}Σp    Main wire, arguments: a

@▓  ;         Map...over the range (1..n)
  _π            nth prime
     ░        Select from ToS where...
      _}Σ       The sum of all digits
         p      is prime
Ник Клиффорд
источник
1

PowerShell , 120 байт

for($n=$args[0];$n){for(;'1'*++$i-notmatch($s='^(?!(..+)\1+$)..')){}if('1'*([char[]]"$i"-join'+'|iex)-match$s){$i};$n--}

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

Первичная проверка в PowerShell отстой.

Внешний forцикл идет от входа $nвниз до 0. Во внутреннем цикле мы используем простой генератор на $i, а затем проверить ifцифру-сумму ( -join'+'|iex) также является простым. Если это так, мы ставим $iна конвейер. В любом случае мы уменьшаем $n--и внешний forцикл продолжается. Результирующие $is собираются из конвейера, и неявное Write-Outputпроисходит при завершении программы.

AdmBorkBork
источник
0

MATL , 13 байт

:YqtFYA!XsZp)

Попробуйте это в MATL Online!

объяснение

:      % Range [1 2 ... n], where n is implicit input
Yq     % Array of first n prime numbers
t      % Duplicate
FYA    % Convert to decimal digits. Gives a matrix, where each original 
       % number corresponds to a row. Left-pads with zeros if needed
!Xs    % Sum of rows
Zp     % Is prime? (element-wise)
)      % Use as logical index into the array of the first n prime numbers
       % Implicitly display
Луис Мендо
источник