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


16

Для целей этой задачи основная степень простого числа (PPP) определяется как число, которое может быть определено как простое число в степени простого числа. Например, 9 - это PPP, потому что он может быть представлен как 3 ^ 2. 81, с другой стороны, не является PPP, потому что он может быть представлен только как 3 ^ 4, а 4 не является простым. Первые несколько PPP: 4, 8, 9, 25, 27, 32, 49, 121, 125, 128, 169, 243, 289, 343 ... Это последовательность OEIS A053810

Твое задание:

Напишите программу или функцию, которая для входного целого числа n возвращает / выводит n-й PPP, либо 1-индексированный, либо 0-индексированный, в зависимости от того, что вы предпочитаете.

Входные данные:

Целое число от 0 до 1000, полученное любым разумным способом.

Выход:

ППС по индексу указанному на входе.

Тестовые случаи:

Это 1-индексированные данные, и поэтому, если ваша программа принимает 0-индексированные входные данные, необходимо получить тот же результат для указанного ввода - 1.

3  -> 9
6  -> 32
9  -> 125

Подсчет очков:

Этот , выигрывает самая низкая оценка в байтах!


Этот вызов был изолирован
Gryphon

Ответы:


8

05AB1E (наследие) ,  9  7 байт

Сохранено 2 байта благодаря @KevinCruijssen

µNÓ0Kp»

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

µ           # while counter_variable != input:
 N          #   push iteration counter                       e.g. 125
  Ó         #   get prime exponents                          -> [0, 0, 3]
   0K       #   filter out zeros                             -> [3]
     p      #   is prime?                                    -> [1]
      »     #   join with newlines: we use » instead of J
            #   so that [0,1] is not interpreted as truthy   -> 1
            #   implicit: if 1, increment counter_variable

О, мне нравится использование »вместо того, Jчтобы 0\n1не интерпретировать как правду! Но вы можете сохранить байт в унаследованной версии 05AB1E (которую вы также использовали в своем TIO), пропустив ½, поскольку это сделано неявно для µ(второй пункт в этой статье 05AB1E ). Также ʒĀ}может быть 0K. 7 байтов
Кевин Круйссен,

@KevinCruijssen Круто. Благодарность!
Арно

5

Шелуха , 10 байт

!fȯṗ§*ELpN

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

объяснение

!fȯṗ§*ELpN  Implicit input.
 f       N  Filter the natural numbers by this function:
  ȯṗ§*ELp    Argument is a number, say 27.
        p    Prime factors: [3,3,3]
       L     Length: 3
      E      Are all elements equal: 1
    §*       Multiply last two: 3
  ȯṗ         Is it prime? Yes, so 27 is kept.
!           Index into remaining numbers with input.

4

На самом деле , 14 байтов

Основано на решении г-на Xcoder's Pyth . Предложения по игре в гольф приветствуются. Попробуйте онлайн!

;ur♂P;∙⌠iⁿ⌡MSE

Ungolfing

                Implicit input n
;ur             Duplicate and push [0..n]
   ♂P           Push the 0th to nth primes
     ;∙         Push Cartesian square of the primes
       ⌠iⁿ⌡M    Reduce each list in the Cartesian square by exponentiation
            SE  Sort the list and get the nth index (0-indexed)

4

Mathematica, 48 байтов

