Знайдіть n-ю ідеальну силу!


16

Досконала сила - це кількість форми a**b, де a>0і b>1.

Наприклад, 125є досконалою силою, оскільки її можна виразити як 5**3.

Мета

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

Технічні характеристики

  • Перша досконала сила - це 1(яка є 1**2).
  • Введення / виведення в будь-якому розумному форматі.
  • Вбудовані дозволені .

Додаткова інформація

Оцінка балів

Це . Найкоротше рішення в байтах виграє.

Тестові шафи

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 ⋯ 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

Математика, 34 байти

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

Створює n × n масив A ij = i 1+ j , розгладжує його і повертає n- й елемент.


3

CJam, 16 байт

ri_),_2f+ff#:|$=

Тестуйте це тут.

Пояснення

Це використовує аналогічну ідею з відповіддю LegionMammal 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)

Я щойно знову помітив, що Октаві не потрібно ndgrid(поки Матлаб робить) =)



3

Шавлія (версія 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це, на щастя, ідеальна потужність за стандартами Sage, адже тоді 1це 1-й елемент списку, а не 0-й :)


Отже, це Python за винятком основної силової частини?
CalculatorFeline

@CatsAreFluffy Andis_perfect_power()
yo '



1

Джулія, 64 32 байти

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

Це анонімна функція, яка приймає ціле число і повертає ціле число. Щоб викликати його, призначте його змінній.

Ідея тут така ж, як у відповіді Mathematica LegionMammal : Ми беремо зовнішній добуток цілих чисел 1 до n з 2 до n + 1, згортаємо отриману матрицю стовпцем, беремо унікальні елементи, сортуємо та отримуємо n- й елемент .

Спробуйте в Інтернеті! (включає всі тестові випадки)


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>


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

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.


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-го елемента.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.