私の三角形は正しいですか?


47

a, b, c三角形の3辺の長さを考えて、三角形が直角(つまり、1つの角度が90度に等しい)かどうかを判断します。

入力

任意の順序の 3つの正の整数値

出力

特定の真の出力(どちらかtrue1yes、...)、または特定の偽出力(false0no、...)

5, 3, 4        --> yes
3, 5, 4        --> yes
12, 37, 35     --> yes
21, 38, 50     --> no
210, 308, 250  --> no

ルール

  • 入力と出力は、任意の便利な形式で指定できます
  • 提出する際には、true値とfalse値を明記してください。
  • 負の値または無効なエッジトリプルを処理する必要はありません
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 可能であれば、他の人がコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

1
負の値または無効なエッジトリプルを処理する必要がありますか?
-user202729

2
非常に関連しています。コミュニティの残りの部分に任せて、重複かどうかを判断します。
デジタル外傷

2
私は、座標の代わりに、長さを使用すると、大幅に挑戦変わることを考える
ルイスMendo

8
21 + 5 <3821, 38, 5であるため、長さのある三角形はありません。これは、私たちが対処しなければならない意図的な病理学的症例ですか?
ケビン

1
@ケビンいいえ、あなたはこのケースを処理する必要はありません。User202729はすでにこの質問をしました:)
mdahmoune

回答:


37

ゼリー、5 バイト

²µSHe

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

技術面での注意:バイトはJellyコードページでカウントされます。

説明:

²µSHe  Main link.
²      Square each number.
 µ     With the new list,
  S    calculate its sum,
   H   and halve it.
    e  Check if the result exists in the new list (squared input)

問題は3つの数字を与えられてa, b, c、そのような順列があるかどうか尋ねることと同等ですa² + b² = c²。これは(a² + b² + c²) ÷ 2がの1つであるかどうかに等しいa², b² or c²ため、プログラムはそれをチェックするだけです。


まあ...私はゼリー。
フェリックスガニヨングレニエ

1
技術的な注意点:シンボル²µコストはそれぞれUTF-8で2バイトなので、コードには実際には5バイトではなく7バイトがあります
チャーリー

2
明確にするために編集された@Charlie Answer
user202729

20

Python 2、37バイト

a,b,c=sorted(input())
1/(a*a+b*b-c*c)

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

-2 FlipTackに感謝します
-1 Craig Gidneyに感謝します。

終了コードを介した出力(0= false、1= true)。


ああ。まったく同じ答えを見つけました。テストスイートを変更して、任意の数のテストケースを許可できます。こちらを参照してください
mbomb007

@ mbomb007うーんexec(code)、なぜexec (code)代わりにexec code?:D ;-p
エリック・ザ・アウトゴルファー

ハハ、この答えはどのようにxnorの短い方の倍の賛成票を持っていますか?たぶん人々はそれの甘い
シンプルさを好む-FlipTack

1
@FlipTack¯_(ツ)_ /¯(xnorはPython 2にもありません)
エリック・ザ・アウトゴルファー

@EriktheOutgolferボイラープレートはゴルフをする部分ではないからです。Python 2または3で動作するように作成しました。
mbomb007

17

Java 8、44バイト

(a,b,c)->(a*=a)+(b*=b)==(c*=c)|a+c==b|b+c==a

説明:

ここで試してみてください。

(a,b,c)->                // Method with three integer parameters and boolean return-type
  (a*=a)+(b*=b)==(c*=c)  //  Return if `a*a + b*b == c*c`
  |a+c==b                //  or `a*a + c*c == b*b`
  |b+c==a                //  or `b*b + c*c == a*a`
                         // End of method (implicit / single-line return-statement)

の括弧なしで動作し(c*=c)ますか?*=オーバーprecidenceがあるかもしれない==し、次の2つのバイトを保存することができます。
corsiKa

@corsiKa私はそれが逆であることを恐れています。==に優先し*=ます。=+=*=、および同様の割り当ては、実際に持っているJavaの事業者で最低の優先順位を
ケビンCruijssen

これより短いものは見つかりません。変数をスワップして、最大値がa(たとえば)割り当てられるようにしましたが、成功しませんでした。まあ、私はそれを行うことができますが、約65文字...
オリヴィエ・グレゴワール

12

JavaScript(ES6)、43 41 40バイト

1バイトを保存し、@ Neilのおかげでバグを修正しました

入力を3つの整数の配列として受け取ります。true直角およびfalseその他の場合に戻ります。

