Відновіть потужність від основної потужності


16

Здається, що багато людей хотіли б це мати, тож тепер це продовження цього виклику !

Визначення : проста сила - це натуральне число, яке може бути виражене у вигляді p n, де p - просте, а n - натуральне число.

Завдання : Давши просту потужність p n > 1, поверніть потужність n.

Тести :

input output
9     2
16    4
343   3
2687  1
59049 10

Рахунок : Це . Найкоротша відповідь у байтах виграє.


2
Примітка . Ця проблема може бути тривіальною для деяких мов для гольфу, але це не так тривіально для деяких основних мов, як і для мови червня 2018 року, QBasic.
Ерік Аутгольфер

Чи можемо ми вивести True замість 1? Крім того, плавати замість ints?
Джо Кінг

1
@JoKing так, так.
Leaky Nun

@EriktheOutgolfer Challenge прийнято : D
DLosc

Відповіді:



5

Python 3 , 49 байт

f=lambda n,x=2:n%x and f(n,x+1)or n/x<2or-~f(n/x)

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

Виходи Trueзамість 1 ( як дозволено ОП ). Рекурсивна функція, яка неодноразово знаходить найнижчий коефіцієнт, а потім знову викликає функцію з наступною найнижчою потужністю, поки вона не досягне 1. Це розширення моєї відповіді на попереднє питання.





3

постійного струму , 50 41 байт

1si[dli1+dsi%0<X]dsXx[dli/dli<Y]sYdli<Yzp

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

Бере вхід зверху стека (у TIO, покладіть вхід у заголовок, щоб завантажити його до стеку перед виконанням). Виходи до stdout.

Пояснення

Використовувані регістри:

i: поточний дільник проби, поки Xпрацює. Пізніше дільник, який ми знайшли.

X: макрос dli1+dsi%0<X, який має ефект "приріст i, потім перевірте модуль зі значенням на стеці (яке буде початковим введенням). Якщо воно не дорівнює нулю, повторіть".

Y: макрос dli/dli<Y, який має ефект "Додати в стек копію поточної вершини стека, розділену на i. Повторюйте, поки не iбуде досягнуто."

Повна програма:

1si                 Initialize i
[dli1+dsi%0<X]dsXx  Define and run X
[dli/dli<Y]sY       Define Y
dli<Y               Run Y, but only if needed (if the input wasn't just i)
z                   The stack is i^n, i^(n-1), ... ,i, so print the stack depth

Я знайшов набагато краще рішення! Редагування зараз ...
Софія Лехнер

3

обличчя , 86 байт

(%d@)\$*,c'$,io>Av"[""mN*c?*m1*mp*m%*s1"$pN1p:~+p1p%%Np?%~:=/NNp+?1?-%N1?%=p%'$i?w1'%>

Ура, довше Java!

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

Мені особливо подобається хитрість використання зворотного значення sscanf. Зазвичай повертане значення буде відкинуто, але тут воно завжди буде 1, оскільки ми завжди читаємо одне число як вхідне. Ми можемо скористатися цим, призначивши його повернене значення змінній 1, зберігаючи 2 байти, які в іншому випадку потрібно було б призначити 1явно 1.

(%d@)

\$*,c'$,io>  ( setup - assign $ to "%d", * to a number, o to stdout )
Av"[""mN*    ( set " to input and allocate space for N for int conversion )
c?*          ( calloc ?, starting it at zero - this will be the output )
m1*          ( allocate variable "1", which gets the value 1 eventually )
mp*m%*       ( p is the prime, % will be used to store N mod p )

s1"$pN       ( scan " into N with $ as format; also assigns 1 to 1 )

1p:~         ( begin loop, starting p at 1 )
  +p1p       ( increment p )
  %%Np       ( set % to N mod p )
?%~          ( repeat if the result is nonzero, so that we reach the factor )

:=           ( another loop to repeatedly divide N by p )
  /NNp       ( divide N by p in-place )
  +?1?       ( increment the counter )
  -%N1       ( reuse % as a temp variable to store N-1 )
?%=          ( repeat while N-1 is not 0 -- i.e. break when N = 1 )

