Schreiben Sie Zahlen als Differenz von N-ten Potenzen


24

Herausforderung

Es gibt viele Zahlen, die sich als Differenz zweier Quadrate oder als Differenz zweier Würfel oder vielleicht sogar höherer Potenzen ausdrücken lassen. Apropos Quadrate: Es gibt verschiedene Möglichkeiten, eine Zahl, z. B. 75, als Differenz von zwei Quadraten zu schreiben. Du kannst schreiben:

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

Sprechen wir also über die Herausforderung. Der Benutzer gibt zuerst eine Zahl und dann einen Wert für n ein. Sie müssen alle Möglichkeiten anzeigen, wie diese Nummer in Form von aⁿ - bⁿ geschrieben werden kann.

Ein- und Ausgang

Die Eingabe ist die Zahl und der Wert von n. Ihre Ausgabe muss alle diese Paare von 'a' und 'b' enthalten, sodass die oben angegebene Bedingung erfüllt ist. Die erste Zahl im Paar muss größer als die zweite sein. Bitte beachten Sie, dass a, b, n und die eingegebene Zahl positive ganze Zahlen sind und n> 1 .

Beispiele

50, 2 -> (none)

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

7, 3 -> (2,1)

665, 6 -> (3, 2)

81, 4 -> (none)

Wertung

Das ist , also gewinnt der kürzeste Code!

Antworten:


9

Gelee , 8 Bytes

p*ƓIFẹ+d

Dies ist eine monadische Verknüpfung, die die Zahl als Argument verwendet und n aus STDIN liest .

Probieren Sie es online!

Wie es funktioniert

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 Bytes

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

Probieren Sie es online!

Ungolfed mit UniHaskell und-XUnicodeSyntax

import UniHaskell

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

Kann sonst nicht viel ändern ...


Tatsächlich ist das Gleichheitszeichen ==in UniHaskell etwas verwirrend, da es die Kongruenz in der Mathematik anzeigt.
user202729

4

05AB1E , 9 Bytes

Sehr ineffizient für größere Eingabewerte.

LãDImƹQÏ

Probieren Sie es online!

Erläuterung

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 Bytes

t:i^&-!=&fh

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

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

Gelee , 10 Bytes

*Iċ³
ṗ2çÐf

Eine vollständige Programmaufnahme i, bei nder die Paare [b,a]mit einer leeren Ausgabe ausgedruckt werden, wenn keine vorhanden sind.

Probieren Sie es online!

Wie?

*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
Okay gut. Sie können es behalten, wie Sie möchten.
Manish Kundu

2

JavaScript (ES7), 64 Byte

Eine rekursive Funktion, die Eingaben in der aktuellen Syntax vornimmt (n)(p). Gibt eine durch Leerzeichen getrennte Liste von Ganzzahlpaaren oder eine leere Zeichenfolge zurück, wenn keine Lösung vorhanden ist. Verwendet denselben Algorithmus wie die Python-Antwort von user202729 .

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

Oder 60 Bytes mit 0-terminierten, gekapselten Arrays:

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

Dies würde [ 9, 7, [ 6, 2, 0 ] ]für f (32) (2) ausgegeben .

Testfälle



2

Python 3 , 71 Bytes

Danke Mr.Xcoder für das Speichern einiger Bytes!

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

Probieren Sie es online!


Python 3 , 69 Bytes

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

Probieren Sie es online!

Verwenden Sie die x ^ 2-Brute-Force-Methode von totallyhuman, um tatsächlich Bytes zu sparen.



3
Leider ist Brute Forcing normalerweise der kürzeste Ansatz. : P
totalhuman

'b in range (x)' funktioniert bei TIO. Das sind 67 Bytes.
Alix Eisenhardt

@AlixEisenhardt Das glaube ich nicht .
user202729


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.