Другая нога Пифагора


33

Пифагор получил удар по ноге на войне. Его нужно было ампутировать, и хотя он чуть не умер, он вырвался и полностью выздоровел. Теперь, после года прогулок на костылях, он получает привилегию получить протез ноги! Дело в том, что есть несколько подходящих, но какие?

Задание

Если в качестве входных данных задано положительное целое число, равное длине одной ветви пифагорейской тройки, выведите все возможности для другой ветви. Например, наименьшая пифагорейская тройка - это (3,4,5), которая образует треугольник с двумя ножками длиной 3 и 4 и гипотенузой длиной 5.

Примеры

Leg:5
12

Leg:28
21
45
96
195

Leg:101
5100

Leg:1001
168
468
660
2880
3432
4080
5460
6468
10200
38532
45540
71568
501000

Правила

  • На входе будет одно положительное целое число n.
  • Вывод может быть в любом порядке, с любым разделителем, в любой базе (хотя эта база должна быть согласованной), с необязательными открывающими и закрывающими скобками и необязательными конечными пробелами. То есть 1 2 3, [1,2,3]и 1,11,111все подходят этот выходной спецификации.
  • Вы можете предположить, что nникогда не будет больше четверти четвертого корня ограничения вашего языка (без использования библиотек). На практике вы можете предположить, что ввод будет меньше, чем это или 10 000, в зависимости от того, что меньше.

Пифагор ждет вас, так что лучше пишите свой код быстро и коротко!


18
Он действительно странный парень. Он готов подождать пару тысяч лет, чтобы изобрести компьютеры, но не больше пары наносекунд, чтобы прочитать несколько лишних сотен байтов. Очень точный человек, если не сказать больше.
— CorsiKa

Ответы:



11

Желе , 8 байт

²R²+²Æ²O

Этот ответ не является конкурирующим, поскольку в нем используются функции, которые были реализованы после публикации заявки. Попробуйте онлайн!

Этот подход не использует математические операции с плавающей запятой, поэтому он даст правильный ответ, если промежуточные списки могут поместиться в памяти.

идея

Если (a, b, c) является тройкой Пифагора, то существуют строго положительные целые числа k, m, n, такие что выполняется равенство множеств {a, b} = {km 2 - kn 2 , 2kmn} .

В частности, это означает, что a <b 2 и b <a 2 , поэтому для ввода a мы можем просто проверить, является ли a 2 + b 2 идеальным квадратом для каждого b в {1,… a 2 } .

Код

            Input: x

²           Compute x².
 R          Get get range 1 ... x².
  ²         Square each integer in that range.
   +²       Add x² to each resulting square.
     Ʋ     Check if the resulting sums are perfect squares.
       O    Get all indices of ones.

10

Юлия, 35 байт

n->filter(i->hypot(i,n)%1==0,1:n^2)

Это анонимная функция, которая принимает целое число и возвращает массив.

Для каждого iот 1 до входного квадрата мы вычисляем гипотенузу, используя встроенную hypotфункцию Джулии , и определяем, равна ли дробная часть 0. Если это так, мы сохраняем ее, в противном случае она исключается.


6

CJam, 17 байт

{:A2#{Amh1%!},1>}

Это анонимная функция, которая извлекает целое число из стека и оставляет массив в ответ.

Попробуйте онлайн!

идея

Если (a, b, c) является тройкой Пифагора, то существуют строго положительные целые числа k, m, n, такие что множество равенств {a, b} = {км 2 - kn 2 , 2kmn} .

В частности, это означает, что a <b 2 и b <a 2 , поэтому для ввода a мы можем просто проверить, является ли a 2 + b 2 идеальным квадратом для каждого b в {1,… a2 } .

Код

:A               Save the input in A.
  2#             Square it.
    {      },    Filter; for each B in {0, ..., A**2}:
     Amh           Calculate the hypotenuse of (A, B).
        1%!        Apply logical NOT to its fractional part.
                 Keep B if ! pushed 1.
             1>  Discard the first kept B (0).  

4

JavaScript ES6, 60 62

То же, что и другие ответы, проверка от 1 до * a-1

a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))

Спасибо @ Mwr247 самый короткий способ построить диапазон в ES6

2 байта сохранены thx @ETHproductions


Потрясающе! Я думаю, что вы могли бы сэкономить несколько байтов с помощью встроенного:a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
— ETHproductions

@ETHproductions спасибо, мне нужно больше узнать о новых математических встроенных
— edc65

Удобно, что они также обсуждаются на странице, на которую вы уже ссылались. (Я бы сам предложил гипотезу, но я не вошел в систему в то время.)
— Нил

