Повноцінні повноваження


19

Деякі числа, як-от, 64можуть виражатися як повноцінне число в декількох способах:

64 ^ 1
 8 ^ 2
 4 ^ 3
 2 ^ 6

Виведіть відсортований масив усіх можливих таких повноважень (тут, [1,2,3,6]) якомога менше байтів.


Вхідні дані

Позитивне ціле число, яке перевищує 1 і менше 10000.


Вихідні дані

Масив повноцінних повноважень p(у тому числі 1), для яких вхід може бути виражений як a^pз цілим числом a. Виходи можуть мати десяткові знаки, якщо вони в порядку.

Проблеми з плаваючою комою повинні вирішуватися програмою.


Приклади

Input: 3
Output: [1]

Input: 9
Output: [1, 2]

Input: 81
Output: [1, 2, 4]

Input: 729
Output: [1, 2, 3, 6]

Табло

Щоб ваш рахунок з’явився на дошці, він повинен бути у такому форматі:

# Language, Bytes

Перекреслення не повинно спричинити проблем.


1
Моя відповідь друкує [1 2 3 6]для останнього тестового випадку. Чи може він також друкувати [6 3 2 1], [1.0 2.0 3.0 6.0]чи [6.0 3.0 2.0 1.0]?
Денніс

2
Що можна припустити щодо розмірів введення та арифметики з плаваючою комою? Це впливає на рішення, де ви намагаєтеся отримати коріння числа та побачити, чи результат є цілим.
xnor

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

1
Я ціную правки! Пропозиції та зміни завжди вітаються, якщо вони покращують якість мого питання (що, на мою думку, зробив ваш). Я тільки нещодавно почав задавати питання в цій конкретній мережі і вважаю, що громада загалом вітає. Критика та корекція дуже цінується! @xnor
Zach Gates

1
Просто знайдіть найбільшу дійсну потужність, а потім перерахуйте її фактори!
SuperJedi224

Відповіді:


10

Pyth, 10 байт

f}Q^RTSQSQ

Демонстрація

Для кожної потужності вона генерує список усіх чисел до входу, прийнятого на цю потужність, а потім перевіряє, чи є вхід у списку.


10

Хаскелл, 38

f n=[b|b<-[1..n],n`elem`map(^b)[1..n]]

Досить прямо. Список розуміння знаходить значення , bдля яких вхід nз'являється серед [1^b, 2^b, ..., n^b]. Досить перевірити bв асортименті [1..n].


9

Пітон 2, 53

lambda n:[i/n for i in range(n*n)if(i%n+1)**(i/n)==n]

Брут примушує всі комбінації основ у експонентах у [0, n-1], а підстав у [1, n].


8

Python 3, 56 байт

lambda n:[i for i in range(1,n)if round(n**(1/i))**i==n]

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

Безпосередня перевірка того, що корінь є цілою кількістю, є складним, оскільки плаваючі точки дають такі речі 64**(1/3) == 3.9999999999999996. Округлюючи його до цілого числа, давайте перевіримо, чи повертається потужність до початкового значення. Завдяки ypercube за те, що він запропонував це, заощаджуючи 1 байт.

feersum має коротше і розумніше рішення . Ви всі повинні дійсно підтримувати це.


Чи не було б точним, якби ви перевірили round(n**(1/i),0)**i==n?
ypercubeᵀᴹ

@ypercube Хороший дзвінок, а 0також точність за замовчуванням для туру, це економить байт.
xnor

7

Pyth, 11 10 12 байт

fsmqQ^dTSQSQ

Перевіряє всі можливі комбінації повноважень. Дуже повільно.


5

CJam, 23 байти

rimF{1=:E){E\d%!},}%:&p

Це працює, приймаючи основну факторизацію n і обчислюючи перетин дільників усіх експонентів.

Це трохи довше мого іншого рішення , але я очікую, що він буде працювати (і закінчується миттєво) для всіх цілих чисел від 2 до 2 63 - 1 .

Спробуйте його в Інтернеті інтерпретаторі CJam .

Як це працює

ri                       Read an integer from STDIN.
  mF                     Push its prime factorization.
    {             }%     For each [prime exponent]:
     1=:E                  Retrieve the exponent and save it in E.
         ){     },         Filter; for each I in [0 ... E]:
           E\d%              Compute E % Double(I).
                             (Casting to Double is required to divide by 0.)
               !             Push the logical NOT of the modulus.
                           Keep I if the result is truhty, i.e., if I divides E.
                    :&   Intersect all resulting arrays of integers.
                      p  Print the resulting array.

5

APL, 17 байт

(X=⌊X←N*÷⍳N)/⍳N←⎕

