Відновити розквіт від першої сили


13

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

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

Тести :

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

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


1
Може nбути 1?
користувач202729

@ user202729: У 4-му тестовому випадку n = 1.
Емінья

15
Можливо, було б складніше отримати сильну частину замість основної частини. Це так "Це найнижчий коефіцієнт, який не дорівнює 1"
Jo King

Відповіді:


13

Мова програмування Шекспіра , 209 207 байт

T.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen tothy!Page:You cat!Scene V:.Page:You be the sum ofyou a cat!Be the product ofthe quotient betweenI you you worse I?If soLet usScene V.Open heart

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

(I/you)*you<Iкоротше, ніж I%you>0у SPL.


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 байт . Я недостатньо знайомий з Явою, щоб побачити, чи можна більше грати в гольф
Джо Кінг

@JoKing Я більше не бачу нічого в гольфі, тому дякую за -2.
Кевін Кройсейсен

5

Python 3 , 36 35 байт

-1 байт завдяки математиці

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

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

Рекурсивна функція, яка знаходить перший фактор більшим за 1


1
Приємно. Ви можете (як правило) зберегти байт, якщо замінити if/elseна and/or. Мовляв, f=lambda n,x=2:n%x and f(n,x+1)or x.
mathmandan


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
Jo King

@JoKing Ах, звичайно. Дякую, тут збережено 19 байт. :)
Kevin Cruijssen

Не могли б ви зробити цикл, якщо ні, n%iі зателефонувати після цього?
Джо Кінг

1
@JoKing Я майже впевнений, що ні. У Whitespace насправді немає циклів, він просто має стрибки до міток. Є лише три варіанти: 1. беззастережно перейти до певної мітки; 2. перейти до певної мітки, якщо верхня частина стека дорівнює 0; 3. перейти до певної мітки, якщо верхня частина стека від’ємна. На жаль, не існує "стрибка на мітку, якщо позитивна", щоб продовжити цикл. Я міг би досягти цього, помноживши на -1, перш ніж перевірити на мінус, але сумніваюся, що це буде коротше.
Кевін Кройсейсен

1
Намагався зробити це з негативним модулем і закінчився <s> 62 </s> 60 байтами (так). Виявляється, ви не можете зберігати за негативними куповими адресами (хоча 0 зберегли пару байтів)
Jo King






2

Четвертий (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




1

U + 1D414 - один символ, але в UTF-8 та UTF-16 це представлено 4 байтами.
Рууд Гельдерман

1
@RuudHelderman Правильно, але це не в UTF-8 і UTF-16.
Оккс

1
@RuudHelderman Можливо, ви захочете побачити кодову сторінку Neim .
JungHwan Min

@JungHwanMin Спасибі; переглянувши попередні повідомлення Нейма, я помітив, що моя незначна реакція була не першою. Розумна особливість, але далеко не очевидна; вимагає пояснення (як це зроблено тут ). Цитуючи інформацію про тег коду-гольфу : "Якщо не вказано питання, набране символами, воно оцінюється байтами. Якщо в ньому не вказано кодування символів, яке слід використовувати для підрахунку балів, у відповідях, які використовують точки коду Unicode за межами від 0 до 255, слід вказати використане кодування. "
Рууд Гельдерман

@RuudHelderman за мета-консенсусом , якщо відповідь не вказує кодування, вона за замовчуванням кодує мову за замовчуванням. Якщо цього не існує, це UTF-8. У цьому випадку Нейм має визначене кодування за замовчуванням, тому передбачається кодування відповіді, без того, щоб відповідач мав пояснення як такого.
JungHwan Min






0

PowerShell , 31 байт

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

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

Побудує діапазон від 2входу $a, витягує ці елементи where( ?), операція по модулю %призводить до нуля !(...)(тобто тих, що є дільниками $a), а потім бере найменший [0]. Що залишилося на конвеєрі, вихід неявний.


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

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

Безголівки:

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
Jo King

1
Ви можете зберегти один байт , виконуючи range(n)та збільшуючи його iна місці
Jo King




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