a=>a.some(n=>Math.hypot(...a,...a)==n*2)


オリジナルバージョン、44バイト

入力を3つの整数として受け取ります。1直角および0その他の場合に戻ります。

(a,b,c)=>(a*=a)+(b*=b)==(c*=c)|a+c==b|b+c==a

テストケース


私たちのように見えますが(を除いてまったく同じ答えを思い付いた=>->JavaScriptとJavaの8の差)。;)私からの明らかな+1。
ケビンCruijssen

>>1は安全ではありません。これはに対してtrueを返します[1, 1, 1]
ニール

2
どうMath.hypot(...a,...a)==n*2
ニール

とても素敵な修正:) @Neil
アルノー

2
@Neil ~=「ほぼ等しい」という演算子が必要です;)
JollyJoker


7

三角、57バイト

私はまだこの言語で見たことがなく、試してみるのが適切だと思われました。最初に頭を動かさなければならなかったので、少し時間がかかりました。

,$\:$:*/%*$"`=P:pp.0"*>/>-`:S!>/U+<U"g+..>p`S:U/U"p`!g<>/

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

これは、次の三角形に展開されます。

          ,
         $ \
        : $ :
       * / % *
      $ " ` = P
     : p p . 0 "
    * > / > - ` :
   S ! > / U + < U
  " g + . . > p ` S
 : U / U " p ` ! g <
> /

パスはかなり複雑ですが、私がやったことを説明しようと思います。方向ポインターをスキップします。ほとんどのコードはスタック操作です。

  • $:* 最初の入力を二乗します。
  • $:* 2番目の入力を2乗します。
  • S":Ug! 2番目の値が最初の値より大きいかどうかをテストします。
    • p"最初との真のスワップ。
    • false p何もしない。
  • $:* 3番目の入力を2乗します。
  • P":USg! 3番目の値が前の値よりも大きいかどうかをテストします。
    • p+U-現在のスタックを真に合計し、保存されている3番目の値を取り去る
    • p"U+-最小合計と3番目に格納され、最大から減算する
  • 0=% ゼロに等しいかどうかをテストし、結果を出力します。

6

Haskell(33 32 31バイト)

(\x->(sum x)/2`elem`x).map(^2)

元のバージョン:

(\x->2*maximum x==sum x).map(^2)

匿名関数。[a、b、c]の形式のリストを取ります。TrueまたはFalseを出力します。

最初のバージョンでは、平方の合計が最大値の2倍であるかどうかをチェックしました。

第二に、二乗和の半分が二乗リストの要素であるかどうかをわずかに改善したバージョンがチェックします。

編集:誤って改行を数えた、H.PWizに感謝


1
サイトへようこそ!この答えはたった32バイトですが、多分余分な改行を数えたでしょうか?
H.PWiz

3
関数Monadを使用して、ここで
-H.PWiz

また、周りの括弧はsum捨てることができます。いい解決策!
誇りに思ってhaskeller


6

R、31 26 30バイト

cat(sum(a<-scan()^2)/max(a)==2)

これはあまり好きではありませんが、短いです。正方形を合計し、最大の正方形で除算します。真実なら2。

以前のバージョン(catおよび@Guiseppeのヒントで修正)

cat(!sort(scan())^2%*%c(1,1,-1))

最後の項目が否定されたソート済み入力の合計を行い、!not を返します。

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


以前のバージョンの場合、 !sort(scan())^2%*%c(1,1,-1) 27バイトです。しかし、私はまだあなたが必要だと思いますcat
ジュゼッペ

乾杯@Guiseppe、猫を忘れてしまいました。REPLを取り巻くルールは私を困らせますが、それはその通りです。
MickyT

@Giuseppeまた、行列乗算との素晴らしいひねり。私はそれを思いつかなかったでしょう。
MickyT

6

Brain-Flak、68バイト

({({({})({}[()])}{}<>)<>})<>({<(({}){}<>[({})])>(){[()](<{}>)}{}<>})

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

user202729の回答の観察結果を使用します。

 {                      }      for each input number
   {({})({}[()])}{}            compute the square
  (                <>)<>       push onto second stack
(                        )     push sum of squares onto first stack
                          <>   move to second stack

 {                                    }    for each square
   (({}){}<>[({})])                        compute 2 * this square - sum of squares
  <                >(){[()](<{}>)}{}<>     evaluate loop iteration as 1 iff equal
(                                      )   push 1 if any squares matched, 0 otherwise



