Nのべき乗の差として数字を書く


24

チャレンジ

2つの正方形の差、2つの立方体の差、またはさらに高いべき乗として表現できる数値が多数あります。正方形について言えば、2つの正方形の差として、たとえば75のような数を書くさまざまな方法があります。あなたは書ける:

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

それでは、挑戦について話しましょう。まず、ユーザーが数値を入力し、次にnの値を入力します。その数をaⁿ-bⁿの形式で書くことができるすべての方法を表示する必要があります。

入出力

入力は、nの数と値になります。出力には、上記の条件が満たされるように、「a」と「b」のすべてのペアが含まれます。ペアの最初の数値は、2番目の数値よりも大きくする必要があります。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)

得点

これはなので、最短のコードが優先されます!

回答:


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
じゃ、いいよ。好きなように保管できます。
マニッシュクン

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)

または、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

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]

オンラインでお試しください!

totallyhumanのx ^ 2ブルートフォースアプローチを使用すると、実際にバイトが節約されます。



3
残念ながら、ブルートフォーシングは通常、最短のアプローチです。:P-
完全に人間

'b in range(x)'はTIOで機能します。それは67バイトになります。
アリックスアイゼンハルト



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.