リストがABCトリプルかどうかを調べる


16

3つの正の整数A、B、Cは、互いに素であり、A <Bであり、次の関係を満たす場合、ABCトリプルです:A + B = C

例:

  • 1, 8, 9 互いに素であるため、ABCトリプルです。1<8および1 + 8 = 9
  • 6, 8, 14 それらは互いに素ではないからではありません
  • 7, 5, 12 7> 5のためではありません

ABCトリプルの詳細については、このFrits Beukers 2005のプレゼンテーションをご覧ください。

入出力

10進表記の3つの整数。値またはリストを区切ることができます。3つの整数がABCトリプルであるかどうかにかかわらず、出力は真偽値でなければなりませんでした。

注:リスト内の整数の順序を尊重することが重要です。たとえば、:1, 8, 9は同じリスト9, 1, 8または他の組み合わせとは見なされません。したがって、最初はABCトリプルであり、2番目はそうではありません。

したがって、Aはリストの最初の要素、Bは2番目、Cは3番目の要素です。

テストケース

次の各リストは、真の値を出力する必要があります

[1, 8, 9]
[2, 3, 5]
[2, 6436341, 6436343]
[4, 121, 125]
[121, 48234375, 48234496]

次の各リストは、false値を出力する必要があります

[1, 1, 2]
[1, 2, 5]
[1, 9, 8]
[4, 12872682, 12872686]
[6, 8, 14]
[7, 5, 12]

出力は2つの値のうちの1つのみである必要がありますか、または異なる入力に対して異なる真偽値を出力できますか?
ルイスメンドー

私はそれが一貫しているべきだと思う:あなたのコードは、入力が何であれ、ある種の真実/偽の値を出力しなければならない。しかし、真実/偽りのカップルは、仕事をする限り、あなたが望むものになることができます:リストを差別化します。
デビッド

入力を3つの値のリストとして取得する場合、入力は次の順序[A,B,C]である必要がありますか、[C,B,A]それとも入力を次の順序で取得することもでき[C,A,B]ますか?
ケビンクルーイッセン

A <Bはチャレンジの基準であるため、順序を尊重する必要があります。
デビッド

1
私は、特定のリストの順序を必要とする別の値は、本質的に無秩序であり、入力は、別々の値として解釈されることを可能と互換性があるとは思わないリストとしてもよいです
デニス

回答:


8

ゼリー10 9バイト

Ṫ=S×</=g/

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

使い方

Ṫ=S×</=g/  Main link. Argument: [a, b, c] (positive integers)

Ṫ          Tail; pop and yield c.
  S        Take the sum of [a, b], yielding (a + b).
 =         Yield t := (c == a + b).
    </     Reduce by less than, yielding (a < b).
   ×       Multiply, yielding t(a < b).
       g/  Reduce by GCD, yielding gcd(a, b).
      =    Check if t(a < b) == gcd(a, b).

8

Haskell48 38 29バイト

TFeldgcdトリックにより-10バイト!

共原性テストを改善し、余分なスペースを見つけてくれたHPWizに感謝します!

-infix -operatorを提案してくれたnimiに感謝します!

(a!b)c=a<b&&a+b==c&&gcd a b<2

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

説明

最初の2つの条件a < bとはa + b == c、第1の用途はかなり明白であるそのgcdab=gcdac=gcdbc

書き込みgcdac=うんa+Vc使用ベズーの等式をし、代わりにc=a+b得られます。

うんa+Va+b=うん+Va+Vb

以来、GCDは、そのIDに最小の正の解であるその次のGCDをB = GCD C 。他のケースは対称的です。 gcdgcdab=gcdac


1
また、必要なのはそれだけだと思いますgcd a b==1gcd a b分割するのでa+b=c。すなわちgcd(gcd a b)c=gcd a b
H.PWiz

@HPWiz:ああ、もちろん、ありがとう!モバイル以外の場合は後で編集します。
ბიმო

7

Perl 6の33の 32バイト

nwellnhofのおかげで-1バイト

{(.sum/.[2]/2*[<] $_)==[gcd] $_}

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

3つの数字のリストを受け取り、TrueまたはFalseを返す匿名コードブロック。

説明

