목록이 ABC- 트리플인지 확인


16

3 개의 양의 정수 A, B, C가 A <B이고 관계를 만족하는 코 프라임 인 경우 ABC- 트리플입니다 : A + B = C

예 :

  • 1, 8, 9 coprime이므로 ABC-triple입니다. 1 <8 및 1 + 8 = 9
  • 6, 8, 14 그들이 coprime이 아니기 때문에 아닙니다
  • 7, 5, 12 7> 5가 아니기 때문에

당신은 이것을 볼 수 있습니다 ABC 트리플에 대한 자세한 내용 Frits Beukers 2005 프레젠테이션 을 참조하십시오.

입출력

3 개의 정수, 10 진수로 작성되었습니다. 값 또는 목록을 구분할 수 있습니다. 세 정수가 ABC- 트리플인지 여부에 대한 결과는 진실 / 거짓 값이어야합니다.

참고 : 목록에서 정수 순서를 존중하는 것이 중요합니다. 예를 들면 다음 1, 8, 9과 같습니다.9, 1, 8 또는 다른 조합 . 첫 번째는 ABC- 트리플이고 두 번째는 그렇지 않습니다.

따라서 A는 목록의 첫 번째 요소이고 B는 두 번째이고 C는 세 번째입니다.

테스트 사례

다음 각 목록은 정확한 값을 출력해야합니다

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

다음 각 목록은 잘못된 값을 출력해야합니다.

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

출력이 두 값 중 하나 여야합니까, 아니면 다른 입력에 대해 다른 진실 / 거짓 값을 출력 할 수 있습니까?
Luis Mendo

일관성이 있어야한다고 생각합니다. 코드는 입력에 관계없이 한 종류의 진실 / 거짓 값을 출력해야합니다. 그러나 진실 / 거짓 커플은 업무를 수행하는 한 원하는 것, 즉 목록을 차별화 할 수 있습니다.
david

입력 값을 3 개의 값 목록으로 가져 오면 입력 값이 순서대로되어 있어야합니까 [A,B,C], 아니면 입력 값을 순서대로 가져 [C,B,A]가도 [C,A,B]됩니까?
Kevin Cruijssen

A <B가 도전 과제의 기준이므로 순서를 존중해야합니다.
david

1
별도의 값이 본질적으로 정렬되지 않고 목록으로 간주 될 수 있으므로 특정 목록 순서를 요구하는 것이 입력을 별도의 값으로 허용하는 것과 호환되지 않는다고 생각 합니다 .
Dennis

답변:


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

하스켈 , 48 38 29 바이트

TFeldgcd트릭 으로 인해 -10 바이트 !

공동 우선 순위 테스트를 개선하고 불필요한 공간을 발견 한 HPWiz 덕분에 -7 바이트 !

infix-operator를 제안한 nimi 덕분에 -2 바이트 !

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

온라인으로 사용해보십시오!

설명

처음 두 상태 a < ba + b == c저, 세번째 용도 상당히 명백하다 gcd(a,b)=gcd(a,c)=gcd(b,c) :

Bézout의 아이덴티티를 사용하여 gcd(a,c)=Ua+Vc 을 쓰고 c = a + b로 대체 하면 다음과 같습니다.c=a+b

Ua+V(a+b)=(U+V)a+Vb

이후 GCD은 그 신원 최소 양의 용액 인 것이 그 다음 GCD ( , B ) = GCD ( , C를 ) . 다른 경우는 대칭입니다. gcdgcd(a,b)=gcd(a,c)


1
또한, 당신은 그게 필요하다고 생각합니다 gcd a b==1. gcd a b나누기 때문에 a+b=c. 즉gcd(gcd a b)c=gcd a b
H.PWiz

@HPWiz : 아, 물론 감사합니다! 모바일에 없을 때 나중에 편집합니다.
ბიმო

7

펄 6 , 33 32 바이트

nwellnhof 덕분에 -1 바이트

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

온라인으로 사용해보십시오!

세 개의 숫자 목록을 가져와 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에서 부작용으로 출력을 생성하지만 무시할 수 있음).

