Найменше додатне число, y-й потужність ділиться на x


15

Завдання

З урахуванням числа xі yякі є , по крайней мере 2, знайти найменше позитивне число якого y-у потужність ділиться x.

Приклад

Враховуючи x=96і y=2, результат повинен бути, 24оскільки 24це найменший позитивний nзадовольняє n^2 is divisible by 96.

Тестові шафи

x  y output
26 2 26
96 2 24
32 3 4
64 9 2
27 3 3

Оцінка балів

Це . Рішення з найнижчою кількістю байтів.

Список літератури



1
Буде чи Xзавжди бути більше , ніж Y?
Фаталізувати

@Fatalize Що це стосується чогось?
Лина монашка

Немає тестового випадку, де Xменше Y, і це може скоротити тривалість деяких відповідей (принаймні моїх), якщо Xзавжди більше, ніж Y. Я хотів би Xвважати, що це може бути більшим чи меншим, але тоді один тестовий випадок для останнього був би чудовим.
Фаталізувати

1
Ваш список посилань - найкраща ілюстрація, яку я бачив щодо смішної свавілля порядку введення OEIS.
Спарр

Відповіді:


7

Брахілог , 19 17 16 15 12 байт

2 байти збережено завдяки @LeakyNun.

:[I:1]*$r=#>

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

Пояснення

               Input = [X, Y]
:[I:1]*        Get a list [X*I, Y] (I being any integer at this point)
       $r=     Get the first integer which is the Yth root of X*I
          #>   This integer must be strictly positive
               This integer is the Output


@LeakyNun Дякую Це буде набагато повільніше.
Фаталізувати

Чому це буде повільніше?
Лина монашка


4
Процитуючи знаменитий Fatalize: "не
Leaky Nun

6

Желе , 6 байт

ÆE÷ĊÆẸ

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

ÆE÷ĊÆẸ  Main link. Arguments: x, y

ÆE      Yield the exponents of x's prime factorization.
  ÷     Divide them by y.
   Ċ    Ceil; round the quotients up to the nearest integer.
    ÆẸ  Return the integer with that exponents in its prime factorization.

1
R*%⁸i0також 6 байт.
Leaky Nun

Я думаю, що це вимагає окремої відповіді.
Денніс

6

JavaScript (ES7), 32 байти

f=(x,y,i=1)=>i**y%x?f(x,y,i+1):i

Ви ніколи не визначалися f. Я думаю, вам потрібно призначити функцію f.
kamoroso94

1
@ kamoroso94 Вибачте, я це вічно роблю.
Ніл


5

Python 3, 60 43 39 байт

Дякуємо @LeakyNun та @ Sp3000 за допомогу

f=lambda x,y,i=1:i**y%x<1or-~f(x,y,i+1)

Функція, яка приймає введення через аргумент і повертає результат.

Як це працює

Функція використовує рекурсію для багаторазової перевірки цілих чисел i, починаючи з i=1, поки тут не i**y%x<1буде знайдено одне, що задовольняє потрібній умові . Це досягається, приймаючи логічну orумову та результат вираження для i+1інкремованого, який тут є -~f(x,y,i+1). Цей вираз безперервно оцінюється так, Falseдоки jне знайдеться задовольняюче значення , в який момент він оцінює Trueі рекурсія припиняється. Оскільки вони відповідно еквівалентні 0і 1в Python, і функція неодноразово додається 1через збільшувальну частину, функція повертається (j-1)*False + True + (j-1)*1 = (j-1)*0 + 1 + (j-1)*1 = 1 + j-1 = j, як потрібно.

Спробуйте це на Ideone


1
def f(x,y,i=1):¶ while i**y%x:i+=1¶ print(i)
Leaky Nun

@LeakyNun Дякую Я просто придумав трохи коротший спосіб зробити це (43 проти 44) з рекурсією.
TheBikingViking

2
39:f=lambda x,y,z=1:z**y%x<1or-~f(x,y,z+1)
Sp3000

@ Sp3000 Чи не повертається ваша функція Trueзамість z?
Leaky Nun

@LeakyNun Ви пропустите -~частину, але так, вона повернеться, Trueякби xбуло 1.
Sp3000

4

Haskell, 31 байт

x#y=[n|n<-[1..],mod(n^y)x<1]!!0

Приклад використання: 96#2-> 24.

Пряма реалізація: спробуйте всі цілі числа n , збережіть ті, які відповідають умові, і виберіть перше.


2
Також 31:x#y=until(\n->mod(n^y)x<1)(+1)0
xnor

4

05AB1E (10 байт)

>GN²m¹ÖiNq

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

  • > Читає перший аргумент, збільшує його і натискає на стек
  • Gвискакує стек ( a) і запускає цикл, який містить решту програми, де Nприймає значення 1, 2, ... a - 1.
  • N²mвиштовхує Nі другий запис з історії вводу, потім вискакує їх обоє і підштовхує перший до сили другого.
  • ¹ висуває перший запис із історії вводу на стек.
  • Öз'являється попередні два записи стека, потім натискає a % b == 0на стек.
  • iвискакує, що зі стека. Якщо це правда, він виконує решту програми; в іншому випадку петля продовжується.
  • Nнатискає Nна стек.
  • q припиняє програму.