3

C 96 байтов

Поочередно увеличивайте y(другую ногу) и z(гипотенузу), пока их разность не упадет до 1. Выведите каждое точное совпадение ( c==0), которое вы встретите на пути.

int x,y,z;main(int c,char**a){for(x=z=atoi(a[1]);++y<z;c=x*x+y*y-z*z,c?z+=c>0:printf("%d ",y));}

Вызовите скомпилированную программу с параметром n ; он выведет разделенный пробелами список десятичных чисел.

Очевидно, не самый короткий; Я могу найти утешение в том, чтобы иметь самый быстрый.

$ time ./pyth 9999
200 2020 13332 13668 16968 44440 45360 54540 55660 137532 164832 168168 413080 494900 504900 617120 1514832 1851468 4544540 5554440 16663332 49990000 
real    0m0.846s
user    0m0.800s
sys     0m0.000s


3

Wolfram Language (Mathematica) , 40 байт

b/.Solve[#^2+b^2==c^2,PositiveIntegers]&

Я использую недокументированную форму Solve: когда список переменных опущен, то по Solveумолчанию используется решение для всех символов в выражении. Таким образом, мы экономим 6 байтов по сравнению с более регулярными Solve[#^2+b^2==c^2,{b,c},PositiveIntegers].

PositiveIntegersявляется новым в версии 12 Mathematica и, следовательно, недоступен в TIO . В настольном Mathematica, мы получаем

F = b/.Solve[#^2+b^2==c^2,PositiveIntegers]& ;

F[5]
(*    {12}    *)

F[28]
(*    {21, 45, 96, 195}    *)

F[101]
(*    {5100}    *)

F[1001]
(*    {168, 468, 660, 2880, 3432, 4080, 5460, 6468, 10200, 38532, 45540, 71568, 501000}    *)

2

Python 2, 53 байта

lambda n:[i for i in range(1,n*n)if abs(i+n*1j)%1==0]

Простое решение, использующее комплекс absдля вычисления длины гипотенузы. Это безопасно использовать n*nв качестве верхней границы для другой ноги, потому что (n*n)^2 + n^2 < (n*n+1)^2. Вместо этого я попытался использовать рекурсию, но не получил ничего более короткого.


2

Серьезно, 20 байтов

,;╗ªDR;`╜@ÇA1@%Y`M@░

Та же стратегия, что и в ответе Python от xnor: проверьте i in range(1,n*n)значения where abs(i+nj) % 1 == 0и выведите список.Попробуйте онлайн

Объяснение:

,;╗    get input and save a copy in register 0
ªDR;   push two copies of range(1,n*n)
`╜@ÇA1@%Y`M    map the function across one of the ranges:
    ╜@ÇA         compute abs(i+nj)
    1@%Y         push 1 if result % 1 is 0, else 0
M@░    swap the two lists, take values in the original range where the corresponding values in the second range are truthy


2

APL (NARS), 373 символа, 746 байтов

C←{h←{0=k←⍺-1:,¨⍵⋄(k<0)∨k≥i←≢w←⍵:⍬⋄↑,/{w[⍵],¨k h w[(⍳i)∼⍳⍵]}¨⍳i-k}⋄1≥≡⍵:⍺h⍵⋄⍺h⊂¨⍵}⋄P←{1≥k←≢w←,⍵:⊂w⋄↑,/{w[⍵],¨P w[a∼⍵]}¨a←⍳k}⋄d←{∪×/¨{k←≢b←1,π⍵⋄∪{b[⍵]}¨↑∪/101 1‼k k}⍵}⋄t←{(-/k),(×/2,⍵),+/k←⍵*2}⋄b←{⍬≡a←3 C d w←⍵:(⊂1,⍵,1)⋄(⊂1,⍵,1),a/⍨{⍵[2]>⍵[3]}¨a←↑∪/P¨,a/⍨{w=×/⍵}¨a}⋄u←{(↑⍵),2÷⍨(+/a),-/a←1↓⍵}⋄t1←{(↑¨⍵)×t¨1↓¨⍵}⋄f1←{0=2∣⍵:↑¨t1 b⍵÷2⋄{2⊃⍵}¨t1 u¨b⍵}⋄f←{m←⎕ct⋄⎕ct←0⋄r←f1⍵⋄⎕ct←m⋄r}

комментарий:

C: ⍺ combination in ⍵ list
P: permutations  in ⍵ list
d: divisors of ⍵ unsigned
t: Pythagorian triple from ⍵ list 2 unsigned
b: if argument ⍵ is one unsigned it would return the list of (k,i,j) where 
   k,i,j are all divisors of ⍵, and ⍵=k×i×j and i>j
u: from one triple (k,i,j) return (k,(i+j)/2,(i-j)/2)
t1: apply (k,i,j) to t in the way  k×t i,j 
f: the function of this exercise

Идея заключалась бы в том, чтобы учесть входные данные для того, чтобы узнать возможные m, n, которые генерируют, используя t всю тройку Пифагора, которая имеет вход в качестве ноги. Тест:

  f 18298292829831839x
167413760243137645229428509060960 15219432749376149566311682641900 99808869980900940 
  1383584795397831778755607512840 
  f 5
12
  f 28
195 96 21 45 
  f 101
5100
  f 1001
501000 6468 38532 2880 468 660 168 5460 45540 4080 71568 3432 10200 
  ≢f 1001
13
  f 1663481166348349x
1383584795397831778755607512900 
  f 198820182831x
19764732550476133587280 346749693868002343608 5664631173992 6083327962596530720 613900915408 115583231289334114460 
  18249983887789596492 1883559626820 1040249081604007030900 54749951663368790920 6588244183492044529092 
  265093577108 2196081394497348176360 

2

APL (Dyalog Extended) , 15 14 байтов SBCS

Функция анонимного молчаливого префикса.

(⍸⊢(+∊⊢)⍳×⍳)×⍨

Попробуйте онлайн!

×⍨ квадрат (лит. умножение селфи) аргумент

(… ) Применить следующую анонимную молчаливую функцию:

 ⍳ tentegers 1 через аргумент

 ⍳ умножить на tentegers 1 через аргумент (т.е. квадрат)

 ⊢(… ) Применить следующую анонимную молчаливую функцию с аргументом в качестве левого аргумента:

  + это сумма

  ∊ членом

  ⊢ Это?

 ⍸ nd ндс истины


1

Perl 5, 43 байта

$i=<>;{sqrt(++$_**2+$i**2)!~/\./&&say;redo}

Если вы хотите , чтобы скрипт для завершения, мы можем инспектировать другие ноги до N² только как объяснено на XNOR , поэтому у нас есть 48 байт:

map{sqrt(++$_**2+$i**2)!~/\./&&say}1..($i=<>)**2

1

Japt , 16 байт

1oU² f@!(MhXU %1

Попробуйте онлайн!

Как это работает

        // Implicit: U = input integer
1oU²    // Generate a range of integers from 1 to U squared.
f@!(    // Keep only items X that return falsily to:
MhXU %1 //  Math.hypot(X,U) % 1.
        // This keeps only the items where sqrt(X*X+U*U) = 0.
        // Implicit: output last expression


1

05AB1E , 10 байтов

nDLn+Ųƶ0K

Попробуйте онлайн или проверьте все контрольные примеры .

nDLʒnIn+Ų

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

n           # Take the square of the (implicit) input-integer
 D          # Duplicate it
  L         # Create a list in the range [1, input^2]
   n        # Square each value in this list
    +       # Add the input^2 we duplicated to each
     Ų     # Check for each of these if it's a square (1 if truthy; 0 if falsey)
       ƶ    # Multiply each value by its 1-based index
        0K  # Remove all 0s from the list
            # (after which the result is output implicitly)

nDL         # Same as above
   ʒ        # Filter this list by:
    n       #  Get the square of the current number
     In+    #  Add the squared input to it
        Ų  #  And check if it's a square
            # (after the filter, implicitly output the result)

1

MathGolf , 9 байт

²╒gƲk²+°

Попробуйте онлайн!

Не удалось найти хороший способ удалить любую из ² s, которые занимают 3/9 байтов. В противном случае это довольно просто

объяснение

²           square input
 ╒          range(1,n+1)
  gÆ        filter list using next 5 operators
    ²       square list element
     k²     push input squared
       +    pop a, b : push(a+b)
        °   is perfect square

1

Java 8, 72 байта

n->{for(int i=0;++i<n*n;)if(Math.hypot(i,n)%1==0)System.out.println(i);}

Попробуйте онлайн.

Объяснение:

n->{                           // Method with integer as parameter and no return-type
  for(int i=0;++i<n*n;)        //  Loop `i` in the range (0, n²)):
    if(Math.hypot(i,n)         //   If sqrt(i² + n²)
       %1==0)                  //   has no decimal digits after the comma (so is an integer)
      System.out.println(i);}  //    Output `i` with trailing newline
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.