Trouvez la n-ième puissance parfaite!

16

Un pouvoir parfait est un certain nombre de la forme a**b, où a>0et b>1.

Par exemple, 125est un pouvoir parfait car il peut être exprimé comme 5**3.

Objectif

Votre tâche consiste à écrire un programme / une fonction qui trouve le n puissance parfaite -th, étant donné un entier positif n.

Spécifications

  • La première puissance parfaite est 1(qui est1**2 ).
  • Entrée / sortie dans n'importe quel format raisonnable.
  • Les fonctions intégrées sont autorisées .

Plus d'informations

Notation

C'est du . La solution la plus courte en octets gagne.

Cas de test

input  output
1      1
2      4
3      8
4      9
5      16
6      25
7      27
8      32
9      36
10     49
Leaky Nun
la source
1
Jusqu'à quel nombre cela devrait-il fonctionner? Infini?
ghosts_in_the_code
Un montant raisonnable.
Leaky Nun
Qu'en est-il d'une langue qui n'utilise qu'un type de données d'un bit?
ghosts_in_the_code
1
@ Agawa001 Oui, c'est une échappatoire standard qui n'est plus drôle.
flawr

Réponses:

8

Gelée , 11 octets

µÆE;¬g/’µ#Ṫ

Essayez-le en ligne! .

Contexte

Chaque entier positif k peut être factorisé uniquement comme le produit des puissances des premiers m premiers, c'est-à-dire k = p 1 α 1 ⋯ p m α m , où α m > 0 .

Nous avons que a b ( b> 1 ) pour un entier positif a si et seulement si b est un diviseur de tous les exposants α j .

Ainsi, un entier k> 1 est une puissance parfaite si et seulement si pgcd (α 1 , ⋯, α m ) ≠ 1 .

Comment ça fonctionne

µÆ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
la source
Je n'ai pas du tout vu STDIN. Je ne sais pas du tout comment l'utiliser.
Leaky Nun
Belle utilisation de la définition de la puissance parfaite liée à la factorisation en nombre premier. Pourriez-vous inclure cet algorithme dans la description?
Leaky Nun
@KennyLau Done.
Dennis
Je ne comprends pas comment 21 ^ 2 inclut le premier ou le troisième nombre premier dans sa factorisation. Pourriez-vous s'il vous plaît m'aider à comprendre ce que vous entendez par "Chaque entier positif k peut être factorisé uniquement comme le produit des puissances des premiers m premiers ... où [l'exposant] a_n > 0?" Il me semble que dans la factorisation pour 21 ^ 2 les exposants pour p = 2 et p = 5 sont nuls.
גלעד ברקן
@ גלעדברקן Désolé, cela aurait dû être a_m> 0 . Les exposants m-1 précédents peuvent inclure des zéros.
Dennis
6

Mathematica, 34 octets

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

Génère un tableau n × n A ij = i 1+ j , l'aplatit et renvoie le n ème élément.

LegionMammal978
la source
3

CJam, 16 octets

ri_),_2f+ff#:|$=

Testez-le ici.

Explication

Cela utilise une idée similaire à la réponse Mathematica de 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
la source
3

Octave, 57 31 30 octets

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

Je viens de remarquer à nouveau qu'Octave n'a pas besoin ndgrid( contrairement à Matlab) =)

flawr
la source
3

Sage (version 6.4, probablement aussi d'autres): 64 63

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

Crée une fonction lambda qui renvoie nla puissance parfaite. Nous comptons sur le fait qu'il se trouve dans les premiers n^2entiers. (Le 1+n^2est nécessaire pour n=1,2. Le 0+kbit est nécessaire pour convertir int(k)en Integer(k).)

Octet désactivé pour xrange->range , merci Dennis.

Juste un fait amusant: 0c'est un pouvoir parfait par rapport aux normes de Sage, heureusement, car alors 1c'est le 1er élément de la liste, pas le 0 :)

yo '
la source
Donc, c'est Python, sauf pour la partie puissance principale?
CalculatorFeline
@CatsAreFluffy Andis_perfect_power()
yo '
2

Pyth - 12 11 octets

Approche évidente, passe simplement par et vérifie tous les nombres.

e.ffsI@ZTr2

Suite de tests .

Maltysen
la source
1

MATL, 9 octets

:tQ!^uSG)

Essayez-le en ligne

Il s'agit d'un portage de la solution Octave de Flawr à MATL, augmentez la matrice des puissances n^(n+1)et obtenez la n-ième.

David
la source
1

Julia, 64 32 octets

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

Il s'agit d'une fonction anonyme qui accepte un entier et renvoie un entier. Pour l'appeler, affectez-le à une variable.

L'idée ici est la même que dans la réponse Mathematica de LegionMammal : nous prenons le produit externe des entiers 1 à n avec 2 à n + 1, réduisons la matrice résultante en colonne, prenons des éléments uniques, trions et obtenons le n ème élément .

Essayez-le en ligne! (inclut tous les cas de test)

Alex A.
la source
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

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

Tester

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
la source
1

En fait, 18 octets (non concurrents)

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

Essayez-le en ligne! (peut ne pas fonctionner car une mise à jour est nécessaire)

Cette solution n'est pas concurrente car j'ai corrigé un bogue Eaprès la publication de ce défi.

Explication:

;;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
la source
1

> <>, 108 octets

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

Ce programme nécessite que le numéro d'entrée soit présent sur la pile avant de s'exécuter.

Il a fallu beaucoup de temps pour réduire le nombre d'octets perdus à 7!

Après une vérification pour voir si l'entrée est 1, le programme vérifie chaque nombre n, à partir de 4 tour à tour pour voir si c'est une puissance parfaite. Il le fait en commençant par a=b=2. Sia^b == n , nous avons trouvé une puissance parfaite, décrémentez donc le nombre de puissances parfaites à trouver - si nous avons déjà trouvé le bon nombre, la sortie.

Si a^b < n, best incrémenté. Si a^b > n, aest incrémenté. Ensuite, si a == n, nous avons constaté que ce nn'est pas une puissance parfaite, alors incrémentez n, réinitialisez aet b.

Sok
la source
0

J, 29 octets

Basé sur la méthode de @ LegionMammal978 .

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

Usage

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

Explication

<:{[:/:~@~.[:,/[:(^/>:)~>:@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
miles
la source
0

JavaScript (ES7), 104 octets

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]

Fonctionne en calculant toutes les puissances non supérieures à n², en triant la liste résultante et en prenant le nième élément.

Neil
la source
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;}}
Si tout va bien
la source
Serait-il plus court d'utiliser la récursivité?
Leaky Nun
Bon, idée, a besoin de beaucoup de planification.
Espérons que ce sera utile