{                              }  # Anonymous code block
                       [gcd] $_   # Is the gcd of all the numbers
 (                  )==           # Equal to
  .sum        # Whether the sum of numbes
      /       # Is equal to
       .[2]/2 # The last element doubled
             *[<] $_   # And elements are in ascending order



4

bash、61バイト

factor $@|grep -vzP '( .+\b).*\n.*\1\b'&&(($1<$2&&$1+$2==$3))

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

コマンドライン引数としての入力、終了コードでの出力(副作用としてstdoutでの出力も生成されますが、これは無視できます)。

2番目の部分(から始まる&&(()はかなり標準ですが、興味深い部分はcoprimeテストです:

factor $@      # produces output of the form "6: 2 3\n8: 2 2 2\n14: 2 7\n"
|grep -        # regex search on the result
v              # invert the match (return truthy for strings that don't match)
z              # zero-terminated, allowing us to match newlines
P              # perl (extended) regex
'( .+\b)'      # match one or more full factors
'.*\n.*'       # and somewhere on the next line...
'\1\b'         # find the same full factors

最後に優先順位を&&変更する&ことができます
Nahuel Fouilleul

4

Java 10、65 64バイト

(a,b,c)->{var r=a<b&a+b==c;for(;b>0;a=b,b=c)c=a%b;return r&a<2;}

-1バイトは@Shaggyに感謝します

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

説明:

(a,b,c)->{        // Method with three integer parameters and boolean return-type
  var r=          //  Result-boolean, starting at:
        a<b       //   Check if `a` is smaller than `b`
        &a+b==c;  //   And if `a+b` is equal to `c`
  for(;b>0        //  Then loop as long as `b` is not 0 yet
      ;           //    After every iteration:
       a=b,       //     Set `a` to the current `b`
       b=c)       //     And set `b` to the temp value `c`
    c=a%b;        //   Set the temp value `c` to `a` modulo-`b`
                  //   (we no longer need `c` at this point)
  return r        //  Return if the boolean-result is true
         &a<2;}   //  And `a` is now smaller than 2

a==1-> a<2バイトを保存します。
シャギー

@Shaggyありがとう!
ケビンクルーイッセン

4

05AB1E12 11 10バイト

Kevin Cruijssenのおかげで1バイト節約

ÂÆ_*`\‹*¿Θ

オンラインでお試しください! またはテストスイートとして

説明

ÂÆ           # reduce a reversed copy of the input by subtraction
  _          # logically negate
   *         # multiply with input
    `        # push the values of the resulting list separately to stack
     \       # remove the top (last) value
      ‹      # is a < b ?
       *     # multiply by the input list
        ¿    # calculate the gcd of the result
         Θ   # is it true ?

おっと..>私のコメントを削除>だから、再び:あなたは、製品に倍数の代わりに、スワップを使用してバイトを保存することができます:RÆ_*`\‹*¿Θ テストスイート
ケビンクルーイッセン

@KevinCruijssen:ありがとう!ええ、通常、
それほど

3

Pythonの269の 67 63 62 55バイト

lambda a,b,c:(c-b==a<b)/gcd(a,b)
from fractions import*

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


Pythonの358の 51バイト

lambda a,b,c:(c-b==a<b)==gcd(a,b)
from math import*

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


-7バイト、H.PWizのおかげ


gcdgcd有効なトリック?aが互いに素でない場合はどうなりcますか?
ジョーキング

2
@ jo-king pがaとcを分割する場合、caとbを分割する必要があります。
デビッド

2
@JoKing:これはこの場合ですが、一般的ではありません(BezoutのIDで証明できます)。
ბიმო

あなたはさらに一歩と使用のそれを取ることができるgcd(a,b)ため、gcd(a,b)分裂a+b
H.PWiz

@ H.PWizありがとう:)
TFeld

3

Japt16 14 13 11バイト

<V¥yU «NÔr-

それを試してみてください

                :Implicit input of integers U=A, V=B & W=C
<V              :Is U less than V?
  ¥             :Test that for equality with
   yU           :The GCD of V & U
      «         :Logical AND with the negation of
       N        :The array of inputs
        Ô       :Reversed
         r-     :Reduced by subtraction

ここにもう1つの11バイトのソリューションがありますが、詳細に調べてみると、実際のロジックはお客様のものとそれほど変わりません。
カミルドラカリ

@KamilDrakariも、ある段階でそれを変えました。変数が次の場合に自動挿入された場合、10バイトになる可能性があり>ます©
シャギー


3

Wolfram言語24 30 28 26バイト

Doorknobによって削られた2バイト。@jaeyong sungによって削られたさらに2バイト

#<#2&&GCD@##==1&&#+#2==#3&

またCoprimeQ@##、2バイトの節約にも使用できるはずです。
ドアノブ

@Doorknob、最初と2番目の数値が互いに素である場合、それらは必然的にそれらの合計と互いに素ですか?
DavidC

それらはですが、元の定義では実際にA、B、およびCは互いに素であるべきであると述べています。ほとんどの回答では、AとBのみがチェックされるのは、それが通常短いためです。
ドアノブ

私が考えるGCD@##==12つのバイトを救う
歌わjaeyong

2

C#(Visual C#Interactive Compiler)、90バイト

n=>new int[(int)1e8].Where((_,b)=>n[0]%++b<1&n[1]%b<1).Count()<2&n[0]+n[1]==n[2]&n[0]<n[1]

1e8までの数字で実行され、私のマシンでは約35秒かかります。他のようにgcdを計算する代わりに、この関数は巨大な配列をインスタンス化し、aまたはbの約数ではないインデックスをフィルタリングし、残っている要素の数を確認します。次に、要素1と要素2が要素3と等しいかどうかを確認します。最後に、最初の要素が2番目の要素より小さいかどうかをチェックします。

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



2

ECMAScript正規表現、34バイト

入力は、ドメイン内で単項になります^x*,x*,x*$xsで区切られた繰り返しs ,)。

^(?!(xx+)\1*,\1+,)(x*)(,\2x+)\3\2$

オンラインでお試しください!(.NET正規表現エンジン)
オンラインでお試しください!(SpiderMonkey正規表現エンジン)

# see /codegolf/178303/find-if-a-list-is-an-abc-triple
^
(?!                # Verify that A and B are coprime. We don't need to include C in the
                   # test, because the requirement that A+B=C implies that A,B,C are
                   # mutually comprime if and only if A and B are coprime.
    (xx+)\1*,\1+,  # If this matches, A and B have a common factor \1 and aren't coprime.
)
(x*)(,\2x+)\3\2$   # Verify that A<B and A+B=C. The first comma is captured in \3 and
                   # reused to match the second comma, saving one byte.

質問は「3つの整数、10進数で書かれている」と言うので、これは修飾されないかもしれません(単項で入力を受け取るため)が、それは少なくとも感謝されることを願っています。

ただし、フレージングが文字通り解釈される場合、整数引数を取るラムダおよび関数のサブミッションも失格となることに注意してください。質問の仕様に厳密に従うため、文字列の形式で入力を取得する必要があります。








1

Mathematica 35バイト

CoprimeQ @@ # && #[[1]] + #[[2]] == #[[3]] & 

順序が重要な場合:

CoprimeQ @@ # && Sort[#]==# && #[[1]] + #[[2]] == #[[3]] & 

または...

And[CoprimeQ @@ #, Sort@# == #, #[[1]] + #[[2]] == #[[3]]] &

1

網膜0.8.242の 41バイト

\d+
$*
A`^(11+)\1*,\1+,
^(1+)(,1+\1)\2\1$

オンラインでお試しください!リンクにはテストケースが含まれます。編集:@Deadcodeのおかげで1バイト保存されました。説明:

\d+
$*

単項に変換します。

A`^(11+)\1*,\1+,

AとBに共通の要因がないことを確認してください。

^(1+)(,1+\1)\2\1$

A <BおよびA + B = Cであることを確認します。


1
プログラムにバグがあるようです。[121、48234375、48234496]はfalseを返しています。
デッドコード

1
@Deadcode修正、知らせてくれてありがとう。
ニール

私の正規表現と同様に、に変更^(1+),(1+\1),\1\2$することで1バイトをドロップできます^(1+)(,1+\1)\2\1$
デッドコード

1
@Deadcodeありがとう!RetinaのA操作を使用しても実際にバイトが節約されないのは残念です。
ニール

1
@Deadcode最後の正規表現を肯定的なアサーション(実際には(カウント)マッチステージ)に変えるというRetinaの動作を使用しているため、antigrepを移動すると5バイトかかります。
ニール

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