Коли програма закінчується, друкується верхнє значення стека.


Будь ласка, опублікуйте пояснення, як працює цей код для тих, хто не знає вашої мови, але в іншому випадку хороша робота та приємне перше повідомлення.
Rohan Jhunjhunwala

Це посилання здається цікавим.
Leaky Nun

2
Дуже приємна перша відповідь.
Емінья

3

MATL , 9 байт

y:w^w\&X<

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

Пояснення

y       % Take x and y implicitly. Push x again
        % STACK: x, y, x
:       % Range from 1 to x
        % STACK: x, y, [1, 2, ..., x]
w       % Swap
        % STACK: x, [1, 2, ..., x], y
^       % Power, element-wise
        % STACK: x, [1^y,  2^y, ..., x^y]
w       % Swap
        % STACK: [1^y, 2^y, ..., x^y], x
\       % Modulo, element-wise
        % STACK: [mod(1^y,x), mod(2^y,x), ..., mod(x^y,x)]
        % A 0 at the k-th entry indicates that x^y is divisible by x. The last entry
        % is guaranteed to be 0
&X<     % Arg min: get (1-based) index of the first minimum (the first zero), say n
        % STACK: n
        % Implicitly display

Стек багато маніпуляцій.
Leaky Nun

1
Так. Я підозрюю, що Джеллі матиме тут велику перевагу, оскільки уникає всіх "копіювання" та "заміни"
Луїс Мендо

Чи не маєш find?
Leaky Nun

@LeakyNun Так, fале це знаходить усі ненульові індекси. Тож треба було б ~f1): negatve, знайти, отримати перший запис
Луїс Мендо

3

Власне , 12 11 байт

Велика подяка Лікі монахині за багато її пропозицій. Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

;)R♀ⁿ♀%0@íu

Оригінальний 12-байтний підхід. Спробуйте в Інтернеті!

1WX│1╖╜ⁿ%WX╜

Ще 12-байтний підхід. Спробуйте в Інтернеті!

w┬i)♀/♂K@♀ⁿπ

13-байтний підхід. Спробуйте в Інтернеті!

k╗2`╜iaⁿ%Y`╓N

Ungolfing:

Перший алгоритм

       Implicitly pushes y, then x.
;      Duplicate x.
)      Rotate duplicate x to bottom of the stack.
R      Range [1, x] (inclusive).
♀ⁿ     Map a**y over the range.
♀%     Map a**y%x over the range.
0@í    new_list.index(0)
u      Increment and print implicitly at the end of the program.

Оригінальний алгоритм

       Implicitly pushes x, then y.
1WX    Pushes a truthy value to be immediately discarded 
         (in future loops, we discard a**y%x)
|      Duplicates entire stack.
         Stack: [y x y x]
1╖     Increment register 0.
╜      Push register 0. Call it a.
ⁿ      Take a to the y-th power.
%      Take a**y mod x.
W      If a**y%x == 0, end loop.
X      Discard the modulus.
╜      Push register 0 as output.

Третій алгоритм

       Implicitly pushes y, then x.
w      Pushes the full prime factorization of x.
┬      Transposes the factorization (separating primes from exponents)
i      Flatten (into two separate lists of primes and exponents).
)      Rotate primes to the bottom of the stack.
♀/     Map divide over the exponents.
♂K     Map ceil() over all of the divided exponents.
@      Swap primes and modified exponents.
♀ⁿ     Map each prime ** each exponent.
π      Product of that list. Print implicitly at the end of the program.

Четвертий алгоритм

     Implicitly pushes x, then y.
k╗   Turns stack [x y] into a list [x, y] and saves to register 0.
2    Pushes 2.
  `    Starts function with a.
  ╜i   Pushes register 0 and flattens. Stack: [x y a]
  a    Inverts the stack. Stack: [a y x]
  ⁿ%   Gets a**y%x.
  Y    Logical negate (if a**y is divisible by x, then 1, else 0)
  `    End function.
╓    Push first (2) values where f(x) is truthy, starting with f(0).
N    As f(0) is always truthy, get the second value.
     Print implicitly at the end of the program.

@LeakyNun Чекаю на одну із ваших пропозицій щодо гольфу: D
Sherlock9,

@LeakyNun Я також буду радий публікувати ці підходи, якщо тільки ви не хочете опублікувати їх самостійно.
Шерлок9,

+1 для посмішки;)
Leaky Nun

2

R, 61 байт , 39 байт , 37 байт , 34 байт

Я все ще новачок в програмуванні на R, і виявляється, це моя перша функція, яку я створюю в R (Так ! ), Тому я вважаю, що ще є можливість для вдосконалення.

function(x,y){for(n in 2:x){if(n^y%%x==0){cat(x,y,n);break}}}

Онлайн тест можна провести тут: RStudio on rollApp .


Основний прогрес:

function(x,y){which.max((1:x)^y%%x==0)}

