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


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.