Моя перша програма APL; Пропозиції з гольфу цінуються.

              N←⎕  ⍝ Store input into N
             ⍳     ⍝ The list [1 2 ... N]
            /      ⍝ Select the elements A for which
      N*÷⍳N)       ⍝ N^(1/A)
(X=⌊X←             ⍝ equals its floor (that is, is an integer)

Будь ласка, додайте псевдокод / ​​пояснення. Але +1 (не можу зараз проголосувати) за використання APL (- тимчасово , ще до того, як було круто ) :-)
mınxomaτ

Також +1, велика любов до APL. Кінцевий автомобіль для гольфу.

На основі псевдокоду це навряд чи вдасться (якщо APL не проведе приблизний тест рівності з плаваючою комою). Наприклад, з pow(pow(7,3),1./3))я потрапляю 6.99999999999999в C або Python. Це тому, що точність втрачається при обчисленні 1 / А.
feersum

@feersum Я не знаю про офлайн-перекладачів, але всі повноваження 3 працюють правильно на tryapl.org.
lirtosiast

@ThomasKwa Здається, що справді використовується тест на приблизну рівність. dyalog.com/uploads/documents/Papers/tolerant_comparison/…
feersum

3

JavaScript (ES5), 73 байт 81 байт 79 байт 75 байт

for(n=+prompt(),p=Math.pow,i=0;i++<n;)p(.5+p(n,1/i)|0,i)==n&&console.log(i)

Перевіряє, чи дорівнює найближча ціла потужність можливого кореня n. ~~(.5+...)еквівалентний Math.round(...)виразам у цілому діапазоні (від 0 до 2 ^ 31 - 1).

Редагувати: Використовували ледачу &&логіку замість того, ifщоб поголити 2 байти та додали запит на введення, оскільки питання додало уточнення. Раніше передбачалося, що вхід зберігається вn .

Редагувати 2: Змінено, ~~(.5+...)щоб .5+...|0зберегти два байти, уникаючи групування.

Правка 3: Видалено, varщоб зберегти 4 байти. У не строгому режимі це прийнятно.


Ви можете голити пару байтів, використовуючи жонглюючі вирази: for (var p = Math.pow, i = 1; i ++ <n; p (~~ (.5 + p (n, 1 / i)), i) == n && console .log (i));

@Alhadis дякую за ваш внесок, я трохи попрацюю
Патрік Робертс

@PatrickRoberts Ви можете втиснути p=Math.powв швидке збереження 1 байт
Downgoat

@vihan, це буде недійсною декларацією, оскільки varце потрібно
Патрік Робертс

Якщо ви не мали на увазі forзамість prompt..
Патрік Робертс

3

Брахілог , 8 байт

≥^↙.?≥ℕ≜

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

Приймає вхід через свою вхідну змінну і генерує кожну потужність через свою вихідну змінну, у порядку зростання у міру необхідності, на відміну від старого рішення, ≥ℕ≜^↙.?∧яке так само має таку ж довжину.

≥           Some number which is less than or equal to
            the input,
 ^          when raised to the power of
  ↙.        the output,
    ?       is the input.
       ≜    Label
            the output
      ℕ     as a whole number
     ≥      which is less than or equal to
    ?       the input.

У мене немає жодного суворого обґрунтування твердження, що кожен показник не більший за вхід, але для того, щоб програма фактично завершилася, її потрібно обмежити.

ḋḅlᵛf- це набагато коротше (негенераторне) рішення для всіх наведених тестових випадків, але воно виходить з ладу, якщо вхід не є силою продукту різних прайменів. (Подумайте про це, оскільки всі тестові випадки є повноваженнями праймерів, ḋlfтакож працює ...) Найкраще, що я придумав, щоб врятувати ідею ḋḅlᵐḋˢ⊇ᵛ×f, виходить у 10 байт.




2

JavaScript ES7, 66 байт

Скористається експериментальним розумінням масиву. Працює лише на Firefox.

n=>[for(i of Array(n).keys(m=Math.pow))if(m(0|.5+m(n,1/i),i)==n)i]

Можливий гольф. Я, мабуть, спробую трохи прикосити вирази і, сподіваюся, знайду альтернативу довгимArray(n).keys() синтаксису.

Може бути коротшим, але JavaScript має жахливу точність з плаваючою точкою.


Ах, дізналися щось нове ... круто.
Патрік Робертс

2

CJam, 20 байт

ri_,1df+\1$fmL9fmO&p

Для введення n цей обчислює журнал b n для всіх b, менший або рівний n, і зберігає цілі числа результатів.

Це має працювати для всіх цілих чисел від 2 до 9,999 . Час виконання приблизно O (n) .

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

