ピタゴラスのもう一方の足


33

ピタゴラスは戦争で足を膨らませました。それは切断されなければならず、彼は死にそうになったが、彼は乗り越えて完全に回復した。今、松葉杖で歩いて1年後、彼は義足を手に入れる特権を得ます!ただし、適合するものはいくつかありますが、どれですか?

タスク

ピタゴラストリプルの一方の足の長さである正の整数を入力として指定すると、もう一方の足のすべての可能性が出力されます。たとえば、最小のピタゴラストリプルは(3,4,5)で、長さ3と4の2本の脚と長さ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あなたの言語の制限の4番目のルートの4分の1より大きくなることは決してないと仮定するかもしれません(ライブラリを使わないで)。実際には、入力がこれまたは10,000のいずれか少ない方より少ないと仮定できます。

ピタゴラスがあなたを待っているので、コードをすばやく短く書いてください!


18
彼は本当に奇妙な男です。彼は、コンピューターが発明されるのを数千年待つことをいとわないが、数百バイトを読むのに数ナノ秒はかからない。控えめに言っても、非常に正確な男。
corsiKa

回答:



11

ゼリー、8バイト

²R²+²Æ²O

チャレンジが投稿された後に実装された機能を使用するため、この回答は競合しません。 オンラインでお試しください!

このアプローチは浮動小数点演算を使用しないため、介在リストがメモリに収まる限り、正しい答えが得られます。

アイディア

場合(A、B、C)は、ピタゴラス三重で、厳密に正の整数が存在するK、M、N、セット平等ことを{A、B} = {離れ2 - KN 2は、2kmn}が成り立ちます。

特に、この手段すなわち<B 2及びB < 2、そう入力のため、我々は簡単に確認できる場合2 + B 2はそれぞれのための完全な正方形であるBにおける{1、... 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)

これは、整数を受け入れて配列を返す匿名関数です。

i1から入力の2乗までのそれぞれについて、Juliaの組み込みhypot関数を使用して斜辺を計算し、小数部分が0であるかどうかを判断します。


6

CJam、17バイト

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

これは、スタックから整数をポップし、代わりに配列を残す匿名関数です。

オンラインでお試しください!

アイディア

場合(A、B、C)は、ピタゴラス三重で、厳密に正の整数が存在するK、M、N、セット平等ことを{A、B} = {離れ2 - KN 2は、2kmn}が成り立ちます。

特に、この手段すなわち<B 2及びB < 2、そう入力のため、我々は簡単に確認できる場合2 + B 2はそれぞれのための完全な正方形であるBにおける{1、... 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))

@ Mwr247へのTHX ES6で範囲を構築する最短の方法

@ETHproductionsで2バイト節約


驚くばかり!組み込みで数バイト節約できると思います:a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
ETHproductions

@ETHproductionsのTHX、私は新しい数学組み込み関数についての詳細を学ぶ必要がある
edc65

便利なことに、それらは既にリンクしているページでも説明されています。(私は自分でハイポを提案したでしょうが、その時点ではログインしていませんでした。)
ニール

3

C、96バイト

差が1に減少するまで(y他方の脚)とz(斜辺)を交互に増やします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を指定してコンパイル済みプログラムを呼び出します。スペースで区切られた10進数のリストを出力します。

明らかに最短ではありません。最速でいると安心するかもしれません。

$ 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言語(Mathematica)、40バイト

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

私は文書化されていない形式のSolve:を使用しています。変数のリストが省略されると、Solveデフォルトでは式のすべてのシンボルが解かれます。したがって、より通常の6バイトを節約しますSolve[#^2+b^2==c^2,{b,c},PositiveIntegers]

PositiveIntegersはMathematicaのバージョン12で新しく追加されたため、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]

complex absを使用して斜辺の長さを計算する簡単なソリューション。n*nなぜなら他の脚の上限として使用しても安全(n*n)^2 + n^2 < (n*n+1)^2です。代わりに再帰を使用してみましたが、何も短くなりませんでした。


2

真剣に、20バイト

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

xnorのPythonの答えと同じ戦略:where whereの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を知るための入力の因子となります。テスト:

  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

匿名の暗黙の接頭辞関数。

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

オンラインでお試しください!

×⍨ 平方(lit.の乗算セルフィー)引数

() 次の匿名暗黙関数を適用します。

argument引数を介した1の整数

引数を介してɩ整数1を 乗算します(つまり、正方形)

⊢() 引数を左引数として次の匿名暗黙関数を適用します。

  + 合計です

   のメンバー

   それ?

truth真実の数


1

Perl 5、43バイト

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

スクリプトを終了する場合xnor説明されているように、n²までの他のレッグのみを検査できるため、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²+°

オンラインでお試しください!

のいずれかを削除する良い方法を見つけることができませんでした ²3/9バイトを占めるs。それ以外の場合は非常に簡単です

説明

²           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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.