Інша нога Піфагора


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} .

Зокрема, це означає , що а <Ь 2 і Ь <а 2 , тому для введення а можна просто перевірити , якщо 2 + Ь 2 являє собою ідеальний квадрат для кожного Ь в {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} = {km 2 - kn 2 , 2kmn} .

Зокрема, це означає , що а <Ь 2 і Ь <а 2 , тому для введення а можна просто перевірити , якщо 2 + Ь 2 являє собою ідеальний квадрат для кожного Ь в {1, ... A 2 } .

Код

: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 * a-1

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

Thx, щоб @ Mwr247 найкоротший спосіб побудувати діапазон в ES6

2 байти збережено thx @ETHproductions


Дивовижно! Я думаю, ви можете зберегти кілька байтів за допомогою вбудованого:a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
ETHproductions

@ETHproductions thx, мені потрібно дізнатися більше про нові вбудовані математики
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

Мова Вольфрама (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)значення де 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

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

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

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

×⍨ квадратний (літ. selfie множення) аргумент

() Застосувати таку анонімну функцію мовчання:

ɩ число 1 через аргумент

 помножити на ɩ число 1 через аргумент (тобто квадрат)

⊢() Застосувати таку анонімну функцію мовчання з аргументом як лівий аргумент:

  + - це сума

   член

   це?

ɩ icesices істини


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.