Encontre o n-ésimo poder perfeito!


16

Um poder perfeito é um número da forma a**b, onde a>0e b>1.

Por exemplo, 125é um poder perfeito porque pode ser expresso como 5**3.

Objetivo

Sua tarefa é escrever um programa / função que encontre a n-ésima potência perfeita, dado um número inteiro positivo n.

Especificações

  • O primeiro poder perfeito é 1(o que é 1**2).
  • Entrada / saída em qualquer formato razoável.
  • Built-ins são permitidos .

Outras informações

Pontuação

Isso é . A solução mais curta em bytes vence.

Casos de teste

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

1
Até que número isso deve funcionar? Infinidade?
Ghosts_in_the_code

Uma quantidade razoável.
Leaky Nun

E uma linguagem que usa apenas um tipo de dados de um bit?
Ghosts_in_the_code

1
@ Agawa001 Sim, é uma brecha padrão que não é mais engraçada.
Flawr 01/05/19

Respostas:


8

Gelatina , 11 bytes

µÆE;¬g/’µ#Ṫ

Experimente online! .

fundo

Todo número inteiro positivo k pode ser fatorado exclusivamente como o produto das potências dos primeiros m primos, ou seja, k = p 1 α 1 ⋯ p m α m , onde α m > 0 .

Temos que a b ( b> 1 ) para algum número inteiro positivo a se e somente se b é um divisor de todos os expoentes α j .

Assim, um número inteiro k> 1 é uma potência perfeita se e somente se mcd (α 1 , ⋯, α m ) ≠ 1 .

Como funciona

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

Eu não vi STDIN. Eu não tenho idéia de como usá-lo.
Leaky Nun

Bom uso da definição de potência perfeita relacionada à fatoração primária. Você poderia incluir esse algoritmo na descrição?
Leaky Nun

@KennyLau Done.
Dennis

Não entendo como 21 ^ 2 inclui o primeiro ou o terceiro primos em sua fatoração. Você poderia me ajudar a entender o que você quer dizer com "Todo número inteiro positivo k pode ser fatorado exclusivamente como o produto das potências dos primeiros m primos ... onde [o expoente] a_n > 0?" Parece-me que na fatoração de 21 ^ 2 os expoentes para p = 2 ep = 5 são zero.
גלעד ברקן

@ גלעדברקן Desculpe, deveria ter sido a_m> 0 . Os expoentes m-1 anteriores podem incluir zeros.
Dennis #

6

Mathematica, 34 bytes

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

Gera um n × n matriz Uma ij = i 1+ j , achata-lo, e retorna o n ésimo elemento.


3

CJam, 16 bytes

ri_),_2f+ff#:|$=

Teste aqui.

Explicação

Isso usa uma idéia semelhante à resposta Mathematica da 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

Oitava, 57 31 30 bytes

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

Acabei de notar novamente que o Octave não precisa ndgrid(enquanto o Matlab) =)



3

Sage (versão 6.4, provavelmente também outras): 64 63

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

Cria uma função lambda que retorna na potência perfeita. Contamos com o fato de que ele é encontrado nos primeiros n^2números inteiros. (O 1+n^2necessário para n=1,2. O0+k bit é necessário para converter int(k)em Integer(k).)

Byte desativado por xrange -> range, obrigado Dennis.

Apenas um fato divertido: 0é um poder perfeito para os padrões de Sage, felizmente, porque então 1é o primeiro elemento da lista, não o 0º :)


Então este é Python, exceto pela parte principal do poder?
CalculatorFeline

@CatsAreFluffy Andis_perfect_power()
yo '


1

MATL, 9 bytes

:tQ!^uSG)

Experimente online

Esta é uma porta da solução Octave da Flawr para o MATL, aumenta a matriz de potências n^(n+1)e obtém a n-ª.


1

Julia, 64 32 bytes

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

Esta é uma função anônima que aceita um número inteiro e retorna um número inteiro. Para chamá-lo, atribua-o a uma variável.

A idéia aqui é a mesma que no Mathematica de LegionMammal resposta : Tomamos o produto externo dos inteiros 1 a n com 2 a n + 1, o colapso da matriz resultante coluna-wise, tome elementos únicos, classificar e conseguir o n º elemento .

Experimente online! (inclui todos os casos de teste)


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

Menos golfe

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

Teste

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

Na verdade, 18 bytes (não concorrentes)

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

Experimente online! (pode não funcionar devido à necessidade de uma atualização)

Esta solução não é competitiva porque eu corrigi um bug Eapós o lançamento deste desafio.

Explicação:

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

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

Este programa requer que o número de entrada esteja presente na pilha antes da execução.

Demorou bastante para reduzir o número de bytes desperdiçados para 7!

Após uma verificação para ver se a entrada é 1, o programa verifica cada número n, de 4 por vez para ver se é uma potência perfeita. Faz isso começando com a=b=2. Se a^b == nencontrarmos uma potência perfeita, diminua o número de potências perfeitas restantes para encontrar - se já encontramos o número certo, a saída.

Se a^b < n, bé incrementado. Se a^b > n, aé incrementado. Então, se a == ndescobrimos que nnão é uma potência perfeita, então incremente n, redefina ae b.


0

J, 29 bytes

Com base no método @ LegionMammal978 .

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

Uso

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

Explicação

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

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]

Funciona computando todas as potências não maiores que n², classificando a lista resultante e obtendo o enésimo elemento.


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

Seria mais curto usar recursão?
Freira Furada

Boa ideia, porém, precisa de muito planejamento.
que você
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.