Écrire des nombres comme une différence de Nième puissances


24

Défi

Il existe de nombreux nombres qui peuvent être exprimés comme la différence de deux carrés, ou comme la différence de deux cubes, ou peut-être même des puissances supérieures. En parlant de carrés, il existe différentes façons d'écrire un nombre, disons 75, comme la différence de 2 carrés. Tu peux écrire:

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

Parlons donc du défi. Tout d'abord, l'utilisateur entre un nombre puis il saisit une valeur pour n. Vous devez afficher toutes les façons dont ce nombre peut être écrit sous la forme aⁿ - bⁿ.

Entrée et sortie

L'entrée sera le nombre et la valeur de n. Votre sortie doit avoir toutes ces paires de «a» et de «b» telles que la condition susmentionnée est remplie. Le premier nombre de la paire doit être plus grand que le second. Veuillez noter que a, b, n et le numéro d'entrée sont tous des entiers positifs et n> 1 .

Exemples

50, 2 -> (none)

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

7, 3 -> (2,1)

665, 6 -> (3, 2)

81, 4 -> (none)

Notation

C'est le , donc le code le plus court gagne!

Réponses:


9

Gelée , 8 octets

p*ƓIFẹ+d

Il s'agit d'un lien monadique qui prend le nombre en argument et lit n dans STDIN.

Essayez-le en ligne!

Comment ça marche

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 octets

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

Essayez-le en ligne!

Ungolfed avec UniHaskell et-XUnicodeSyntax

import UniHaskell

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

Je ne peux pas changer grand chose d'autre ...


En fait, le signe égal ==dans UniHaskell est quelque peu déroutant, car il dénote la congruence en mathématiques.
user202729

4

05AB1E , 9 octets

Très inefficace pour des valeurs d'entrée plus importantes.

LãDImƹQÏ

Essayez-le en ligne!

Explication

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 octets

t:i^&-!=&fh

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

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

Gelée , 10 octets

*Iċ³
ṗ2çÐf

Une prise de programme complète i, et nqui affiche les paires [b,a]avec une sortie vide quand il n'y en a pas.

Essayez-le en ligne!

Comment?

*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
Très bien. Vous pouvez le conserver comme vous le souhaitez.
Manish Kundu

2

JavaScript (ES7), 64 octets

Une fonction récursive prenant une entrée dans la syntaxe de curry (n)(p). Renvoie une liste de paires d'entiers séparées par des espaces ou une chaîne vide s'il n'existe aucune solution. Utilise le même algorithme que la réponse Python de user202729 .

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

Ou 60 octets avec des tableaux encapsulés terminés par 0:

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

Cela produirait [ 9, 7, [ 6, 2, 0 ] ]pour f (32) (2) .

Cas de test



2

Python 3 , 71 octets

Merci Mr.Xcoder pour avoir sauvé quelques octets!

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

Essayez-le en ligne!


Python 3 , 69 octets

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

Essayez-le en ligne!

L'approche par force brute x ^ 2 de totallyhuman permet en fait d'économiser des octets.



3
Malheureusement, le forçage brutal est généralement l'approche la plus courte. : P
totalement humain

'b in range (x)' fonctionne sur TIO. Cela fait 67 octets.
Alix Eisenhardt le

@AlixEisenhardt Je ne pense pas .
user202729


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.