Temukan kekuatan sempurna ke-n!


16

Kekuatan yang sempurna adalah sejumlah bentuk a**b, di mana a>0dan b>1.

Sebagai contoh, 125adalah kekuatan yang sempurna karena dapat dinyatakan sebagai 5**3.

Tujuan

Tugas Anda adalah menulis program / fungsi yang menemukan nkekuatan sempurna -th, diberi bilangan bulat positif n.

Spesifikasi

  • Kekuatan sempurna pertama adalah 1(yang 1**2).
  • Input / output dalam format yang masuk akal.
  • Built-in diizinkan .

Informasi lebih lanjut

Mencetak gol

Ini adalah . Solusi terpendek dalam byte menang.

testcases

input  output
1      1
2      4
3      8
4      9
5      16
6      25
7      27
8      32
9      36
10     49

1
Sampai nomor berapa ini bisa berfungsi? Infinity?
ghosts_in_the_code

Jumlah yang masuk akal.
Leaky Nun

Bagaimana dengan bahasa yang hanya menggunakan tipe data satu bit?
ghosts_in_the_code

1
@ Agawa001 Ya itu adalah celah standar yang tidak lagi lucu.
flawr

Jawaban:


8

Jelly , 11 byte

µÆE;¬g/’µ#Ṫ

Cobalah online! .

Latar Belakang

Setiap bilangan bulat positif k dapat difaktorkan secara unik sebagai produk dari kekuatan bilangan prima m pertama , yaitu, k = p 1 α 1 ⋯ p m α m , di mana α m > 0 .

Kami memiliki yang a b ( b> 1 ) untuk beberapa bilangan bulat positif a jika dan hanya jika b adalah pembagi dari semua eksponen α j .

Jadi, bilangan bulat k> 1 adalah daya sempurna jika dan hanya jika gcd (α 1 , ⋯, α m ) ≠ 1 .

Bagaimana itu bekerja

µÆE;¬g/’µ#Ṫ  Main link. No arguments.

µ            Make the chain monadic, setting the left argument to 0.
        µ#   Find the first n integers k, greater or equal to 0, for which the
             preceding chain returns a truthy value.
             In the absence of CLAs, n is read implicitly from STDIN.
 ÆE          Compute the exponents of the prime factorization of k.
   ;¬        Append the logical NOT of k, i.e., 0 if k > 0 and 1 otherwise.
             This maps 1 -> [0] and [0] -> [1].
     g/      Reduce the list of exponents by GCD.
             In particular, we achieved that 1 -> 0 and 0 -> 1.
       ’     Decrement; subtract 1 from the GCD.
             This maps 1 to 0 (falsy) and all other integers to a truthy value.
          Ṫ  Tail; extract the last k.

Saya belum melihat STDIN sama sekali. Saya tidak tahu bagaimana menggunakannya sama sekali.
Leaky Nun

Penggunaan definisi kekuatan sempurna berkaitan dengan faktorisasi prima. Bisakah Anda memasukkan algoritma ini dalam deskripsi?
Leaky Nun

@KennyLau Selesai.
Dennis

Saya tidak mengerti bagaimana 21 ^ 2 memasukkan prima pertama atau ketiga dalam faktorisasi. Bisakah Anda membantu saya memahami apa yang Anda maksud dengan "Setiap bilangan bulat positif k dapat difaktorkan secara unik sebagai produk dari kekuatan bilangan prima m pertama ... di mana [eksponen] a_n > 0?" Menurut saya dalam faktorisasi untuk 21 ^ 2 eksponen untuk p = 2 dan p = 5 adalah nol.
גלעד ברקן

@ גלעדברקן Maaf, seharusnya a_m> 0 . Eksponen m-1 sebelumnya mungkin termasuk nol.
Dennis

6

Mathematica, 34 byte

(Union@@Array[#^#2#&,{#,#}])[[#]]&

Menghasilkan n × n berbagai A ij = i 1 + j , merata, dan pengembalian yang n th elemen.


3

CJam, 16 byte

ri_),_2f+ff#:|$=

Uji di sini.

Penjelasan

Ini menggunakan ide yang mirip dengan jawaban Mathematica dari LegionMammal.

ri    e# Read input and convert to integer N.
_),   e# Duplicate, increment and turn into range [0 1 ... N].
_2f+  e# Duplicate and add two to each element to get [2 3 ... N+2].
ff#   e# Compute the outer product between both lists over exponentiation.
      e# This gives a bunch of perfect powers a^b for a ≥ 0, b > 1.
:|    e# Fold set union over the list, getting all unique powers generated this way.
$     e# Sort them.
=     e# Retrieve the N+1'th power (because input is 1-based, but CJam's array access
      e# is 0-based, which is why we included 0 in the list of perfect powers.

3

Oktaf, 57 31 30 byte

@(n)unique((1:n)'.^(2:n+1))(n)

Saya hanya memperhatikan lagi bahwa Oktaf tidak perlu ndgrid(sementara Matlab) =)



3

Sage (versi 6.4, mungkin juga yang lain): 64 63

lambda n:[k for k in range(1+n^2)if(0+k).is_perfect_power()][n]

Menciptakan fungsi lambda yang mengembalikan nkekuatan sempurna. Kami mengandalkan fakta bahwa itu ditemukan dalam n^2bilangan bulat pertama . ( 1+n^2Diperlukan untuk n=1,2. 0+kBit perlu dikonversi int(k)ke Integer(k).)

Byte off untuk xrange-> range, terima kasih Dennis.

Fakta yang menyenangkan: 0adalah kekuatan yang sempurna menurut standar Sage, untungnya, karena itu 1adalah elemen pertama dalam daftar, bukan ke-0 :)


