y의 거듭 제곱이 x로 나눌 수있는 가장 작은 양수


15

직무

정수 xy둘 다가 주어지면 -제곱을 나눌 2수있는 가장 작은 양수를 찾으십시오 .yx

주어 x=96y=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

@Fatalize 무엇과 관련이 있습니까?
Leaky Nun

X보다 작은 테스트 사례는 없으며 항상보다 큰 Y경우 일부 답변의 길이를 줄일 수 있습니다 (적어도 내 경우) . 오히려 더 크거나 작을 수 있지만 후자의 경우 하나의 테스트 사례가 좋을 것입니다. XYX
치명적

1
참고 문헌 목록은 OEIS 항목 순서의 어리석은 임의성에 대해 본 최고의 그림입니다.
Sparr

답변:


7

Brachylog , 19 17 16 15 12 바이트

@LeakyNun 덕분에 2 바이트가 절약되었습니다.

:[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 감사합니다. 그래도 속도가 훨씬 느려집니다.
Fatalize

왜 이것이 느려질까요?
Leaky Nun


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

나는 그것이 별도의 대답을 보증한다고 생각합니다.
Dennis

6

자바 스크립트 (ES7), 32 바이트

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

정의하지 않았습니다 f. 에 기능을 할당해야한다고 생각합니다 f.
kamoroso94

1
@ kamoroso94 죄송합니다, 나는 영원히 그것을하고 있습니다.
Neil


5

파이썬 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파이썬에서 함수가 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 -~부품 이 누락 되었지만 1 인 True경우 반환 됩니다 x.
Sp3000

4

하스켈, 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²mN입력 히스토리에서 두 번째 항목을 푸시 한 다음 두 항목을 모두 팝하고 첫 번째 항목을 두 번째 권한으로 푸시합니다.
  • ¹ 입력 히스토리의 첫 번째 항목을 스택으로 푸시합니다.
  • Ö이전 두 스택 항목을 팝한 다음 스택을 푸시 a % b == 0합니다.
  • i스택에서 팝합니다. true이면 나머지 프로그램을 실행합니다. 그렇지 않으면 루프가 계속됩니다.
  • N 푸시 N스택을 습니다.
  • q 프로그램을 종료합니다.

프로그램이 종료되면 스택의 최상위 값이 인쇄됩니다.


귀하의 언어에 익숙하지 않은 사람들을 위해이 코드가 어떻게 작동하는지에 대한 설명을 게시하십시오.
Rohan Jhunjhunwala

그 링크는 흥미로워 보인다.
Leaky Nun

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

많은 스택 조작.
Leaky Nun

1
네. Jelly는 "복사"와 "스왑"을 피하기 때문에 여기서 큰 이점을 얻을 것으로 생각합니다.
Luis Mendo

없어요 find?
Leaky Nun

@LeakyNun 네, f 하지만 0이 아닌 모든 인덱스를 찾습니다. 따라서~f1) : negatve가 발견, 첫 번째 항목 얻을
루이스 Mendo

3

실제로 , 12 11 바이트

그의 많은 제안에 대해 Leaky Nun에게 감사드립니다. 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

;)R♀ⁿ♀%0@íu

원래 12 바이트 접근 방식. 온라인으로 사용해보십시오!

1WX│1╖╜ⁿ%WX╜

또 다른 12 바이트 접근법. 온라인으로 사용해보십시오!

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

13 바이트 접근법. 온라인으로 사용해보십시오!

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

풀기 :

첫 번째 알고리즘

       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;)
Leaky Nun

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

온라인 테스트는 RApp on 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을 사용하여 2 바이트로 답을 얻습니다. :)

또 다른 진보 : (다시!)

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

도움을 주신 Axemanuser5957401 에게 감사드립니다 .


테스트 링크가 죽었다고 생각합니다.
TheBikingViking

@TheBikingViking 지적 해 주셔서 감사합니다. 늦은 점심을 먹고 나서 편집하겠습니다
Anastasiya-Romanova 秀

2
를 사용 which.min하면을 (를) 제거 할 수 ==0있습니다. 계수는 0보다 낮은 숫자를 반환합니다.
user5957401

1
@ user5957401 Edited.Bolshoe spasibo ...
Anastasiya-Romanova 秀

같은 길이의 34 바이트에서도 비슷한 결과를 얻었습니다 function(x,y)which(!(1:x)^y%%x)[1].
plannapus

2

dc, 23 22 바이트

입력 방법에 대한 팁을 얻은 Delioth 덕분에 바이트를 절약했습니다.

sysxz[zdlylx|0<F]dsFxp

z스택에서 직접 테스트 케이스를 증가시키기 위해 스택 깊이 연산자 를 사용 하고, 모듈 식 지수를 |위해 모듈 식 지수 연산자 를 사용합니다. 나머지가 0보다 크지 않을 때까지 테스트를 반복하십시오.


1
당신은 기술적으로 필요하지 않은 ?몇 가지를 호출하는 표준 방법으로, 시작 부분에 > echo "x y [program]"|dc, 어디에서 x하고 y있는 것과 동일한을 질문 - X로와 y는 정상으로 스택에 삭제됩니다.
Delioth

@Delioth 재미있는, 감사합니다! 나는 항상 -e옵션을 사용 했지만 지금부터 사용할 것입니다.
Joe

@Delioth, 따옴표를 사용하면에 "구현되지 않은 것을 상기시키는 오류가 발생 dc하지만 따옴표를 사용하지 않으면 분명히 쉘 오류가 발생합니다. 이것에 대해해야 할 일이 있습니까? 나는 stderr무시할 수 있지만 여전히 나를 귀찮게합니다.
Joe


1

펄 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을가 지수 연산자를 가지고 있지 않기 때문에, 2 개의 짧은 바이트입니다. 즉 모듈러 연산자로 공급있어 %함께$x 나눌의 경우,이 될 것이다 -0 우리가 괄호에있는 것을 캡슐화하고 부울 아닌 걸릴 수 있도록,!(...)그. 따라서 분할 가능한 경우이 필터에 포함되며 다른 모든 숫자는 제외됩니다.

마지막으로 결과 숫자를 괄호로 묶어 인덱스를 (...)가져옵니다 [0]. 입력 한 범위가 sorted이므로 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

펄, 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;}

$ x를 사용해야하는 곳에서 $ z를 사용하고 있으며 루프에서 $ i를 늘리지 않는다고 생각합니다
theLambGoat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.