4

Python 2、43バイト

lambda a,b,c:(a*a+b*b+c*c)/2in(a*a,b*b,c*c)

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

パイソン279の 70 68 62バイト

lambda*l:any(A*A+B*B==C*C for A,B,C in zip(l,l[1:]+l,l[2:]+l))

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


入力が整数に制限されるようにチャレンジが更新されました。
マーティンエンダー



68バイトtio.run/...
mdahmoune

@mdahmoune 67バイト ; 真理値の意味を反転し、の-代わりに使用します==
ジョナサンフレッチ

4

C、 68  54バイト

user202729のソリューションを使用します

f(a,b,c){return!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}

14バイトのゴルフをしてくれた@Christophに感謝します!

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

C、85バイト

#define C(a,b,c)if(a*a+b*b==c*c)return 1;
f(a,b,c){C(a,b,c)C(b,c,a)C(c,a,b)return 0;}

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


1パラメータの出力1, 1, 1が間違っている
ニール

@Neil修正されました。
Steadybox

intを使用するように質問が更新され、数バイト節約される可能性があります。
corsiKa

f(a,b,c){a=!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}
クリストフ



4

三角度 49  31バイト

...)...
..IEO..
.M)2s^.
}Re+=..

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

説明

すべてのTriangularityプログラムには、三角形のパディングが必要です(しゃれを許さない)。つまり、プログラムの最後から数えてi番目の行には、両側にi-1ドット(.)を埋め込む必要があります。ドット三角形を対称的で審美的に快適に保つために、各行は2L-1文字で構成する必要があります。ここで、Lはプログラムの行数です。必要なパディングを構成する文字を削除します。コードの動作は次のとおりです。

)IEOM)2s^}Re+=     Full program. Input: STDIN, Output: STDOUT, either 1 or 0.
)                  Pushes a zero onto the stack.
 IE                Evaluates the input at that index.
   O               Sorts the ToS (Top of the Stack).
    M)2s^}         Runs the block )2s^ on a separate stack, thus squaring each.
          R        Reverse.
           e       Dump the contents separately onto the stack.
            +      Add the top two items.
             =     Check if their sum is equal to the other entry on the stack (c^2).

三角形が三角形で直角かどうかを確認しています...



3

JavaScript 34バイト(D =なし)

D=(d,[a,b,c]=d.sort())=>a*a+b*b==c*c

console.log(D([5, 3, 4       ])== true)
console.log(D([3, 5, 4       ])== true)
console.log(D([12, 37, 35    ])== true)
console.log(D([21, 38, 5     ])== false)
console.log(D([210, 308, 15  ])== false)


34でも同様の答えがありました:a=>a.sort()[0]**2+a[1]**2==a[2]**2ES6で。だからあなたに小道具@DanielIndie
WallyWest

1
残念ながら、sort()コールバックが提供されていない場合は辞書順を使用し、たとえばのコードは失敗します[10,6,8]
アーナルド

3

RProgN 2、10バイト

§²2^r]‘\+e

説明した

§²2^r]‘\+e
§           # Sort the input list
 ²2^r       # Square each element in the list.
     ]      # Duplicate it on the reg stack.
      ‘     # Pop the top (largest) element off it
       \+   # Swap it, sum the rest of the list.
         e  # Are they equal?

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


リストを複製する理由
mdahmoune

@mdahmoune RProgN2は、要素をポップするときに元のリストをスタックに保持しませんが、スタックは参照によるものであるため、スタックを維持してその合計部分を実行するには、最初にリストを複製する必要があります。
-ATaco


3

ラケット64 60バイト

(λ(a b c)(=(+(* a a)(* b b)(* c c))(*(expt(max a b c)2)2)))

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

使い方

テストの場合a^2 + b^2 + c^2の二倍の最大に等しいa^2b^2c^2

#t直角三角形および#f他のすべての入力に対して返します。


  • 使用する@xnorの提案のおかげで-4バイトexpt

