Mükemmel gücü bulun!


16

Mükemmel bir güç, formun bir numarasıdır a**b, nerede a>0ve b>1.

Örneğin, 125mükemmel bir güç olduğu için ifade edilebilir 5**3.

Hedef

Senin görevin npozitif bir tamsayı verilen -th mükemmel güç bulan bir program / işlev yazmaktır n.

gözlük

  • İlk mükemmel güç 1(ki 1**2).
  • Herhangi bir makul formatta giriş / çıkış.
  • Yerleşiklere izin verilir .

Daha fazla bilgi

puanlama

Bu . Baytlarda en kısa çözüm kazanır.

testcases

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

1
Bu sayı ne kadar olmalı? Sonsuzluk?
ghosts_in_the_code

Makul bir miktar.
Leaky Nun

Yalnızca bir bit veri türü kullanan bir dile ne dersiniz?
ghosts_in_the_code

1
@ Agawa001 Evet artık komik olmayan standart bir boşluk .
Kusur

Yanıtlar:


8

Jöle , 11 bayt

µÆE;¬g/’µ#Ṫ

Çevrimiçi deneyin!.

Arka fon

Her pozitif tamsayı k , ilk m primerlerinin güçlerinin ürünü olarak benzersiz bir şekilde çarpanlarına ayrılabilir , yani k = p 1 α 1 ⋯ p m α m , burada α m > 0 .

Biz sahip olduğunu bir b ( b> 1 tamsayı bazı olumlu için) bir ancak ve ancak b tüm üstlerin bir bölen bir α j .

Dolayısıyla, k> 1 tamsayısı sadece ve eğer gcd (α 1 , ⋯, α m ) ≠ 1 ise mükemmel bir güçtür .

Nasıl çalışır

µÆ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.

STDIN'i hiç görmedim. Nasıl kullanacağım hakkında hiçbir fikrim yok.
Sızdıran Rahibe

Asal çarpanlara ayırma ile ilgili olan mükemmel güç tanımının güzel kullanımı. Bu algoritmayı açıklamaya dahil edebilir misiniz?
Sızdıran Rahibe

@KennyLau Tamamlandı.
Dennis

21 ^ 2 'nin çarpanlarına ayırmada birinci veya üçüncü asayı nasıl içerdiğini anlamıyorum. "Her pozitif tamsayı k, ilk m primerlerinin güçlerinin ürünü olarak benzersiz bir şekilde çarpanlarına ayrılabilir ... nerede [üs] a_n > 0?" Bana öyle geliyor ki 21 ^ 2 çarpanlarına ayırmada p = 2 ve p = 5 için üsler sıfır.
ברקן ברקן

@ גלעדברקן Maalesef a_m> 0 olmalıdır . Önceki m-1 üsleri sıfır içerebilir.
Dennis

6

Mathematica, 34 bayt

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

Bir n × n dizi oluşturur A ij = i 1+ j , düzleştirir ve n . Elemanı döndürür .


3

CJam, 16 bayt

ri_),_2f+ff#:|$=

Burada test edin.

açıklama

Bu, LegionMammal'ın Mathematica cevabına benzer bir fikir kullanır.

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

Oktav, 57 31 30 bayt

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

Ben sadece tekrar fark ettim Octave ndgrid(Matlab gerek yok) =)



3

Adaçayı (sürüm 6.4, muhtemelen diğerleri): 64 63

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

nMükemmel gücü döndüren bir lambda fonksiyonu yaratır . İlk n^2tamsayılarda bulunmasına güveniyoruz . (İçin 1+n^2gereklidir n=1,2. 0+kBit dönüştürmek int(k)için gereklidir Integer(k).)

İçin bayt xrange-> range, teşekkürler Dennis.

Sadece eğlenceli bir gerçek: 0Sage'nin standartlarına göre mükemmel bir güç, neyse ki, çünkü o zaman 1listenin 1. elemanı değil, birinci unsur :)


Peki bu ana güç kısmı hariç Python mu?
CalculatorFeline

@CatsAreFluffy Veis_perfect_power()
yo '


1

MATL, 9 bayt

:tQ!^uSG)

Çevrimiçi deneyin

Bu kadar güçlerin matrisi yapmak, Matl için Flawr en Octave çözümün bir liman n^(n+1)ve almak n-th biri.


1

Julia, 64 32 bayt

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

Bu, bir tamsayıyı kabul eden ve bir tam sayı döndüren anonim bir işlevdir. Bunu çağırmak için bir değişkene atayın.

Buradaki fikir LegionMammal en Mathematica aynıdır cevap : Biz tamsayılar 1 dış ürünü almak n 2'ye ile n , sıralama benzersiz öğeleri almak, kolon-bilge çıkan matris daraltmak ve almak + 1'e n th elemanını .

Çevrimiçi deneyin! (tüm test senaryolarını içerir)


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

Daha az 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];
}

Ölçek

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

Aslında, 18 bayt (rakip olmayan)

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

Çevrimiçi deneyin! (güncelleme gerektiğinden çalışmayabilir)

Ben Ebu sorun gönderildikten sonra bir hata düzeltildi çünkü bu çözüm rakip değil .

Açıklama:

;;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 bayt

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

Bu program çalıştırmadan önce giriş numarasının yığın üzerinde bulunmasını gerektirir.

Boşa giden bayt sayısını 7'ye düşürmek oldukça fazla zaman aldı!

Girişin olup olmadığını kontrol ettikten sonra 1, program her bir sayıyı kontrol eder n, sırayla 4'ten mükemmel bir güç olup olmadığını kontrol eder. Bunu ile başlayarak yapar a=b=2. Eğera^b == n zaten, çıktı doğru sayıda bulduysanız - biz mükemmel bir güce buldum, çok mükemmel güçlerin sayısı bulmak için sol azaltma.

Eğer a^b < n, bartırılırsa. Eğer a^b > n, aartırılırsa. Sonra, eğer a == n, bunun nmükemmel bir güç olmadığını fark ettik , bu yüzden arttırma n, sıfırlama ave b.


0

J, 29 bayt

@ LegionMammal978'in yöntemine göre .

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

kullanım

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

açıklama

<:{[:/:~@~.[:,/[:(^/>:)~>:@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 bayt

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]

N²'den büyük olmayan tüm güçleri hesaplayarak, ortaya çıkan listeyi sıralayarak ve n. Elemanı alarak çalışır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.