Досконалі повноваження більш ніж одним способом?


13

Виклик

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

Визначення

Ідеальна потужність визначається як число я знайденому м ^ до , де:

  • м і я - натуральні цілі
  • м! = к

Випробування

вхід -> вихід
1000 -> 16, 64, 81, 256, 512, 625, 729
56 -> 16
999 -> 16, 64, 81, 256, 512, 625, 729
81 -> 16, 64, 81
1500 -> 16, 64, 81, 256, 512, 625, 729, 1024, 1296

Будь ласка, надайте також читану, коментовану версію.


Чи означає ваше останнє речення, що пробіл не входить до числа символів?
sepp2k

@ sepp2k Так! Не слід рахувати пробіли.
fR0DDY

4
@ fR0DDY Що з пробілом мови ? Ігнорування символів пробілів завжди змусить цю мову виграти.
moinudin

4
Я не думаю, що боляче мати дивне запитання, на яке можна виграти відповідь пробілу. Ми побачимо, скільки часу пройде, перш ніж хтось зможе це зробити.
гніблер

1
Чи є обмеження на N?
Догберт

Відповіді:


3

Математика: 103 символи

Проміжки можна видалити

Select[Flatten@
       Table[
        Solve[Log@#/Log@b == k, k, Integers] /. k -> #, {b, 2, #}] & /@ Range@#, 
Length@# > 2 &][[All, 1, 1]] &  

Використання:

%[81]
{16, 64, 81}

3

Желе , 11 значущих байтів, виклик мови після публікації

ḊḟÆR *@þ Ḋ  F  fḊ

Спробуйте в Інтернеті!

Ось зовсім інше рішення. Це цікавий гібрид ефективних та неефективних, що використовує ефективний алгоритм основної роботи в дуже неефективній обгортці (настільки, що він не може обробити дуже велику кількість). Як і раніше, весь пробіл є безглуздим.

Ось як це працює. (який відображається кілька разів) - це перелік чисел від 2 до входу включно:

ḊḟÆR *@þ Ḋ  F  fḊ
ḊḟÆR                Ḋ, with all primes between 2 and the input removed
                    (i.e. all composite numbers from 4 to the input)
     *@þ Ḋ          Exponentiate all Ḋ elements with all ḊḟÆR elements
            F       Flatten the result (it had a nested structure)
               fḊ   Keep only elements in Ḋ

Основне спостереження тут полягає в тому, що число є досконалою силою в декількох напрямках, тільки якщо це ідеальна потужність із складеним показником (це не 1). Ми формуємо список тих, де база знаходиться від 2 до входу, а показник - складене число від 4 до входу; це насправді повільно, оскільки воно генерує кілька дійсно великих цифр, які є відповіддю на питання. Тоді ми зберігаємо лише відповіді, які є в діапазоні.

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


1

Perl: 68 символів

Вводить максимум (1000) в $Nі повертає відповідь в @a.

for $x ( 2..$N ) {
    $c{$x**$_}++ for 2..log($N)/log$x
}
@a = grep { $c{$_} > 1 } keys %c

Для цілої програми мені потрібно ще 18 символів:

$m = shift;
for $x ( 2..$m ) {
    $c{$x**$_}++ for 2..log($m)/log$x
}
print join ' ', grep { $c{$_} > 1 } keys %c

Це не друкується по порядку. codepad.org/H0Zyau3z
Dogbert

@Dogbert: Друк на замовлення не є складною задачею. Якщо це було так, ви додаєте sort раніше grep. Я, до речі, раніше не бачив кодової панелі. Спасибі.

0

Ruby - 101 знак (без пробілу)

f=->l{c=Hash.new{0}
2.upto(1E4){|i|2.upto(20){|j|c[i**j]+=1}}
c.map{|k,v|v>1&&k<=l&&k||p}.compact.sort}

Працює 1 <= limit <= 100,000,000протягом 5 секунд.

Тест

> f[10000]
[16, 64, 81, 256, 512, 625, 729, 1024, 1296, 2401, 4096, 6561, 10000]

0

Желе , 13 значущих персонажів, мова викличе завдання

R  µ  ọḊ *@Ḋ ċ >2  µ  Ðf

Спробуйте в Інтернеті!

Весь пробіл тут незначний. Я використовував це, щоб показати структуру своєї відповіді, як задається питанням.

Ось як це працює:

R  µ  ọḊ *@Ḋ ċ >2  µ  Ðf
R                     Ðf    Find all numbers n from 1 to the input, such that:
   µ               µ          (grouping marks, like {} in C)
       Ḋ   Ḋ                  Take the range from 2 to n
      ọ                       Find the number of times each divides n
         *@                   Raise the range from 2 to n to these powers
             ċ                Count the number of times n appears
               >2             and the result must be greater than 2

Так, наприклад, перевіряючи n = 256, ми перевіряємо, скільки разів кожне з чисел від 2 до 256 ділиться на 256. Єдині числа, які діляться більше, ніж один раз, складають 2 (що ділиться в 8 разів), 4 (що ділить 4 разів), 8 (яка ділиться двічі) та 16 (яка ділиться двічі). Отже, коли ми піднімаємо кількість підрозділів до визначених там повноважень, ми отримуємо:

2⁸, 3, 4⁴, 5, 6, 7, 8², 9, 10, 11, 12, 13, 14, 15, 16², 17, ..., 255, 256

Це дає вихідне значення 256, кількість разів дорівнює тому, що 256 є ідеальною потужністю плюс один (останній елемент видає 256, оскільки 256 = 256¹). Отже, якщо ми бачимо 256 більше двох разів у масиві (і ми це робимо в цьому випадку; 8² - це 64, але всі інші "цікаві" елементи виробляють 256), це має бути ідеальною силою.

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