which.maxпрацює, тому що він повертає найвище значення у векторі, а якщо їх кілька, поверне перше. У цьому випадку у нас є вектор безлічі ФАЛЬСІВ (які дорівнюють 0) та декількох ІСТИНИ (які дорівнюють 1), тому він поверне перше ІСТИНА.


Ще один прогрес:

function(x,y)which.max((1:x)^y%%x==0)

Нарешті, він вибиває відповідь за допомогою Python на два байти. :)

Ще один прогрес: (Знову!)

function(x,y)which.min((1:x)^y%%x)

Велике спасибі лісоруб і user5957401 за допомогу.


Я думаю, що ваше тестове посилання мертве.
TheBikingViking

@TheBikingViking Дякую за те, що вказав на це. Я відредагую її після того, як я пізній обід
Анастасія-Романова

2
якщо ви використовуєте which.min, ви могли б позбутися від ==0. Модуль поверне число, яке не буде менше 0.
user5957401

1
@ user5957401 Відредаговано.Bolshoe spasibo ...
Анастасія-Романова,

При однаковій довжині 34 байти у вас також було подібне function(x,y)which(!(1:x)^y%%x)[1].
планнапус

2

постійний струм, 23 22 байти

Завдяки Delioth за пораду щодо методів введення, економлячи байт

sysxz[zdlylx|0<F]dsFxp

Використовує оператор глибини стека zдля збільшення тестового випадку безпосередньо на стеку, а оператор модульної експоненції - |для модульної експоненції. Повторюйте тестування, поки залишок не буде більше нуля.


1
Технічно вам не потрібно ?на початку, оскільки стандартним способом викликати деякі речі є те > echo "x y [program]"|dc, де xі yтакі ж, як і питання-x, і y буде скинуто на стек як звичайне.
Delioth

@Delioth Цікаво, дякую! Я завжди просто використовував цей -eваріант, але я буду використовувати це відтепер.
Джо

@Delioth, для мене, використовуючи котирування, викидає помилки, що нагадують мені, що "не реалізовано dc, а не використовуючи цитати, очевидно, дає помилки в оболонці. Чи з цим щось робити? Я знаю, що stderrможна ігнорувати, але це все одно мене турбує.
Джо


1

Perl 6 ,  26  25 байт

{first * **$^y%%$^x,1..$x}
{first * **$^y%%$^x,1..*}

Пояснення:

# bare block with two placeholder parameters 「$^y」 and 「$^x」
{
  # find the first value
  first

  # where when it 「*」 is taken to the power
  # of the outer blocks first parameter 「$^y」
  * ** $^y
  # is divisible by the outer blocks second parameter 「$^x」
  %% $^x,

  # out of the values from 1 to Inf
  1 .. *
}



0

PowerShell v2 +, 48 байт

param($x,$y)(1..$x|?{!(("$_*"*$y+1|iex)%$x)})[0]

Бере введення $xта $y. Побудовує діапазон від 1до $x, потім використовує Where-Objectдля фільтрації цих чисел. Фільтр приймає рядок "$_*"(тобто поточне число зірочкою) і використовує множення рядків, щоб об'єднати ці $yчаси, потім приєднується до остаточного 1в кінці, потім труби, що до iex(короткий для Invoke-Expressionі подібний eval). Це має місце [math]::Pow($_,$y), оскільки PowerShell не має оператора експоненції, і на два байти коротше. Це подається в оператор модуля %з $x- таким чином, якщо це розділене, це буде 0, тому ми інкапсулюємо це в парени і візьмемо булевий не!(...)їх. Таким чином, якщо його ділиться, він буде включений у цей фільтр, і всі інші числа будуть виключені.

Нарешті, ми інкапсулюємо отримані числа в паренах (...)і беремо [0]індекс. Оскільки введений діапазон відсортований 1..$x, це буде найменшим. Це залишилося на конвеєрі, а друк неявний.

Тестові справи

PS C:\Tools\Scripts\golfing> (26,2),(96,2),(32,3),(64,9),(27,3)|%{($_-join', ')+' -> '+(.\smallest-positive-number-divisor.ps1 $_[0] $_[1])}
26, 2 -> 26
96, 2 -> 24
32, 3 -> 4
64, 9 -> 2
27, 3 -> 3


0

Perl, 29 26 байт

Включає +3 для -p(не +1, оскільки код містить ')

Запустити з введенням на STDIN

power.pl <<< "96 2"

power.pl:

#!/usr/bin/perl -p
/ /;1while++$\**$'%$`}{

0

Pyth, 9 байт

AQf!%^THG

Програма, яка приймає введення списку форми [x, y]на STDIN і друкує результат.

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

Як це працює

AQf!%^THG  Program. Input: Q
AQ         G=Q[0];H=Q[1]
  f        First truthy input T in [1, 2, 3, ...] with function:
     ^TH    T^H
    %   G   %G
   !        Logical not (0 -> True, all other modulus results -> False)
           Implicitly print

-1

PHP 59 байт

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

function blahblah($x,$y){
  for($i=0;1;$i++){
    if(!$i^$y%$x){
      return $i;
    }
  }
}

Гольф

function b($x,$y){for($i=0;1;$i++){if(!$i^$y%$x)return $i;}

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