Найди n-ую совершенную силу!

16

Совершенная сила - это число форм a**b, где a>0и b>1.

Например, 125это совершенная сила, потому что она может быть выражена как 5**3.

Цель

Ваша задача состоит в том, чтобы написать программу / функцию, которая найдет nидеальную степень, учитывая положительное целое число n.

Спекуляции

  • Первая совершенная сила - это 1(что есть 1**2).
  • Ввод / вывод в любом разумном формате.
  • Встроенные модули разрешены .

Дальнейшая информация

счет

Это . Самое короткое решение в байтах побеждает.

Testcases

input  output
1      1
2      4
3      8
4      9
5      16
6      25
7      27
8      32
9      36
10     49
Пропитанная монахиня
источник
1
До какого числа это должно работать? Бесконечность?
ghosts_in_the_code
Разумная сумма.
Утренняя монахиня
Как насчет языка, который использует только тип данных одного бита?
ghosts_in_the_code
1
@ Agawa001 Да, это стандартная лазейка, которая уже не смешная.
flawr

Ответы:

8

Желе , 11 байт

µÆE;¬g/’µ#Ṫ

Попробуйте онлайн! ,

Фон

Каждое натуральное число k можно однозначно разложить на множители как произведение степеней первых m простых чисел, т. Е. K = p 1 α 1 1 p m α m , где α m > 0 .

Мы имеем, что a b ( b> 1 ) для некоторого натурального числа a тогда и только тогда, когда b является делителем всех показателей α j .

Таким образом, целое число k> 1 является совершенной степенью тогда и только тогда, когда gcd (α 1 , ⋯, α m ) ≠ 1 .

Как это устроено

µÆ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. Я понятия не имею, как использовать это вообще.
Утренняя монахиня
Хорошее использование определения совершенной силы, имеющего отношение к первичной факторизации. Не могли бы вы включить этот алгоритм в описании?
Утренняя монахиня
@KennyLau Готово.
Деннис
Я не понимаю, как 21 ^ 2 включает первое или третье простое число в его факторизации. Не могли бы вы помочь мне понять, что вы имеете в виду под "каждым положительным целым числом k можно однозначно разложить на множители как произведение степеней первых m простых чисел ... где [показатель степени] a_n > 0?" Мне кажется, что при факторизации для 21 ^ 2 показатели степени при p = 2 и p = 5 равны нулю.
גלעד ברקן
@ גלעדברקן Извините, это должно было быть a_m> 0 . Предыдущие показатели m-1 могут включать нули.
Деннис
6

Mathematica, 34 байта

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

Создает массив n × n A ij = i 1+ j , выравнивает его и возвращает n- й элемент.

LegionMammal978
источник
3

CJam, 16 байтов

ri_),_2f+ff#:|$=

Проверьте это здесь.

объяснение

Это использует идею, аналогичную ответу LegionMammal's Mathematica.

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

Октава, 57 31 30 байт

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

Я просто снова заметил, что Octave не нуждается ndgrid(в то время как Matlab делает) =)

flawr
источник
3

Sage (версия 6.4, возможно, и другие): 64 63

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

Создает лямбда-функцию, которая возвращает nидеальную силу. Мы полагаемся на то, что оно находится в первых n^2целых числах. ( 1+n^2Необходим для n=1,2. 0+kБит необходимо преобразовать int(k)в Integer(k).)

Отпусти за xrange-> range, спасибо Деннис.

Просто забавный факт: 0это прекрасная сила по меркам Мудреца, к счастью, потому что тогда 11-й элемент списка, а не 0-й :)

Эй'
источник
Так что это за Python, кроме основной части власти?
CalculatorFeline
@CatsAreFluffy Andis_perfect_power()
yo '
1

MATL, 9 байт

:tQ!^uSG)

Попробуйте онлайн

Это порт октавного решения Flawr для MATL, составьте матрицу степеней до n^(n+1)и получите n-й.

Дэвид
источник
1

Юлия, 64 32 байта

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

Это анонимная функция, которая принимает целое число и возвращает целое число. Чтобы вызвать его, присвойте его переменной.

Идея здесь такая же , как и в Mathematica LegionMammal в ответ : Мы берем внешнее произведение целых чисел 1 до п с 2 до п + 1, свернуть полученную матрицу по столбцам, принимать уникальные элементы, сортировать и получить п - й элемент ,

Попробуйте онлайн! (включает все тестовые случаи)

Алекс А.
источник
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

Меньше гольфа

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

Тестовое задание

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
источник
1

На самом деле, 18 байтов (не конкурирующих)

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

Попробуйте онлайн! (может не работать из-за необходимости обновления)

Это решение не конкурирует, потому что я исправил ошибку Eпосле того, как эта проблема была опубликована.

Объяснение:

;;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
источник
1

> <>, 108 байт

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

Эта программа требует, чтобы входной номер присутствовал в стеке перед запуском.

Потребовалось довольно много, чтобы уменьшить количество потерянных байтов до 7!

После проверки, чтобы увидеть, является ли ввод 1, программа проверяет каждое число n, начиная с 4, чтобы увидеть, является ли это идеальной силой. Это делается, начиная с a=b=2. Если a^b == nмы нашли совершенную силу, то уменьшаем количество оставшихся совершенных способностей - если мы уже нашли правильное число, выводим.

Если a^b < n, bувеличивается. Если a^b > n, aувеличивается. Тогда, если a == nмы обнаружили, что nэто не идеальная сила, так что увеличивайте n, сбрасывайте aи b.

Sok
источник
0

J, 29 байт

На основе @ LegionMammal978 по методу .

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

использование

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

объяснение

<:{[:/:~@~.[:,/[:(^/>:)~>:@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 байта

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², сортировки результирующего списка и получения n-го элемента.

Нил
источник
0

Ява, 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;}}
HopefullyHelpful
источник
Будет ли короче использовать рекурсию?
Лаки Монахиня
Хорошо, идея, нужно много планирования, хотя.
Надеюсь, это