Целые числа


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
Зак Гейтс,

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

Python 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 / A.
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 (я));

@ 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 это вычисляет log 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.

Является 15625 единственным входом , на котором он выходит из строя или это единственный , который потерпел неудачу , что вы тестировали?
Бета -

Есть определенно другие. На самом деле, я только что узнал , что он не за 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>.

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

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 выше макро (макро) с помощью всех баз от 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

Macro для печати значения из стека ф

[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.