에서 시작하는 두 번째 부분 &&((은 꽤 표준이지만 재미있는 부분은 코 프라임 테스트입니다.

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

자바 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;}

@Shaggy 에게 -1 바이트 감사합니다 .

온라인으로 사용해보십시오.

설명:

(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 감사합니다!
Kevin Cruijssen 님이

4

05AB1E , 12 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Æ_*`\‹*¿Θ Test Suite .
Kevin Cruijssen

@ KevinCruijssen : 감사합니다! 예, 일반적으로 스왑이 많을 때 뭔가 잘못하고 있습니다 : P
Emigna

3

파이썬 2 , 69 67 63 62 55 바이트

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

온라인으로 사용해보십시오!


파이썬 3 , 58 51 바이트

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

온라인으로 사용해보십시오!


H.PWiz 덕분에 -7 바이트


는 IS gcdgcd트릭은 유효? acoprime이 아닌 경우 어떻게 c합니까?
Jo King

2
@ jo-king p가 a와 c를 나누면 ca를 b로 나눕니다.
david

2
@JoKing :이 경우에는 일반적이지만 그렇지 않습니다 (Bezout의 ID를 통해 증명할 수 있음).
ბიმო

당신은 한 단계 더 사용이 걸릴 수 gcd(a,b)있기 때문에, gcd(a,b)분할a+b
H.PWiz

@ H.PWiz 감사합니다 :)
TFeld

3

Japt , 16 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

Here is another 11 byte solution, though on closer inspection it isn't much different from yours in its actual logic.
Kamil Drakari

@KamilDrakari, had a variation on that at one stage, too. It could be 10 bytes if variables were auto-inserted when > follows ©.
Shaggy

3

JavaScript (ES6),  54 43 42  40 bytes

Thanks to @Shaggy for pointing out that we don't need to compute gcd(a,c). Saved 11 bytes by rewriting the code accordingly.

Takes input as 3 separate integers. Returns true for an ABC-triple, or either 0 or false otherwise.

f=(a,b,c)=>c&&a/b|a+b-c?0:b?f(b,a%b):a<2

Try it online!


1
I don't think you need to test gcd(c,a).
Shaggy

@Shaggy Thanks! I've rewritten the code entirely.
Arnauld

3

Wolfram Language 24 30 28 26 bytes

With 2 bytes shaved by Doorknob. A further 2 bytes shaved off by @jaeyong sung

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

I think you should also be able to use CoprimeQ@## to save 2 bytes.
Doorknob

@Doorknob, If the first and second numbers are coprime, are they necessarily coprime with their sum?
DavidC

They are, but the original definition actually states that A, B, and C should be coprime. Most answers check only A and B just because it's usually shorter.
Doorknob

I think GCD@##==1 would save 2 bytes
jaeyong sung

2

C# (Visual C# Interactive Compiler), 90 bytes

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]

Runs for numbers up to 1e8, takes about 35 seconds on my machine. Instead of calculating the gcd like others, the function just instantiate a huge array and filter the indexes that aren't divisors of a or b, and check how many elements are left. Next it check if element one plus element two equals element three. Lastly, it checks if the first element is less than the second.

Try it online!



2

ECMAScript Regex, 34 bytes

Input is in unary, in the domain ^x*,x*,x*$ (repeated xs delimited by ,).

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

Try it online! (.NET regex engine)
Try it online! (SpiderMonkey regex engine)

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

The question does say "Three integers, decimal written", so this might not qualify (as it takes input in unary), but it makes for such an elegant pure regex that I hope it will at least be appreciated.

However, note that if the phrasing is to be literally interpreted, lambda and function submissions that take integer arguments are to be disqualified too, as to strictly adhere to the question's specification they would need to take the input in the form of a string.





1

Clean, 43 bytes

import StdEnv
$a b c=a<b&&a+b==c&&gcd a b<2

Try it online!

Similar to basically everything else because the direct test is the same.



1

Befunge-98 (FBBI), 83 bytes

&:&:03p&:04pw>03g04g\:v_1w03g04g+w1.@
00:    7j@.0[^j7      _^;>0.@;j7;>0.@;:%g00\p

Try it online!

The input which is a triple of integers [A,B,C] is feeded into Befunge as space-separated integers C B A.


1

Mathematica 35 bytes

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

if order is important:

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

or...

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

1

Retina 0.8.2, 42 41 bytes

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

Try it online! Link includes test cases. Edit: Saved 1 byte thanks to @Deadcode. Explanation:

\d+
$*

Convert to unary.

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

Check that A and B have no common factor.

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

Check that A < B and A + B = C.


1
There appears to be a bug in your program. [121, 48234375, 48234496] is returning false.
Deadcode

1
@Deadcode Fixed, thanks for letting me know.
Neil

As with my regex, you can drop 1 byte by changing ^(1+),(1+\1),\1\2$ to ^(1+)(,1+\1)\2\1$.
Deadcode

1
@Deadcode Thanks! It's a shame that my use of Retina's A operation doesn't actually save me any bytes.
Neil

1
@Deadcode I'm using Retina's behaviour of turning the last regex into a positive assertion (actually a (count of) match stage) so moving the antigrep would cost me 5 bytes.
Neil

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.