Восстановить власть от главной власти


16

Кажется, что многие хотели бы иметь это, так что теперь это продолжение этого вызова !

Определение : простая степень - это натуральное число, которое может быть выражено в виде p n где p - простое число, а n - натуральное число.

Задача : Учитывая простую степень p n > 1, вернуть степень n.

Тестовые случаи :

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

Подсчет очков : это . Кратчайший ответ в байтах побеждает.


2
Примечание . Эта задача может быть тривиальной для некоторых языков игры в гольф, но она не так тривиальна для некоторых основных языков, а также для языка июня 2018 года, QBasic.
Эрик Outgolfer

Можем ли мы вывести True вместо 1? В качестве альтернативы плавать вместо целых?
Джо Кинг

1
@ Шучу, да, да.
Дрянная Монахиня

@EriktheOutgolfer Вызов принят : 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 ( как разрешено OP ). Рекурсивная функция, которая многократно находит наименьший коэффициент и затем снова вызывает функцию со следующей наименьшей степенью, пока не достигнет 1. Это расширение моего ответа на предыдущий вопрос.





3

постоянный ток , 50 41 байт

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

Попробуйте онлайн!

Принимает ввод с вершины стека (в TIO поместите ввод в заголовок, чтобы загрузить его в стек перед выполнением). Выходы в стандартный вывод.

объяснение

Используемые регистры:

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

Stax ,43 байтов

|f%

Запустите и отладьте его

Длина простой факторизации.


5
Аааа ... ты разбиваешь перечеркнутую 4 - это все еще обычная 4; ( мем.; P (она все равно стареет ... Думаю, что ты молодец)
Кевин Круйссен

1
Yay, злоупотребление MathJax!Но не забудьте поставить крестик перед фактическим счетом, в противном случае фрагмент списка лидеров не сможет его распознать.
user202729



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,}(функция) будет действительным.
Деннис

@ Денис Да, я думаю, что запутался в этом. Я также посмотрел на разрешенное stardard io раньше и подумал о том, что я должен на самом деле представить ... Я на самом деле хотел задать вопрос о мета об этом. Но вы это подтвердили, так что спасибо!
Chromium

1

QBasic, 51 байт

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

Использует тот же алгоритм, что и решение «Восстановить простое», чтобы найти базу, затем использует правила логарифмов для получения показателя степени:Lограмм(пN)знак равноNLограмм(п),




0

Perl 6 , 36 байт

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

Ищет первый фактор (2..*).first: $_%%*, затем вычисляет приблизительное значение (журналы не получат его точно) и округляет его.

Попробуйте онлайн!





Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.