p%'$i?       ( sprintf ? into ', reusing the input format string )
w1'%>        ( write to stdout )





2

Стакс ,43 байт

|f%

Запустіть і налагоджуйте його

Тривалість основної факторизації.


5
Ааа .. ти розбиваєш перекреслені 4 все ще регулярно 4; ( пам.; P (все одно
старіло,

1
Так, зловживання MathJax!Але не забудьте поставити хрест перед фактичним рахунком otherwiae, фрагмент таблиць лідерів може не змогти його розпізнати.
користувач202729



2

Пробіл, 141 байт

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_number][T    T   T   _Retrieve][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP_1][S S S T   N
_Push_1][T  S S S _Add][S N
S _Duplicate][S T   S S T   S N
_Copy_2nd_input][S N
T   _Swap_top_two][T    S T T   _Modulo][N
T   S S N
_If_0_Jump_to_Label_BREAK_1][N
S N
N
_Jump_to_Label_LOOP_1][N
S S S N
_Create_Label_BREAK_1][S S S N
_Push_0][S T    S S T   S N
_Copy_2nd_input][N
S S T   N
_Create_Label_LOOP_2][S N
S _Duplicate_input][S S S T N
_Push_1][T  S S T   _Subtract][N
T   S S S N
_If_0_Jump_to_Label_BREAK_2][S N
T   _Swap_top_two][S S S T  N
_Push_1][T  S S S _Add][S N
T   _Swap_top_two][S T  S S T   S N
Copy_2nd_factor][T  S T S _Integer_divide][N
S N
T   N
_Jump_to_Label_LOOP_2][N
S S S S N
_Create_Label_BREAK_2][S N
N
_Discard_top][T N
S T _Print_as_number]

Букви S(пробіл), T(вкладка) та N(новий рядок) додаються лише як підкреслення.
[..._some_action]додано лише як пояснення.

Спробуйте в Інтернеті (лише із необробленими пробілами, вкладками та новими рядками).

Пояснення в псевдокоді:

Integer n = STDIN as input
Integer f = 1
Start LOOP_1:
  f = f + 1
  if(n modulo-f == 0)
    Call function BREAK_1
  Go to next iteration of LOOP_1

function BREAK_1:
  Integer r = 0
  Start LOOP_2:
    if(n == 1)
      Call function BREAK_2
    r = r + 1
    n = n integer-divided by f
    Go to next iteration of LOOP_2

function BREAK_2:
  Print r as number to STDOUT
  Program stops with an error: Exit not defined

Приклад виконання: input = 9

Command    Explanation                    Stack           Heap    STDIN   STDOUT   STDERR

SSSN       Push 0                         [0]
SNS        Duplicate top (0)              [0,0]
TNTT       Read STDIN as number           [0]             {0:9}   9
TTT        Retrieve                       [9]             {0:9}
SSSTN      Push 1                         [9,1]           {0:9}
NSSN       Create Label_LOOP_1            [9,1]           {0:9}
 SSSTN     Push 1                         [9,1,1]         {0:9}
 TSSS      Add top two (1+1)              [9,2]           {0:9}
 SNS       Duplicate top (2)              [9,2,2]         {0:9}
 STSSTSN   Copy 2nd from top              [9,2,2,9]       {0:9}
 SNT       Swap top two                   [9,2,9,2]       {0:9}
 TSTT      Modulo top two (9%2)           [9,2,1]         {0:9}
 NTSSN     If 0: Jump to Label_BREAK_1    [9,2]           {0:9}
 NSNN      Jump to Label_LOOP_1           [9,2]           {0:9}

 SSSTN     Push 1                         [9,2,1]         {0:9}
 TSSS      Add top two (2+1)              [9,3]           {0:9}
 SNS       Duplicate top (3)              [9,3,3]         {0:9}
 STSSTSN   Copy 2nd                       [9,3,3,9]       {0:9}
 SNT       Swap top two                   [9,3,9,3]       {0:9}
 TSTT      Modulo top two (9%3)           [9,3,0]         {0:9}
 NTSSN     If 0: Jump to Label_BREAK_1    [9,3]           {0:9}
NSSSN      Create Label_BREAK_1           [9,3]           {0:9}
SSSN       Push 0                         [9,3,0]         {0:9}
STSSTSN    Copy 2nd from top              [9,3,0,9]       {0:9}
NSSTN      Create Label_LOOP_2            [9,3,0,9]       {0:9}
 SNS       Duplicate top (9)              [9,3,0,9,9]     {0:9}
 SSSTN     Push 1                         [9,3,0,9,9,1]   {0:9}
 TSST      Subtract top two (9-1)         [9,3,0,9,8]     {0:9}
 NTSSSN    If 0: Jump to Label_BREAK_2    [9,3,0,9]       {0:9}
 SNT       Swap top two                   [9,3,9,0]       {0:9}
 SSSTN     Push 1                         [9,3,9,0,1]     {0:9}
 TSSS      Add top two (0+1)              [9,3,9,1]       {0:9}
 SNT       Swap top two                   [9,3,1,9]       {0:9}
 STSSTSN   Copy 2nd from top              [9,3,1,9,3]     {0:9}
 TSTS      Integer-divide top two (9/3)   [9,3,1,3]       {0:9}
 NSNTN     Jump to Label_LOOP_2           [9,3,1,3]       {0:9}

 SNS       Duplicate top (3)              [9,3,1,3,3]     {0:9}
 SSSTN     Push 1                         [9,3,1,3,3,1]   {0:9}
 TSST      Subtract top two (3-1)         [9,3,1,3,2]     {0:9}
 NTSSSN    If 0: Jump to Label_BREAK_2    [9,3,1,3]       {0:9}
 SNT       Swap top two                   [9,3,3,1]       {0:9}
 SSSTN     Push 1                         [9,3,3,1,1]     {0:9}
 TSSS      Add top two (1+1)              [9,3,3,2]       {0:9}
 SNT       Swap top two                   [9,3,2,3]       {0:9}
 STSSTSN   Copy 2nd from top              [9,3,2,3,3]     {0:9}
 TSTS      Integer-divide top two (3/3)   [9,3,2,1]       {0:9}
 NSNTN     Jump to Label_LOOP_2           [9,3,2,1]       {0:9}

 SNS       Duplicate top (1)              [9,3,2,1,1]     {0:9}
 SSSTN     Push 1                         [9,3,2,1,1,1]   {0:9}
 TSST      Subtract top two (1-1)         [9,3,2,1,0]     {0:9}
 NTSSSN    If 0: Jump to Label_BREAK_2    [9,3,2,1]       {0:9}
NSSSSN     Create Label_BREAK_2           [9,3,2,1]       {0:9}
 SNN       Discard top                    [9,3,2]         {0:9}
 TNST      Print as integer               [9,3]           {0:9}           2
                                                                                    error

Програма зупиняється з помилкою: вихід не знайдено.








1

Cjam, 5 байт

rimf,

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

Пояснення:

ri      take the input and convert it to an int
  mf    factors the input
    ,   take the length of the list

Вбудовані чудово!


Подання повинні бути програмами або функціями за замовчуванням, і ми не вважаємо це функцією . І rimf,повноцінна програма, і {mf,}функція будуть дійсними.
Денніс

@Dennis Так, я думаю, що я з цим розгублений. Я також переглянув дозволене зірчасте іо раніше і задумався про те, що мені насправді потрібно подати ... Я насправді хотів задати питання щодо мета. Але ви це підтвердили, тож спасибі!
Хром

1

QBasic, 51 байт

INPUT x
p=2
WHILE x/p>x\p
p=p+1
WEND
?LOG(x)/LOG(p)

Для пошуку бази використовується той же алгоритм, що і рішення "Відновити основний" , а потім використовує правила логарифмів:лог(pн)=нлог(p).




0

Perl 6 , 36 байт

{round .log/log (2..*).first: $_%%*}

Шукає перший коефіцієнт (2..*).first: $_%%*, потім звідти обчислює приблизне значення (журнали не отримають його точного) і округляє його.

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





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