Восстановите премьер от главной власти

13

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

Задача : При заданной простой степени p n > 1 вернуть простое число p.

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

input output
9     3
16    2
343   7
2687  2687
59049 3

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

Дрянная Монахиня
источник
1
Может nбыть 1?
user202729
@ user202729: в 4-м тесте n = 1.
Emigna
15
Возможно, было бы сложнее получить часть власти вместо основной части. На самом деле, это просто «Получить самый низкий коэффициент, который не равен 1»
Джо Кинг,

Ответы:

7

Java 8, 46 39 37 байт

n->{int r=1;for(;n%++r>0;);return r;}

-7 байтов косвенно благодаря @Tsathoggua .
-2 байта благодаря JoKing

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

Объяснение:

n->{               // Method with integer as both parameter and return-type
  int r=1;         //  Start the result-integer `r` at 1
  for(;n%++r>0;);  //  Increase `r` by 1 before every iteration with `++r`
                   //  and loop until `n` is divisible by `r`
  return r;}       //  After the loop, return `r` as result
Кевин Круйссен
источник
После ответа Луиса Мендо в python3 , можно ли написать, n->{for(int i=1;++i<=n;)if(n%i<1)return i;}чтобы получить 43 символа? (Я не говорю на Java.)
Цатоггуа
@ Tsathoggua Как у вас сейчас нет, так как методы Java всегда должны иметь возврат. n->{for(int i=1;++i<=n;)if(n%i<1)return i;return n;}будет работать, но, к сожалению, дольше. Однако Java может иметь один возврат в бесконечных циклах, что действительно экономит байты, так что спасибо! n->{for(int i=1;;)if(n%++i<1)return i;}, Поскольку в конечном итоге iстанет n(как в случае с тестом 2687), и n%n==0, i<=nв этом случае, не требуется.
Кевин Круйссен
1
Как насчет 37 байтов . Я не достаточно знаком с Java, чтобы понять, можно ли еще играть в гольф
Джо Кинг,
@JoKing I don't see anything to golf further, so thanks for the -2.
Kevin Cruijssen
5

Python 3, 36 35 bytes

-1 byte thanks to mathmandan

f=lambda n,x=2:n%x and f(n,x+1)or x

Try it online!

Recursive function that finds the first factor larger than 1

Jo King
источник
1
Nice. You can (usually) save a byte if you replace if/else with and/or. Like, f=lambda n,x=2:n%x and f(n,x+1)or x.
mathmandan
4

MATL, 4 3 bytes

Yfu

Try it online!

Explanation:

       % Implicit input:      [59049]
Yf     % Prime factorization: [3 3 3 3 3 3 3 3 3 3]
  u    % Unique elements:     [3]
       % Implicit output
Стьюи Гриффин
источник
1
Очень хорошее улучшение! Я бы снова проголосовал :-)
Луис Мендо
4

Пробел , 80 61 60 байт

[S S T  T   N
_Push_-1][S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_number][N
S S N
_Create_Label_LOOP][S S S T N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][S S S N
_Push_0][T  T   T   _Retrieve][S N
T   _Swap][T    S T T   _Modulo][N
T   T   N
_If_0_Jump_to_Label_LOOP][S S T T   N
_Push_-1][T S S N
_Multiply][T    N
S T _Print_as_number]

-20 байт благодаря @JoKing .

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

Попробуйте онлайн (только с пробелами, вкладками и новыми строками).

Объяснение в псевдокоде:

Integer n = STDIN as integer
Integer i = -1
Start LOOP:
  i = i - 1
  if(n modulo-i is negative)
    Go to next iteration of LOOP
  else
    i = i * -1
    Print i
    Exit with error: No exit defined

Пример выполнения: input = 9

Command   Explanation                    Stack        Heap     STDIN    STDOUT    STDERR

SSTTN     Push -1                        [-1]
SSSN      Push 0                         [-1,0]
TNTT      Read STDIN as integer          [-1]         {0:9}    9
NSSN      Create Label_LOOP              [-1]         {0:9}
 SSSTN    Push 1                         [-1,1]       {0:9}
 TSST     Subtract top two (-1-1)        [-2]         {0:9}
 SNS      Duplicate top (-2)             [-2,-2]      {0:9}
 SSSN     Push 0                         [-2,-2,0]    {0:9}
 TTT      Retrieve                       [-2,-2,9]    {0:9}
 SNT      Swap top two                   [-2,9,-2]    {0:9}
 TSTT     Modulo top two (9%-2)          [-2,-1]      {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-2]         {0:9}

 SSTTN    Push -1                        [-2,-1]      {0:9}
 TSST     Subtract top two (-2-1)        [-3]         {0:9}
 SNS      Duplicate top (-2)             [-3,-3]      {0:9}
 SSSN     Push 0                         [-3,-3,0]    {0:9}
 TTT      Retrieve                       [-3,-3,9]    {0:9}
 SNT      Swap top two                   [-3,9,-3]    {0:9}
 TSTT     Modulo top two (9%-3)          [-3,0]       {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-3]         {0:9}
 SSTTN    Push -1                        [-3,-1]      {0:9}
 TSSN     Multiply top two (-3*-1)       [3]          {0:9}
 TNST     Print as integer               []           {0:9}             3
                                                                                  error

Программа останавливается с ошибкой: выход не найден.

