Запишіть числа як різницю 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)

Оцінка балів

Це , тому найкоротший код виграє!

Відповіді:


9

Желе , 8 байт

p*ƓIFẹ+d

Це монадичне посилання, яке приймає число як аргумент і читає n зі STDIN.

Спробуйте в Інтернеті!

Як це працює

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

Хаскелл , 42 байти

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

Спробуйте в Інтернеті!

Unololfed з 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 дещо заплутаний, оскільки позначає конгруентність у математиці.
користувач202729

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 байти

Рекурсивна функція, що приймає вклад у синтаксис currying (n)(p). Повертає розділений пробілом список пар цілих чисел або порожній рядок, якщо рішення не існує. Використовується той же алгоритм, що і відповідь Python користувача202029 .

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 в діапазоні (x)' працює на TIO. Це складає 67 байт.
Алікс Айзенхардт



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.