Першочергові повноваження Primes


16

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

Ваше завдання:

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

Вхід:

Ціле число від 0 до 1000, отримане будь-яким розумним методом.

Вихід:

ДПП за індексом, вказаним на вході.

Випробування:

Вони є 1-індексованими, і тому, якщо ваша програма приймає 0-індексований вхід, слід отримати той самий вихід для вказаного вводу - 1.

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

Оцінка:

Цей , найнижчий бал у байтах!


Цей виклик був пісочницею
Грифон

Відповіді:


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 Cool. Спасибі!
Арнольд

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

На основі рішення Pyth містера Xcoder . Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

;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

Математика, 48 байт

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

Спробуйте в Інтернеті!

але Мартін Ендер мав кращу ідею і врятував 6 байт

Математика, 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

Пітон 2 , 163 157 137 136 байт

  • Збережено шість байтів за допомогою функції, input()а не визначення функції.
  • Збережено чотири байти завдяки Феліпе Нарді Батісті ; злиття двох петель.
  • Збережено шістнадцять байтів завдяки лише ASCII .
  • Збережено байт завдяки 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]*....
Феліпе Нарді Батіста

153 байти , видаливши другийfor
Феліпе Нарді Батіста

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

Ви не можете повернутися rзамістьi[p]
лише для ASCII


2

Піт , 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;}

Дуже неефективний метод. В основному він обчислює всі ДПП від 2 2 до 999 999 132 132 і зберігає їх у списку, потім сортує цей список, а потім отримуєn '-й елемент із цього списку.

EDIT: Замість використання 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.