Наименьшее положительное число, у-я степень которого делится на х


15

задача

По заданным целым числам xи yобоим по крайней мере 2найдите наименьшее положительное число,y -я степень делится на x.

пример

Учитывая x=96и y=2, выход должен быть, 24так как 24является наименьшим положительным nудовлетворяющимn^2 is divisible by 96 .

Testcases

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

счет

Это . Решение с самым низким числом байтов выигрывает.

Ссылки



1
Будет ли Xвсегда быть больше , чем Y?
Fatalize

@Fatalize Какое это имеет отношение к чему-либо?
Утренняя монахиня

Нет тестового случая, где Xменьше Y, и он может уменьшить длину некоторых ответов (по крайней мере, моих), если Xвсегда больше, чем Y. Я бы предпочел, чтобы Xэто было больше или меньше, но тогда был бы хорош один контрольный пример для последнего.
Fatalize

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 байтов.
Утренняя монахиня

Я думаю, что требует отдельного ответа.
Денис

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)
Утренняя монахиня

@ 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?
Утренняя монахиня

@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выталкивает это из стека. Если true, он выполняет остальную часть программы; в противном случае цикл продолжается.
  • Nтолкает Nв стек.
  • q завершает программу

Когда программа завершается, печатается верхнее значение стека.


Пожалуйста, опубликуйте объяснение того, как этот код работает для тех, кто не знает вашего языка, но в остальном хорошо поработал и хорошего первого поста.
Рохан Джунджхунвала

Эта ссылка кажется интересной.
Утренняя монахиня

2
Очень хороший первый ответ.
Emigna

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

Много манипуляций со стеком.
Утренняя монахиня

1
Ага. Я подозреваю, что у Jelly будет большое преимущество, поскольку он избегает всех этих «копий» и «свопинга»
Луис Мендо,

Разве нет find?
Утренняя монахиня

@LeakyNun Да, fно это находит все ненулевые индексы. Так что должно было бы быть ~f1): negatve, найти, получить первую запись
Luis Mendo

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 Я был бы рад опубликовать эти подходы, если только вы не захотите опубликовать их сами.
Sherlock9

+1 за ухмылку;)
Лики Монахиня

2

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

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

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

Онлайн-тест можно провести здесь: RStudio на rollApp .


Основные успехи:

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

which.maxработает, потому что он возвращает самое высокое значение в векторе, и если есть несколько, он вернет первое. В этом случае у нас есть вектор из множества FALSE (которые равны 0) и нескольких TRUE (которые равны 1), поэтому он вернет первое значение TRUE.


Еще один прогресс:

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

Наконец, он отбивает ответ, используя Python, двумя байтами. :)

Еще один прогресс: (снова!)

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

Большое спасибо Axeman и user5957401 за помощь.


Я думаю, что ваша тестовая ссылка мертва.
TheBikingViking

@TheBikingViking Спасибо за указание на это. Я отредактирую его после позднего обеда
Анастасия-Романова

2
если вы используете which.min, вы можете избавиться от ==0. Модуль вернет число, которое будет не ниже 0.
user5957401

1
@ user5957401 Отредактировано. Большое спасибо ...
Анастасия-Романова

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

2

Округ Колумбия, 23 22 байта

Спасибо Делиоту за совет о методах ввода, сохраняющий байт

sysxz[zdlylx|0<F]dsFxp

Использует оператор глубины стека zдля приращения тестового примера непосредственно в стеке и оператор модульного возведения в степень |для, ну, в общем, модульного возведения в степень. Повторяйте тестирование, пока остаток не станет больше нуля.


1
Технически вам не нужно ?в начале, так как стандартный способ вызвать некоторые вещи > echo "x y [program]"|dc, где xи yтакие же, как Вопрос-х и у будет сброшен в стек, как обычно.
Делиот

@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;
    }
  }
}

Golfed

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.