Jadi ini Python kecuali untuk bagian kekuatan utama?
CalculatorFeline

@CatsAreFluffy Andis_perfect_power()
yo '

2

Pyth - 12 11 byte

Pendekatan yang jelas, hanya melewati dan memeriksa semua angka.

e.ffsI@ZTr2

Test Suite .


1

MATL, 9 byte

:tQ!^uSG)

Cobalah online

Ini adalah port dari solusi Octaf Flawr ke MATL, buat matriks kekuatan hingga n^(n+1) , dan dapatkan yang nke-1.


1

Julia, 64 32 byte

n->sort(∪([1:n]'.^[2:n+1]))[n]

Ini adalah fungsi anonim yang menerima integer dan mengembalikan integer. Untuk menyebutnya, tetapkan ke variabel.

Idenya di sini adalah sama seperti dalam jawaban Mathematica dari LegionMammal : Kami mengambil produk luar dari bilangan bulat 1 ke n dengan 2 ke n + 1, menutup kolom matriks yang dihasilkan dengan bijaksana, mengambil elemen unik, mengurutkan, dan mendapatkan n elemen ke- .

Cobalah online! (termasuk semua kasus uji)


1

JavaScript (ES6), 87

n=>(b=>{for(l=[i=0,1];b<n*n;++b)for(v=b;v<n*n;)l[v*=b]=v;l.some(x=>n==i++?v=x:0)})(2)|v

Kurang golf

f=n=>{
  for(b=2, l=[0,1]; b < n*n; ++b)
    for(v = b; v < n*n;)
      l[v*=b] = v;
  i = 0;
  l.some(x => n == i++ ? v=x : 0);
  return v;
  // shorter alternative, but too much memory used even for small inputs
  // return l.filter(x=>x) [n-1];
}

Uji

f=n=>(b=>{for(l=[i=0,1];b<n*n;++b)for(v=b;v<n*n;)l[v*=b]=v;l.some(x=>n==i++?v=x:0)})(2)|v

function test(){
  var v=+I.value
  O.textContent=f(v)
}
  
test()
<input type=number id=I value=10><button onclick='test()'>-></button>
<span id=O></span>


1

Sebenarnya, 18 byte (tidak bersaing)

;;u@ⁿr;`;√≈²=`M@░E

Cobalah online! (mungkin tidak berfungsi karena membutuhkan pembaruan)

Solusi ini tidak bersaing karena saya memperbaiki bug Esetelah tantangan ini diposting.

Penjelasan:

;;u@ⁿr;`;√≈²=`M@░E
;;u@ⁿr              push range(n**(n+1))
      ;`;√≈²=`M@░   filter: take if
        ;√≈²=         int(sqrt(x))**2 == x
                 E  get nth element

1

> <>, 108 byte

:1)?v  >n;
$:@@\&31+2>2$:@@:@
:1=?\@$:@*@@1-
:~$~<.1b+1v!?(}:{:~~v?(}:{:v?=}:{
1-:&1=?v~~>~61.     >~1+b1.>&

Program ini membutuhkan nomor input untuk hadir di tumpukan sebelum menjalankan.

Butuh cukup banyak untuk mengurangi jumlah byte yang terbuang hingga 7!

Setelah memeriksa untuk melihat apakah inputnya 1, program memeriksa setiap angka n,, dari 4 pada gilirannya untuk melihat apakah itu kekuatan yang sempurna. Ini dilakukan dengan memulai dengan a=b=2. Jika a^b == n, kami telah menemukan kekuatan sempurna, maka kurangi jumlah kekuatan sempurna yang tersisa untuk ditemukan - jika kami sudah menemukan jumlah yang tepat, hasilkan.

Jika a^b < n, bbertambah. Jika a^b > n, abertambah. Kemudian, jika a == n, kami telah menemukan bahwa nitu bukan kekuatan yang sempurna, maka kenaikan n, pengaturan ulang adan b.


0

J, 29 byte

Berdasarkan @ LegionMammal978 ini metode .

<:{[:/:~@~.[:,/[:(^/>:)~>:@i.

Pemakaian

   f =: <:{[:/:~@~.[:,/[:(^/>:)~>:@i.
   f " 0 (1 2 3 4 5 6 7 8 9 10)
1 4 8 9 16 25 27 32 36 49

Penjelasan

<:{[:/:~@~.[:,/[:(^/>:)~>:@i.
                           i.  Create range from 0 to n-1
                        >:     Increments each in that range, now is 1 to n
               [:              Cap, Ignores input n
                    >:         New range, increment from previous range to be 2 to n+1 now
                  ^/           Forms table using exponentation between 1..n and 2..n+1
             ,/                Flattens table to a list
         ~.                    Takes only distinct items
     /:~                       Sorts the list
<:                             Decrements the input n (since list is zero-based index)
  {                            Selects value from resulting list at index n-1

0

JavaScript (ES7), 104 byte

n=>(a=[...Array(n)]).map(_=>a.every(_=>(p=i**++j)>n*n?0:r[p]=p,i+=j=1),r=[i=1])&&r.sort((a,b)=>a-b)[n-1]

Bekerja dengan menghitung semua kekuatan tidak lebih dari n², mengurutkan daftar yang dihasilkan dan mengambil elemen ke-n.


0

Jawa, 126

r->{int n,i,k;if(r==1)return r;for(n=i=2,r--;;){for(k=i*i;k<=n;k*=i)if(k==n){i=--r>0?++n:n;if(r<1)return n;}if(--i<2)i=++n;}}

Apakah lebih pendek menggunakan rekursi?
Leaky Nun

Bagus, ide, butuh banyak perencanaan.
Semoga
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.