Sort[Join@@Array[(p=Prime)@#^p@#2&,{#,#}]][[#]]&   

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

но Мартин Эндер имел лучшую идею и сохранил 6 байтов

Mathematica, 42 байта

Sort[Power@@@Prime@Range@#~Tuples~2][[#]]&   

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


Вы можете использовать Unionвместо того, Joinчтобы избежать Sort.
Мартин Эндер

Но я думаю, что Outerсохраняет еще один байт Array:(Union@@Outer[Power,p=Prime@Range@#,p])[[#]]&
Мартин Эндер

И Tuplesеще короче:Sort[Power@@@Prime@Range@#~Tuples~2][[#]]&
Мартин Эндер


4

R + числа, 57 байтов

function(n,x=numbers::Primes(2*n))sort(outer(x,x,"^"))[n]

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

outer такая удобная функция.

Совершенно уверен, что это всегда будет работать. Приведу формальный аргумент, когда у меня будет время.


4

Haskell , 95 85 80 байт

-10 байт благодаря @Lynn
-5 байт благодаря @WillNess

0 на основе

(!!)[x|x<-[2..],p<-[[i|i<-[2..x],all((>)2.gcd i)[2..i-1]]],or[y^e==x|e<-p,y<-p]]

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

объяснение

(!!)                    -- point-free expression, partially evaluate index-access operator
[x|x<-[2..]             -- consider all integers x>=2
,p<-                    -- let p be the list of all primes <=x
[[                      -- list of a list so p ends up as a list
i|i<-[2..x],            -- consider all i<=x to be potentially prime
all((>)2.gcd i)[2..i-1] -- if the gcd of i with all smaller integers is
                        -- smaller than 2 then this i is actually prime
 ]],or                  -- if any of the following list entries is true
[y^e==x|                -- the condition y^e==x holds for x with ...
e<-p,y<-p]              -- y and e being prime, i.e. x is a PPP,
]                       -- then add this x to the output sequence / list

f=(!!)[x|x<-[2..],or[y^e==x|y<-p x,e<-p x]]экономит 10 байт.
Линн

может получить до 82 байт на встраивание: f=(!!)[x|x<-[2..],p<-[[i|i<-[2..x],all((>)2.gcd i)[2..i-1]]],or[y^e==x|e<-p,y<-p]]. может нормально тогда не считать f=? (никогда не уверен в правилах).
Уилл Несс

Мне однажды сказали, что на самом деле f=не следует считать. Так что будет 80 байт, с (!!)[x|x<-[2..],p<-[[i|i<-[2..x],all((>)2.gcd i)[2..i-1]]],or[y^e==x|e<-p,y<-p]].
Уилл Несс

4

Python 2 , 163 157 137 136 байт

  • Сохранено шесть байтов с использованием, input()а не определения функции.
  • Сохранено четыре байта благодаря Фелипе Нарди Батиста ; объединяя две петли.
  • Сохранено шестнадцать байтов благодаря ASCII-only .
  • Сохраненный байт благодаря ArBo .
p=input();r=i=0;e=lambda p:all(p%d for d in range(2,p))
while~-i<p:
 r+=1
 for x in range(r*r):y=x%r;x/=r;i+=x**y==r>e(x)>0<e(y)
print r

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


вместо этого используйте списки для сохранения байта: i=[]и....i+=[r]*....
Фелипе Нарди Батиста


@FelipeNardiBatista Я не использовал списки, так как в первой итерации программа определяла функцию. Спасибо за определение и дальнейший гольф.
Джонатан Фрех

Вы не можете вернуться rвместоi[p]
ASCII-только


2

Pyth , 15 байт

e.f/^FR^fP_TSZ2

Попробуй это здесь! или Проверьте больше тестовых случаев.

объяснение

ef / ^ FR ^ fP_TSZ2 - Полная программа. Q означает ввод.

 .f - Первые Q входов с достоверными результатами. Использует переменную Z.
        fP_TSZ - Фильтровать диапазон [1, Z] для простых чисел.
       ^ 2 - декартова площадь. В основном декартово произведение с самим собой.
    ^ FR - Уменьшить каждый список возведением в степень.
  / - Подсчитать вхождения Z в ^.
e - Последний элемент.

2

Javascript 137 133 байтов

P=n=>{for(p=[i=2];j=++i<n*9;j^i&&p.push(i))
for(;j*j<=i;)j=i%++j?j:i
x=[]
for(i of p)
for(j of p)
x[i**j]=1
return Object.keys(x)[n]}

console.log(P(1000))
console.log(P(800))
console.log(P(9))
console.log(P(5))

** нормальный алгоритм (результат 100 мс) P = n => {

  for(p=[i=2];f=++i<=n*10;!f||p.push(i))
    for(j=0;f&&(x=p[j++])*x<=i;)
      f=i%x
  x=[]
  T=0
  for(i of p)
  for(j of p)
  {
    l= i**j
    if(++T>n &&x.length<l )
    break
    x[l] = 1
  }
  return Object.keys(x)[n]
}

5
Хм, это код-гольф , а не код самого быстрого . Следовательно, скорость вашего представления по сравнению с другими не важна, так как это определяется количеством байтов. Пожалуйста, включите количество байтов и язык вашего представления в вашем ответе.
Грифон

но у него должно быть хотя бы ограничение по времени, я могу играть в гольф, но чем решение 100 мс станет решением за 5 секунд, это нормально?
DanielIndie

2
Решение может занять любое конечное количество времени для запуска. Единственная цель - сделать код короче.
Грифон

2

APL (Dyalog Extended) , 15 байт

{⍵⌷∧∊∘.*⍨¯2⍭⍳⍵}

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

объяснение

{⍵⌷∧∊∘.*⍨¯2⍭⍳⍵}

                 Right argument. Our input.
{              }  Wraps the function in dfn syntax which allows us to use ⍵.
                  Range [1..⍵].
          ¯2     Get the n-th prime for each n in the range.
      ∘.*⍨        Get the prime powers of each prime.
                 Flatten the list.
                 In Extended, this is monadic sort ascending.
 ⍵⌷               Get the input-th index of the list of prime powers of primes.

2

Perl 6 , 50 байт

{(sort [X**] (^7028,^24)>>.grep(&is-prime))[$_-1]}

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

  (^7028,^24)            # create 2 ranges from 0
     >>.grep(&is-prime)  # grep for primes in both
 [X**] ...               # calc each exponential pair (2^2, 2^3, 2^5...)
(sort ... )[$_-1]        # sort and get value at index n-1

Причины 24 и 7028 заключаются в том, что наибольшее значение (n = 1000) составляет 49378729, что составляет 7027 ^ 2, а наибольшее простое число 2, которое соответствует этому, равно 23. Таким образом, охватывается 2..7027 ^ 2. 23 включает в себя все предметы в первой 1000 (и много запчастей).



1

PARI / GP, 48 байтов

f(n)=[x|x<-[1..4^n],isprime(isprimepower(x))][n]

Если вы не считаете f(n)=часть, то это 43 байта.


Другой подход без установленного обозначения, который не проверяет так много ненужных случаев:

f(n)=c=0;i=1;while(c<n,i++;isprime(isprimepower(i))&&c++);i

0

Java 8, 211 байт

import java.util.*;n->{List l=new Stack();for(int a=2,b;a<132;a++)for(b=2;b<132;b++)if(p(a)*p(b)>0)l.add(Math.pow(a,b));Collections.sort(l);return l.get(n);}int p(int n){for(int i=2;i<n;n=n%i++<1?0:n);return n;}

Очень неэффективный метод. Он в основном вычисляет все PPP от 2 2 до 999 999 132 132 и сохраняет его в списке, затем сортирует этот список, а затем получаетn '-ый элемент из этого списка.

РЕДАКТИРОВАТЬ: вместо того, чтобы использовать 999 999, что приводит к списку из 28 225 элементов, я теперь использую 132 132, что приводит к списку всего 1024 элементов. Это значительно повышает производительность и является вполне приемлемым, поскольку в запросе говорится, что мы должны поддерживать входные данные с индекса от 0 до 1000. (Меняется 1e3на132 не влияет на байт-счетчик, хотя.)

Объяснение:

Попробуй это здесь.

import java.util.*;           // Required import for List, Stack and Collections

n->{                          // Method with integer as parameter and Object as return-type
  List l=new Stack();         //  List to store the PPPs in
  for(int a=2,b;a<132;a++)    //  Loop (1) from 2 to 1,000 (exclusive)
    for(b=2;b<132;b++)        //   Inner loop (2) from 2 to 1,000 (exclusive)
      if(p(a)*p(b)>0)         //    If both `a` and `b` are primes:
        l.add(Math.pow(a,b)); //     Add the power of those two to the List
                              //   End of loop (2) (implicit / single-line body)
                              //  End of loop (1) (implicit / single-line body)
  Collections.sort(l);        //  Sort the filled List
  return l.get(n);            //  Return the `n`'th item of the sorted List of PPPs
}                             // End of method

int p(int n){                 // Separated method with integer as parameter and return-type
  for(int i=2;                //  Index integer (starting at 2)
      i<n;                    //  Loop from 2 to `n` (exclusive)
    n=n%i++<1?                //   If `n` is divisible by `i`:
       0                      //    Change `n` to 0
      :                       //   Else:
       n                      //    Leave `n` the same
  );                          //  End of loop
  return n;                   //  Return `n` (which is now 0 if it wasn't a prime)
}                             // End of separated method

0

J, 21 байт

{[:/:~@,[:^/~p:@i.@>:

Индексируемая нулем анонимная функция.

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

Пытаясь вернуться в ход вещей, но я, кажется, забыл все уловки, чтобы сделать хорошие монадические цепи.

Краткое объяснение

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

Также 21 байт

3 :'y{/:~,^/~p:i.>:y'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.