ri                   e# Read an integer N from STDIN.
  _,                 e# Copy N and transform it into [0 ... N-1].
    1df+             e# Add 1.0 to each, resulting in [1.0 ... Nd].
        \1$          e# Swap the array with N and copy the array.
           fmL       e# Mapped log base N: N [1.0 ... Nd] -> [log1(N) ... logN(N)]
              9fmO   e# Round each logarithm to 9 decimals.
                  &  e# Intersect this array with [1.0 ... Nd].
                   p e# Print the result.

15,625 є єдиним входом, на якому він не працює, або це єдиний, який не вдався до тестування?
бета-розпад

Існують, безумовно, інші. Насправді я щойно з’ясував, що він провалився і для 4913 , що зробило мою попередню редакцію недійсною.
Денніс

2

Рубі, 50

->n{(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||p(i)}}

Друкує на екран.

Рубі, 57

->n{a=[]
(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||a<<i}
a}

Повертає масив.

У тестовій програмі:

f=->n{(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||puts(i)}}

g=->n{a=[]
(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||a<<i}
a}

f.call(4096)
puts g.call(4096)

Обчислює кожен корінь і випробовує їх за модулем 1, щоб побачити, чи залишилось менше 1e-8. Через обмежену точність деякі дійсні цілі корені обчислюються у формі 0,9999 .., отже, необхідність додати до них 1e-9.

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



2

DC, 104 байти

Вхід береться з терміналу, вихід друкується, а також на стеці.

Тому що для цього використовується? оператора, вам потрібно використовувати dc -e "<solution>"абоdc <file with solution in it> .

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

1sb?sn[lesi]ss[lble1+dse^dln=sln>c]sc[liSflq1+sq]sm[Lfplq1-dsq0<p]dsp[lb1+sb0si0selcxli0!=mlbln!=h]dshxx

речі для початківців

1sb           Store 1 in register b
?sn           Store user input in register n
[lesi]ss      A macro to copy the e to the i register, stored in the s register

Макрос, щоб підняти базу на всі сили, поки результат не буде більшим за цільовий або не дорівнює цілі

[lble1+dse^dln=sln>c]sc
[lb                 ]   load our base num (register b)
[  le               ]   load our exponent (register e)
[    1+dse          ]   add 1 to the exponent, copy and store in the e register
[         ^d        ]   raise the base to the exponent and copy it
[           ln=s    ]   load the user input, if that is equal to the power result run the macro in register s
[               ln>c]   load the user input, if it's greater than the power result run the macro in register c (this one)
[                   ]sc save this macro in register c

Макрос для збереження дійсного значення експонента, знайденого з вищевказаних макросів експонента, в інший стек

[liSflq1+sq]sm
[liSf      ]     copy the i register to the top of the stack in register f
[    lq1+sq]     add 1 to the q register
[          ]sm   save this macro in the m register

Макрос для запуску 2x вище макросу (макрос c) через усі бази від 2 до нашого цільового числа

[lb1+sb0si0selcxli0!=mlbln!=h]dsh
[lb1+sb                      ]     add 1 to the base number
[      0si0se                ]     reset the i and e registers (previously found value and exponent
[            lcx             ]     load and run the c macro
[               li0!=m       ]     load the result of the c macro and if it's not 0, run m to save it to the f stack
[                     lbln!=h]     if our base number is not equal to our target number, run macro h (this macro)
[                            ]dsh  duplicate this macro and save one copy, so that one is left on the stack to run later

Макрос для друку значень із f стека

[Lfplq1-dsq0<p]dsp
[Lfp          ]      load the top value from the f register and print it
[   lq1-dsq   ]      load the q register and subtract one from it and save it
[          0<p]      if the q register is greater than 0, run macro p (this macro) again
[             ]dsp   duplicate this macro and save one copy, so that one is left on the stack to run later

xx finally run the two macros on the stack (h and then p)


1
Я б здогадався, що не багато людей знають DC. Відповіді на нові запитання (особливо це одна з найбільш ранніх відповідей) допоможе привернути більше уваги. Ви також можете спробувати використовувати посилання TIO для своїх відповідей, оскільки це дуже популярно. Ось DC на TIO .
mbomb007

Спасибі! Я обов'язково використаю це для відповідей, які йдуть вперед!
FlexEast



0

Japt , 10 байт

õ
f@mpX øN

Спробуй це

õ            :Implicit input of integer U
õ            :Range [1,U]
f@mpX øN     :Reassign to U
f            :Filter
 @           :By passing each X through the following function
  m          :  Map U
   pX        :    Raise to the power of X
      ø      :  Contains
       N     :    Any element of the (singelton) array of inputs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.