Znajdź n-tą idealną moc!

16

Idealna moc to szereg postaci a**b, gdzie a>0i b>1.

Na przykład 125jest doskonałą mocą, ponieważ można ją wyrazić jako 5**3.

Cel

Twoim zadaniem jest napisanie programu / funkcji, która znajdzie n -tą idealną moc, biorąc pod uwagę dodatnią liczbę całkowitą n.

Okular

  • Pierwszą idealną mocą jest 1(która jest1**2 ).
  • Wejście / wyjście w dowolnym rozsądnym formacie.
  • Wbudowane są dozwolone .

Dalsza informacja

Punktacja

To jest . Najkrótsze rozwiązanie w bajtach wygrywa.

Przypadki testowe

input  output
1      1
2      4
3      8
4      9
5      16
6      25
7      27
8      32
9      36
10     49
Leaky Nun
źródło
1
Do jakiego numeru to powinno działać? Nieskończoność?
ghosts_in_the_code
Rozsądna kwota.
Leaky Nun
Co powiesz na język, który używa tylko jednego typu danych?
ghosts_in_the_code
1
@ Agawa001 Tak, to standardowa luka, która nie jest już zabawna.
flawr

Odpowiedzi:

8

Galaretka , 11 bajtów

µÆE;¬g/’µ#Ṫ

Wypróbuj online! .

tło

Każda dodatnia liczba całkowita k może być unikatowo faktoryzowana jako iloczyn mocy pierwszych m liczb pierwszych, tj. K = p 1 α 1 ⋯ p m α m , gdzie α m > 0 .

Mamy że b ( b> 1 ) dla niektórych liczba całkowita dodatnia wtedy i tylko wtedy, gdy b jest dzielnikiem wszystkich wykładników a j .

Zatem liczba całkowita k> 1 jest potęgą doskonałą wtedy i tylko wtedy, gdy gcd (α 1 , ⋯, α m ) ≠ 1 .

Jak to działa

µÆ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.
Dennis
źródło
W ogóle nie widziałem STDIN. W ogóle nie mam pojęcia, jak go używać.
Leaky Nun
Ładne zastosowanie definicji idealnej mocy związanej z rozkładem na czynniki pierwsze. Czy możesz dołączyć ten algorytm do opisu?
Leaky Nun
@KennyLau Gotowe.
Dennis
Nie rozumiem, w jaki sposób 21 ^ 2 uwzględnia pierwszą lub trzecią liczbę pierwszą w swojej faktoryzacji. Czy mógłbyś mi pomóc zrozumieć, co rozumiesz przez „Każda dodatnia liczba całkowita k może być wyjątkowo podzielona na czynniki jako iloczyn potęg pierwszych liczb pierwszych m… gdzie [wykładnik] a_n > 0?” Wydaje mi się, że w faktoryzacji dla 21 ^ 2 wykładniki dla p = 2 i p = 5 wynoszą zero.
ב ברקן
@ קןרקן Przepraszamy, to powinno być a_m> 0 . Poprzednie wykładniki m-1 mogą zawierać zera.
Dennis
6

Mathematica, 34 bajty

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

Generuje tablicę n × n A ij = i 1+ j , spłaszcza ją i zwraca n- ty element.

LegionMammal978
źródło
3

CJam, 16 bajtów

ri_),_2f+ff#:|$=

Sprawdź to tutaj.

Wyjaśnienie

Wykorzystuje to podobny pomysł do odpowiedzi Mathematica z 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.
Martin Ender
źródło
3

Oktawa, 57 31 30 bajtów

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

Właśnie zauważyłem, że Octave nie potrzebuje ndgrid(podczas gdy Matlab tak) =)

wada
źródło
3

Sage (wersja 6.4, prawdopodobnie także inne): 64 63

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

Tworzy funkcję lambda, która zwraca nidealną moc. Polegamy na tym, że znajduje się w pierwszych n^2liczbach całkowitych. (The 1+n^2jest konieczne n=1,2. Ten 0+kbit jest konieczne, aby przekształcić int(k)do Integer(k)).

Byte off dla xrange->range , dzięki Dennis.

Ciekawostka: 0to idealna moc według standardów Sage'a, na szczęście, ponieważ 1jest to pierwszy element listy, a nie zero :)

Siema'
źródło
Więc to jest Python z wyjątkiem głównej części mocy?
CalculatorFeline
@CatsAreFluffy Andis_perfect_power()
yo '
2

Pyth - 12 11 bajtów

Oczywiste podejście, po prostu przechodzi i sprawdza wszystkie liczby.

e.ffsI@ZTr2

Pakiet testowy .

Maltysen
źródło
1

MATL, 9 bajtów

:tQ!^uSG)

Wypróbuj online

Jest to port rozwiązania Flawr Octave dla MATL, stwórz matrycę mocy do n^(n+1), i zdobądź n-ty.

David
źródło
1

Julia, 64 32 bajty

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

Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca liczbę całkowitą. Aby go wywołać, przypisz go do zmiennej.

Pomysł tutaj jest taki sam jak w odpowiedzi Mathematica z LegionMammal : bierzemy zewnętrzny iloczyn liczb całkowitych od 1 do n z 2 do n + 1, zwijamy wynikową macierz kolumnowo, bierz unikalne elementy, sortuj i uzyskaj n- ty element .

Wypróbuj online! (obejmuje wszystkie przypadki testowe)

Alex A.
źródło
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

Mniej golfa

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

Test

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>

edc65
źródło
1

Właściwie 18 bajtów (niekonkurujących)

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

Wypróbuj online!(może nie działać z powodu konieczności aktualizacji)

To rozwiązanie nie konkuruje, ponieważ naprawiłem błąd E po opublikowaniu tego wyzwania.

Wyjaśnienie:

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

> <>, 108 bajtów

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

Ten program wymaga obecności numeru wejściowego na stosie przed uruchomieniem.

Sporo czasu zajęło zmniejszenie liczby zmarnowanych bajtów do 7!

Po sprawdzeniu, czy dane wejściowe są 1, program sprawdza każdą liczbę n, od 4 z kolei, aby sprawdzić, czy jest to doskonała moc. Robi to, zaczynając od a=b=2. Gdybya^b == n znaleźliśmy idealną moc, zmniejsz więc liczbę idealnych mocy, które pozostały do ​​znalezienia - jeśli już znaleźliśmy właściwą liczbę, wyjdź.

W przypadku a^b < n, bjest zwiększany. W przypadku a^b > n, ajest zwiększany. Następnie, jeśli a == nodkryliśmy, że nnie jest to doskonała moc, więc zwiększaj n, resetuj ai b.

Sok
źródło
0

J, 29 bajtów

Opierając się na @ LegionMammal978 za metody .

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

Stosowanie

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

Wyjaśnienie

<:{[:/:~@~.[:,/[:(^/>:)~>:@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
mile
źródło
0

JavaScript (ES7), 104 bajty

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]

Działa poprzez obliczenie wszystkich mocy nie większych niż n², posortowanie wynikowej listy i pobranie n-tego elementu.

Neil
źródło
0

Java, 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;}}
Mam nadzieję, że jest pomocna
źródło
Czy użycie rekurencji byłoby krótsze?
Leaky Nun
Dobry pomysł, ale wymaga dużo planowania.
Mam nadzieję, że będzie