素晴らしい;)しかし、私(define funはコードの一部でなければならないと思う
...-mdahmoune

ありがとうございました!私は、純粋な機能が答えとして許可されると言うのが慣習的だと思います。(define fun ...)TIOのはただ便宜のためである:私たちは同じようにだけでなく、この機能を使用することができます(... 3 4 5)どこ...の関数であるが。(したがって、必要(print (3 4 5))応じてヘッダーとフッターを使用できます。)
ミシャラヴロフ

(ただし、これは私の最初のラケット提出の1つであるため、ラケット固有の規則があるかどうかはあまり明確ではありません。ラケットを使用した過去のソリューションの#lang racket一部はコードに含まれていますが、一部は含まれていません。)
Misha Lavrov

1
ラケットは非常に冗長なので(max a b c)letバインディングを行うよりも繰り返すほうが短いでしょう?引数としてバインドする方が短いとは思わないλ?または、組み込みの累乗法はありませんか?
-xnor

2
@MishaLavrovそれではどう(*(expt(max a b c)2)2)ですか?
-xnor


3

ルビー、31バイト

->a{a,b,c=*a.sort;a*a+b*b==c*c}

入力を3つの整数のリストとして受け取ります。他のソリューションからのいくつかのアイデアを使用します。


投稿した答えがあなたのものとほとんど同じであることに気づきました。私はあなたのものをコピーしなかったと約束します(実際には「回答を投稿する」ボックスにしばらく座っていました)。
iamnotmaynard

@iamnotmaynardそれはほとんど同じことです。これは面白い偶然だった笑 お知らせいただきありがとうございます
-dkudriavtsev

可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
mdahmoune

3

ジュリア0.6、16バイト

!x=xx2x.*x

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

使い方

ましょX = [A、B、C]

x⋅xxとそれ自体の内積であるため、a²+b²+c²を生成します。

2x.*x2xxの要素単位の積であるため、[2a²、2b²、2c²]を生成します。

最後に、整数a²+b²+c²がベクトル[2a²、2b²、2c²]に属するかどうかをテストします。これは、
a²+b²+c²=2a²またはa²+b²+c²=2b²またはa²+b²+c²=2c²に当てはまります。
b²+c²=a²またはa²+c²=b²またはa²+b²=c²の場合、それ自体は真です。



3

TI-Basic、13 11 10バイト

max(Ans=R►Pr(min(Ans),median(Ans

任意の順序の入力に対して機能するようになり、同様に短くなりました。@MishaLavrovに感謝


可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
mdahmoune

これだけ検出は、直角三角形をソート:入力のA=5B=4C=3正しく処理されません。
ミシャラヴロフ

@MishaLavrovそれを指摘してくれてありがとう、実際にはリストとしての処理がより短い。現在では、任意の順序の入力に対して機能します。
ティムテック

我々は、単一のオフのままにした場合)、その後、max(Ans=R►Pr(min(Ans),median(Ans(私たちはここでやっている計算は異なるが)にも有効で、1バイト短いです。
ミシャラヴロフ

@MishaLavrov面白いですね 式はすべての非負の入力に対して同等であると思います。
ティムテック

3

CJam、9

q~$W%~mh=

オンラインで試す

説明:

q~      read and evaluate the input (given as an array)
$W%     sort and reverse the array
~       dump the array on the stack
mh      get the hypotenuse of a right triangle with the given 2 short sides
=       compare with the longer side

いくつかの説明;)?
mdahmoune

@mdahmouneここに行く
-aditsu

それをやった。あなたはその言語を書きませんでしたか?公平ではないようです。(ジョーク)
ケイン

3

パリ/ GP29 24バイト

f(v)=v~==2*vecmax(v)^2

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

からnorml2(v)への明らかな変更によって5バイトを節約しましたv*v~

他の答えに触発されました。

これは、3つの座標を持つv行ベクトルまたは列ベクトルでなければなりません。

使用例: f([3,4,5])

もちろん、たとえば、の合理的な辺の長さは無料で取得できますf([29/6, 10/3, 7/2])

f(v)=部品を数えないと、それは19バイトです。最初の部分も書き込むことができますv->(合計22バイト)。

説明:の3点の座標が場合vありxyそしてz、その後の製品vとその転置はv~スカラを与えx^2+y^2+^z^2、私たちはその座標の最大値の二倍の正方形に等しいかどうかを確認する必要がありxyz

追加:入力ベクトルに4つの座標がある場合fピタゴラスの4倍体に対して同じテストを行います。


可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
-mdahmoune

@mdahmoune このtio.runリンクを使用できます。ただし、PARI / GPをローカルにインストールする方がはるかに優れています。
ジェッペスティグニールセン

3

MS Excel、49バイト

範囲[A1:C1]から入力を取得し、呼び出しセルに出力する匿名ワークシート関数。

=OR(A1^2+B1^2=C1^2,B1^2+C1^2=A1^2,A1^2+C1^2=B1^2)

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