พลังแห่งช่วงเวลาสำคัญ


16

สำหรับจุดประสงค์ของการท้าทายนี้ Prime Power of Prime (PPP) หมายถึงจำนวนที่สามารถกำหนดเป็นจำนวนเฉพาะกับกำลังของจำนวนเฉพาะ ตัวอย่างเช่น 9 เป็น PPP เพราะสามารถแสดงเป็น 3 ^ 2 ในทางกลับกันไม่ใช่ PPP เพราะมันสามารถถูกแทนด้วย 3 ^ 4 เท่านั้นและ 4 ไม่ใช่นายกรัฐมนตรี PPPs สองสามตัวแรกคือ: 4, 8, 9, 25, 27, 32, 49, 121, 125, 128, 169, 243, 289, 343 ... นี่คือลำดับ OEIS A053810

งานของคุณ:

เขียนโปรแกรมหรือฟังก์ชั่นสำหรับอินพุตจำนวนเต็ม n ส่งคืน / ส่งออก PPP ตัวที่ n ทั้งดัชนี 1 ดัชนีหรือ 0 ดัชนีใด ๆ ที่คุณต้องการ

การป้อนข้อมูล:

จำนวนเต็มตั้งแต่ 0 ถึง 1,000 ได้รับผ่านวิธีการที่สมเหตุสมผล

เอาท์พุท:

PPP ที่ดัชนีที่ระบุโดยอินพุต

กรณีทดสอบ:

สิ่งเหล่านี้คือ 1 ที่จัดทำดัชนีและดังนั้นหากโปรแกรมของคุณรับอินพุต 0 ที่จัดทำดัชนีเอาท์พุทเดียวกันควรมาถึงสำหรับอินพุตที่ระบุ - 1

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

เกณฑ์การให้คะแนน:

นี้คะแนนต่ำสุดในไบต์ชนะ!


ความท้าทายนี้ได้ถูกSandboxed
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ไม่ได้ถูกตีความเป็น truthy! แต่คุณสามารถบันทึกไบต์ในเวอร์ชันดั้งเดิมของ 05AB1E (ซึ่งคุณใช้ใน TIO ของคุณ) ด้วยการละเว้น½เนื่องจากสิ่งนี้ทำโดยปริยายสำหรับµ(สัญลักษณ์แสดงหัวข้อย่อยที่สองในส่วนปลายของ 05AB1E นี้ ) นอกจากนี้ยังสามารถʒĀ} 7 bytes0K
Kevin Cruijssen

@KevinCruijssen ยอดเยี่ยม ขอบคุณ!
Arnauld

5

Huskขนาด 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

Mathematica, 48 ไบต์

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

ลองออนไลน์!

แต่มาร์ตินเอนเดอร์มีความคิดที่ดีกว่าและบันทึกได้ 6 ไบต์

Mathematica ขนาด 42 ไบต์

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

ลองออนไลน์!


คุณสามารถใช้Unionแทนการที่จะหลีกเลี่ยงJoin Sort
Martin Ender

แต่ฉันคิดว่าOuterช่วยประหยัดอีก byte มากกว่าArray:(Union@@Outer[Power,p=Prime@Range@#,p])[[#]]&
Martin Ender

และTuplesยิ่งสั้นกว่า:Sort[Power@@@Prime@Range@#~Tuples~2][[#]]&
Martin Ender


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-based

(!!)[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]]inlining: บางทีมันก็โอเคแล้วที่จะไม่นับf=? (ไม่แน่ใจเกี่ยวกับกฎ)
Will Ness

ฉันเคยบอกว่า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]]ไบต์ด้วย
Will Ness

4

Python 2 , 163 157 137 136 ไบต์

  • บันทึกหกไบต์โดยใช้input()แทนที่จะกำหนดฟังก์ชั่น
  • บันทึกสี่ไบต์ด้วยFelipe Nardi Batista ; การรวมสองลูป
  • ที่บันทึกไว้สิบหกไบต์ขอบคุณที่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

ลองออนไลน์!


ใช้รายการแทนการบันทึก byte: i=[]และ....i+=[r]*....
Felipe Nardi Batista

153 bytesโดยการลบวินาทีfor
Felipe Nardi Batista

@FelipeNardiBatista ฉันไม่ได้ใช้รายการเนื่องจากในการทำซ้ำครั้งแรกโปรแกรมได้กำหนดฟังก์ชั่น ขอบคุณสำหรับการจำและกอล์ฟเพิ่มเติม
Jonathan Frech

คุณกลับมา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))

** อัลกอริทึมปกติ (ผล 100ms) 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
Umm นี้เป็นรหัสกอล์ฟไม่เร็วที่สุดรหัส ดังนั้นความเร็วของการส่งของคุณเมื่อเทียบกับคนอื่น ๆ ไม่สำคัญเนื่องจากเป็นคะแนนที่นับเป็นไบต์ โปรดระบุจำนวนไบต์และภาษาที่คุณส่งในคำตอบของคุณ
Gryphon

แต่มันควรจะมีเวลาอย่างน้อยฉันสามารถตีมันได้ แต่การแก้ปัญหา 100ms จะกลายเป็นวิธีแก้ปัญหา 5 วินาทีใช่ไหม?
DanielIndie

2
วิธีแก้ปัญหาอาจใช้เวลาเล็กน้อยในการรัน เป้าหมายเดียวคือการทำให้รหัสสั้นลง
Gryphon

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 = 1,000) คือ 49378729 ซึ่งคือ 7027 ^ 2 และพลังพิเศษที่สำคัญที่สุดของ 2 ซึ่งพอดีกับที่อยู่ภายใต้คือ 23 ดังนั้นครอบคลุม 2..7027 ^ 2 .. 23 รวมรายการทั้งหมดใน 1,000 รายการแรก (และอะไหล่จำนวนมาก)



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ซึ่งผลลัพธ์ในรายการเพียง 1,024 รายการ สิ่งนี้ช่วยปรับปรุงประสิทธิภาพได้ค่อนข้างน้อยและเป็นที่ยอมรับอย่างสมบูรณ์เนื่องจากความท้าทายที่เราควรสนับสนุนอินพุตจากดัชนี 0 ถึง 1,000 (การเปลี่ยน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.@>:

ฟังก์ชันที่ไม่ระบุชื่อแบบไม่มีดัชนีดัชนี

ลองออนไลน์!

พยายามกลับเข้าสู่การแกว่งของสิ่งต่าง ๆ แต่ดูเหมือนว่าฉันลืมเทคนิคทั้งหมดเพื่อสร้างโซ่ monadic ที่ดี

คำอธิบายสั้น ๆ

สร้างตารางของจำนวนเฉพาะจาก 0 ถึงจำนวนเฉพาะที่ดัชนีของอินพุทบวก 1 (ไปยังบัญชีสำหรับ 0) ปรับรายการนี้ให้เรียบและเรียงลำดับจากนั้นทำดัชนีลงในรายการ ฉันรู้แล้วว่านี่อาจให้ผลลัพธ์ที่ไม่ถูกต้องสำหรับค่าบางอย่างเนื่องจากตารางอาจไม่ใหญ่พอ - ในกรณีนี้ฉันจะแก้ไขค่า hardcoded เช่น 1e4 ซึ่งน่าจะพอเพียง ฉันไม่สามารถพิสูจน์ทางเดียวหรืออื่น ๆ (มันผ่านสำหรับกรณีทดสอบที่กำหนด) ดังนั้นให้ฉันรู้ว่านี่เป็นปัญหาหรือไม่

นอกจากนี้ 21 ไบต์

3 :'y{/:~,^/~p:i.>:y'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.