N 제곱의 차이로 숫자 쓰기


24

도전

두 제곱의 차이 또는 두 큐브의 차이 또는 더 높은 거듭 제곱으로 표현할 수있는 숫자가 많이 있습니다. 정사각형에 대해 말하면 2 정사각형의 차이로 숫자를 쓰는 여러 가지 방법이 있습니다 (75). 당신은 쓸 수 있습니다:

75 = (10)^2 - (5)^2 
   = (14)^2 - (11)^2 
   = (38)^2 - (37)^2         

그럼 도전에 대해 이야기합시다. 먼저, 사용자는 숫자를 입력 한 다음 n에 대한 값을 입력합니다. 해당 번호가 aⁿ-bⁿ 형식으로 작성 될 수있는 모든 방법을 표시해야합니다.

입력과 출력

입력 값은 n의 숫자와 값입니다. 출력은 위에 언급 된 조건이 충족되도록 모든 'a'와 'b'쌍을 가져야합니다. 쌍의 첫 번째 숫자는 두 번째 숫자보다 커야합니다. 있습니다 A, B, N 및 상기 입력 번호가 모두 양의 정수이고,> 1 N .

50, 2 -> (none)

32, 2 -> (9,7), (6, 2)

7, 3 -> (2,1)

665, 6 -> (3, 2)

81, 4 -> (none)

채점

이것은 이므로 가장 짧은 코드가 승리합니다!

답변:


9

젤리 , 8 바이트

p*ƓIFẹ+d

이것은 숫자를 인수로 사용하고 STDIN에서 n 을 읽는 모나드 링크입니다 .

온라인으로 사용해보십시오!

작동 원리

p*ƓIFẹ+d  Main link. Argument: k

p         Cartesian product; yield all pairs [b, a] with b and a in [1, ..., k].
  Ɠ       Get; read an integer n from STDIN.
 *        Power; map each [b, a] to [b**n, a**n].
   I      Increments; map each [b**n, a**n] to [a**n-b**n].
    F     Flatten the resulting list of singleton arrays.
     ẹ    Every; find all indices of k in the list we built.
      +   Add k to the indices to correct the offset.
       d  Divmod; map each index j to [j/k, j%k].


4

05AB1E , 9 바이트

더 큰 입력 값에는 매우 비효율적입니다.

LãDImƹQÏ

온라인으로 사용해보십시오!

설명

L           # range [1 ... input_1]
 ã          # cartesian product with itself
  D         # duplicate
   Im       # raise each to the power of input_2
     Æ      # reduce each pair by subtraction
      ¹QÏ   # keep only values in the first copy which are true in this copy

4

MATL , 11 바이트

t:i^&-!=&fh

온라인으로 사용해보십시오!또는 모든 테스트 사례를 확인하십시오 .

설명

t     % Implicit input: M. Duplicate
:     % Range [1 2 ... M]
i     % Input: n
^     % Power, element-wise. Gives [1^n 2^n ... M^n]
&-    % Matrix of pairwise differences (size n×n)
!     % Transpose. Needed so the two numbers in each pair are sorted as required
=     % Is equal? Element-wise. Gives true for entries of the matrix equal to M
&f    % Row and column indices of true entries
h     % Concatenate horizontally. Implicit display



2

젤리 , 10 바이트

*Iċ³
ṗ2çÐf

전체 프로그램 복용 i하고 n있는 쌍 밖으로 인쇄 [b,a]아무도 없다 빈 출력.

온라인으로 사용해보십시오!

방법?

*Iċ³ - Link 1, isValid?: pair of +ve integers, [b,a]; +ve integer, n
*    - exponentiate             -> [b^n,a^n]
 I   - incremental differences  -> [a^n-b^n]
   ³ - program's third argument -> i
  ċ  - count occurrences        -> 1 if a^n-b^n == i, otherwise 0

ṗ2çÐf - Main link: +ve integer i, +ve integer n
ṗ2    - second Cartesian power = [[1,1],[1,2],...,[1,i],[2,1],...,[2,i],...,[i,i]]
   Ðf - filter keeping if:
  ç   -   call last link (1) as a dyad (left = one of the pairs, right = n)
      - implicit print of Jelly representation of the list

1
좋아. 원하는대로 유지할 수 있습니다.
Manish Kundu

2

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

카레 구문으로 입력을받는 재귀 함수 (n)(p). 공백으로 구분 된 정수 쌍의 목록 또는 솔루션이없는 경우 빈 문자열을 리턴합니다. user202729의 Python answer 와 동일한 알고리즘을 사용합니다 .

n=>p=>(g=x=>x--?((y=(x**p+n)**(1/p))%1?[]:[y,x]+' ')+g(x):[])(n)

또는 0으로 끝나고 캡슐화 된 배열을 가진 60 바이트 :

n=>p=>(g=x=>x--&&((y=(x**p+n)**(1/p))%1?g(x):[y,x,g(x)]))(n)

f (32) (2) 출력 [ 9, 7, [ 6, 2, 0 ] ]됩니다 .

테스트 사례



2

파이썬 3 , 71 바이트

바이트를 저장해 주셔서 감사합니다 Mr.Xcoder!

lambda x,n:[(a,b)for b in range(1,x)for a in[(b**n+x)**(1/n)]if a%1==0]

온라인으로 사용해보십시오!


파이썬 3 , 69 바이트

lambda x,n:[(a,b)for b in range(1,x)for a in range(x)if a**n-b**n==x]

온라인으로 사용해보십시오!

totallyhuman의 x ^ 2 brute force 접근법을 사용하면 실제로 바이트가 절약됩니다.



3
불행히도, 무차별 강제는 일반적으로 가장 짧은 접근법입니다. : P
완전히 인간적인

'b in range (x)'는 TIO에서 작동합니다. 67 바이트가됩니다.
Alix Eisenhardt



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.