写数字作为N次方的差


24

挑战

有许多数字可以表示为两个平方的差,两个立方体的差,甚至更高的幂。关于平方,有两种写数字的方法,例如75,等于2个平方的差。你可以写:

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

因此,让我们谈谈挑战。首先,用户输入数字,然后输入n的值。您需要以aⁿ-bⁿ的形式显示该数字的所有写入方式。

输入输出

输入将是数字和n的值。您的输出应具有所有这样的“ a”和“ b”对,从而满足上述条件。该对中的第一个数字必须大于第二个。请注意,a,b,n和输入数字均为正整数,并且n> 1

例子

50, 2 -> (none)

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

7, 3 -> (2,1)

665, 6 -> (3, 2)

81, 4 -> (none)

计分

这是,因此最短的代码获胜!

Answers:


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].

6

Haskell,42个字节

k#n=[(a,b)|b<-[1..k],a<-[b..k],a^n-b^n==k]

在线尝试!

UniHaskell-XUnicodeSyntax

import UniHaskell

f      Int  Int  [(Int, Int)]
f k n = [(a, b) | b  1  k, a  b  k, a^n - b^n  k]

不能改变太多...


实际上,==UniHaskell中的等号有点令人困惑,因为它表示数学上的全等。
user202729

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

JavaScript(ES7),64个字节

以递归语法输入的递归函数(n)(p)。返回以空格分隔的整数对列表,如果不存在解决方案,则返回空字符串。使用与user202729的Python answer相同的算法。

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

60个字节,带有0终止的封装数组:

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

这将输出[ 9, 7, [ 6, 2, 0 ] ]F(32)(2)

测试用例



2

Python 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]

在线尝试!


Python 3,69个字节

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

在线尝试!

使用完全人类的x ^ 2蛮力方法实际上可以节省字节。



3
不幸的是,强行强制通常是最短的方法。:P
全人类

'b in range(x)'在TIO上起作用。这使得67个字节。
艾力克斯·艾森哈特

@AlixEisenhardt 我不这么认为
user202729


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.