Кевин Круйссен
источник
1
Вам нужен i == nчек? n%nбыло бы 0 в любом случае
Джо Кинг
@ JoKing А, конечно. Спасибо, 19 байтов сохранены прямо там. :)
Кевин Круйссен
Не могли бы вы зацикливаться, если нет, n%iи потом вызывать печать?
Джо Кинг,
1
@ Шучу, я уверен, что нет. В пробелах на самом деле нет петель, просто есть переходы к меткам. У меня есть только три варианта: 1. безоговорочно перейти на определенный ярлык; 2. перейти к определенной метке, если вершина стека равна 0; 3. перейти к определенной метке, если вершина стека отрицательна. К сожалению, для продолжения цикла нет «перехода к метке, если она положительна». Я мог бы сделать это путем умножения на -1, прежде чем проверять на отрицательное значение, но я сомневаюсь, что это будет короче.
Кевин Круйссен
1
Пытался сделать это с отрицательным модулем и в итоге получил <s> 62 </ s> 60 байтов (yay). Оказывается, вы не можете хранить на отрицательных адресах кучи (хотя 0 сохранили пару байтов)
Джо Кинг,
4

Октава , 16 байт

@(x)factor(x)(1)

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

Объяснение:

@(x)              % Anonymous function taking x as input
    factor(x)     % Prime factorization
             (1)  % Get the first element

Или:

@(x)max(factor(x))  % the makeup of makeup artists
Стьюи Гриффин
источник
1
+1 за максимальный фактор
Brain Guider
2

Желе , 3 байта

ÆfḢ

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

ÆfṪ, ÆfXТакже может быть серьезно конкурировать функции.
ÆfQможет быть серьезно конкурирующей полной программой.

Эрик Outgolfer
источник
2

Forth (gforth) , 34 байта

: f 1 begin 1+ 2dup mod 0= until ;

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

объяснение

  1. Итерации целых чисел, начиная с 2
  2. Остановитесь и вернитесь, когда найдете тот, который делит n без остатка

Код Объяснение

: f               \ Define a new word
  1               \ place a 1 on the stack (to use as a counter/index)
  begin           \ start indefinite loop
    1+ 2dup       \ increment counter and duplicate counter and prime power
    mod           \ calculate power % index
  0= until        \ end the loop if modulus is 0 (no remainder)
;                 \ end word definition
reffu
источник
1

Нейм , 1 байт

𝐔

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

Okx
источник
U + 1D414 - это один символ, но в UTF-8 и UTF-16 он представлен 4 байтами.
Рууд Хелдерман
1
@RuudHelderman Правильно, но этого нет ни в UTF-8, ни в UTF-16.
Okx
1
@RuudHelderman Вы можете увидеть кодовую страницу Neim .
JungHwan Мин
@JungHwanMin Спасибо; Просматривая более ранние представления Окса о Neim, я заметил, что моя слегка неосведомленная реакция была не первой. Умная особенность, но далеко не очевидная; требует объяснения (как сделано здесь ). Цитирование кода тега «Информация о гольфе» : «Если вопрос не определен для оценки по символам, он оценивается по байтам. Если в нем не указана кодировка символов, используемая для оценки, ответы, в которых используются кодовые точки Unicode за пределами от 0 до 255, должны указать используемую кодировку. "
Рууд Хелдерман
@RuudHelderman для мета-консенсуса , если в ответе не указана кодировка, по умолчанию используется кодировка языка по умолчанию. Если этого не существует, то это UTF-8. В этом случае Neim имеет определенную кодировку по умолчанию, поэтому предполагается, что она является кодировкой ответа, и ответчик не должен объяснять как таковой.
JungHwan Мин
1

Mathematica, 17 байт

Divisors[#][[2]]&

Второй наименьший делитель.

для Моники
источник
0

PowerShell , 31 байт

param($a)(2..$a|?{!($a%$_)})[0]

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

Создает диапазон от 2ввода до ввода $a, извлекает эти элементы where( ?), и операция по модулю %приводит к нулю !(...)(т. Е. К тем, которые являются делителями $a), а затем принимает наименьший [0]из них. Это осталось на конвейере, вывод неявный.

AdmBorkBork
источник
0

Perl 6 , 22 байта

{grep($_%%*,2..$_)[0]}

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

Блок анонимного кода, который фильтрует факторы диапазона от 2 до ввода и возвращает первый. Я попытался использовать, ^$чтобы сохранить 2 байта, но это не сработало в случае, когда ввод был простым.

Джо Кинг
источник
0

Visual Basic .NET (.NET Framework v4.5), 123 71 байт

-52 байта благодаря @Jo King

Function A(n)
For i=n To 2 Step-1
A=If(n Mod i=0,i,A)
Next
End Function

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

Ungolfed:

Function A(input As Long) As Long
    For i = input To 2 Step -1
        A = If (input Mod i = 0, i, A)
    Next
End Function

Объяснение:

В iпоисках петли в обратном направлении от первого номера, и находит все числа , которые делят его поровну. Поскольку мы идем в обратном направлении, самые маленькие хранятся вA .

VB дает вам свободную переменную, которая соответствует вашему имени функции (в моем случае, A). В конце выполнения функции возвращается значение в этой переменной (за исключением явного Returnвыражения.

Брайан Дж
источник
1
Вам не нужна первичная проверка вообще. Наименьший множитель числа (кроме 1) гарантированно будет простым числом, в противном случае был бы меньший фактор
Джо Кинг,
@ JoKing D'oh! Конечно, не могу поверить, что я пропустил это. Благодарность!
Брайан Дж
0

Python 3 , 47 45 44 байта

Вдохновленный ответом Кевина Круйссена на Java .

2 3 байта удалены благодаря Джо Кингу .

lambda n:[i+1for i in range(n)if n%-~i<1][1]

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

Луис Мендо
источник
1
У вас есть дополнительный пробел перед if, и условие может быть<1
Джо Кинг
1
Вы можете сохранить один байт , выполнив range(n)и увеличивая его iна месте
Джо Кинг,