Sprawdź, czy lista jest potrójna ABC


16

Trzy dodatnie liczby całkowite A, B, C są potrójne ABC, jeśli są koprime, z A <B i spełniające relację: A + B = C

Przykłady:

  • 1, 8, 9 jest trzykrotnością ABC, ponieważ są one pierwszymi, 1 <8 i 1 + 8 = 9
  • 6, 8, 14 nie dlatego, że nie są chronione prawem autorskim
  • 7, 5, 12 nie dlatego, że 7> 5

Możesz zobaczyć tę prezentację Frits Beukers 2005, aby uzyskać więcej informacji na temat trójki ABC.

Wejście wyjście

Trzy liczby całkowite, zapisane dziesiętnie. Mogą być oddzielone wartości lub lista. Wyjście musiało być wartością prawda / fałsz, niezależnie od tego, czy trzy liczby całkowite są potrójne ABC.

Uwaga: Ważne jest przestrzeganie kolejności liczb całkowitych na liście, na przykład: 1, 8, 9nie jest uważana za tę samą listę, 9, 1, 8ani żadną inną kombinację. Więc pierwszy to potrójne ABC, a drugi nie.

Zatem A jest pierwszym elementem listy, B drugim, a C trzecim.

Przypadki testowe

Każda z poniższych list powinna wyświetlać prawdziwą wartość

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

Każda z poniższych list powinna wyświetlać wartość falsey

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

Czy wyjście musi być tylko jedną z dwóch wartości, czy może możemy wyprowadzić różne wartości prawda / fałsz dla różnych danych wejściowych?
Luis Mendo,

Myślę, że powinien być spójny: twój kod musi generować jeden rodzaj wartości prawdy / fałszu niezależnie od danych wejściowych. Ale para z prawdą / fałszem może być tym, czego chcesz, jeśli chodzi o pracę: różnicuj listy.
David

Jeśli weźmiemy dane wejściowe jako listę trzech wartości, to czy dane wejściowe muszą być w kolejności [A,B,C], czy też możemy również przyjmować dane wejściowe w kolejności [C,B,A]lub [C,A,B]?
Kevin Cruijssen

Musisz uszanować porządek, ponieważ A <B jest kryterium w wyzwaniu.
David

1
Nie sądzę, że wymaganie określonej kolejności list jest zgodne z dopuszczeniem, aby dane wejściowe były traktowane jako osobne wartości, ponieważ osobne wartości są z natury nieuporządkowane i mogą być traktowane jako lista .
Dennis

Odpowiedzi:


8

Galaretka , 10 9 bajtów

Ṫ=S×</=g/

Wypróbuj online!

Jak to działa

Ṫ=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

Haskell , 48 38 29 bajtów

-10 bajtów powodu TFeld „s gcd-trick!

-7 bajtów dzięki HPWiz za ulepszenie testu współ-pierwotności i wykrycie zbędnej przestrzeni!

-2 bajty dzięki Nimi do sugeruje Infix Operator!

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

Wypróbuj online!

Wyjaśnienie

Pierwsze dwa warunki a < bi a + b == csą dość oczywiste, trzeci wykorzystuje tegcd(a,b)=gcd(a,c)=gcd(b,c) :

Pisanie gcd(a,c)=Ua+Vc przy użyciutożsamości Bézoutai podstawieniec=a+b daje:

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

Od czasu gcd jest minimalna pozytywne rozwiązanie tego wynika, że identyczności gcd(a,b)=gcd(a,c) . Drugi przypadek jest symetryczny.


1
Ponadto uważam, że potrzebujesz tego tylko gcd a b==1. Ponieważ gcd a bdzieli a+b=c. to znaczygcd(gcd a b)c=gcd a b
H.PWiz

@HPWiz: Ach tak, oczywiście, dziękuję! Będzie zmieniać później, kiedy nie na telefon ..
ბიმო

7

Perl 6 , 33 32 bajty

-1 bajt dzięki nwellnhof

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera listę trzech liczb i zwraca wartość True lub False.

Wyjaśnienie

{                              }  # 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 bajtów

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

Wypróbuj online!

Dane wejściowe jako argumenty wiersza poleceń, dane wyjściowe w kodzie wyjścia (powoduje również wyjście na wyjściu jako efekt uboczny, ale można to zignorować).

Druga część (od początku &&(() jest dość standardowa, ale interesującym bitem jest test 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

ostatni &&można zmienić na &ze względu na pierwszeństwo
Nahuel Fouilleul

4

Java 10, 65 64 bajtów

(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 bajt dzięki @Shaggy .

Wypróbuj online.

Wyjaśnienie:

(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<2aby zapisać bajt.
Kudłaty

@Shaggy Thanks!
Kevin Cruijssen

4

05AB1E , 12 11 10 bajtów

Zaoszczędził 1 bajt dzięki Kevinowi Cruijssenowi

ÂÆ_*`\‹*¿Θ

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

ÂÆ           # 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 ?

Ups ... usunąłem mój komentarz ..>.> Więc znowu: możesz zapisać bajt, używając wielokrotności zamiast zamiany z produktem: RÆ_*`\‹*¿Θ Test Suite .
Kevin Cruijssen

@KevinCruijssen: Dzięki! Tak, zwykle kiedy masz tyle swapów, robisz coś złego: P
Emigna

3

Python 2 , 69 67 63 62 55 bajtów

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

Wypróbuj online!


Python 3 , 58 51 bajtów

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

Wypróbuj online!


-7 bajtów, dzięki H.PWiz


jest gcdw gcdlewie ważne? Co jeśli anie jest chroniony prawem autorskim c?
Jo King

2
@ jo-king Jeśli p dzieli a i c, powinien podzielić ca tak b.
David

2
@JoKing: Tak jest w tym przypadku, ale nie ogólnie (możesz to udowodnić za pomocą tożsamości Bezout).
ბიმო

Możesz gcd(a,b)gcd(a,b)a+b
pójść o

@ H.PWiz Dzięki :)
TFeld

3

Japt , 16 14 13 11 bajtów

<V¥yU «NÔr-

Spróbuj

                :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

Oto kolejne 11-bajtowe rozwiązanie, chociaż przy bliższym przyjrzeniu się nie różni się niczym od rzeczywistej logiki.
Kamil Drakari

@KamilDrakari, miał też odmianę tego na pewnym etapie. Może to być 10 bajtów, jeśli zmienne byłyby automatycznie wstawiane w >następujący sposób ©.
Kudłaty

3

JavaScript (ES6),  54 43 42  40 bajtów

gcd(a,c)

true0falsmi

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

Wypróbuj online!


1
Nie sądzę, że musisz testować gcd(c,a).
Kudłaty

@Shaggy Thanks! Przepisałem całkowicie kod.
Arnauld

3

Wolfram Language 24 30 28 26 bajtów

Z 2 bajtami ogolonymi przez Doorknob. Śpiewane przez @jaeyong kolejne 2 bajty

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

Myślę, że powinieneś być także w stanie CoprimeQ@##zaoszczędzić 2 bajty.
Klamka

@Doorknob, Jeśli pierwsza i druga liczba są chronione prawem autorskim, czy koniecznie są chronione prawami autorskimi z ich sumą?
DavidC

, ale oryginalna definicja faktycznie stwierdza, że ​​A, B i C powinny być chronione prawem autorskim. Większość odpowiedzi sprawdza tylko A i B tylko dlatego, że zwykle jest krótsza.
Klamka

Myślę, GCD@##==1że zaoszczędziłbym 2 bajty
jaeyong śpiewał

2

C # (interaktywny kompilator Visual C #) , 90 bajtów

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]

Działa dla liczb do 1e8, zajmuje około 35 sekund na moim komputerze. Zamiast obliczać gcd jak inni, funkcja tworzy po prostu ogromną tablicę i filtruje indeksy, które nie są dzielnikami a lub b, i sprawdza, ile elementów pozostało. Następnie sprawdza, czy element jeden plus element drugi równa się elementowi trzeciemu. Na koniec sprawdza, czy pierwszy element jest mniejszy niż drugi.

Wypróbuj online!



2

Reguła ECMAScript, 34 bajty

Dane wejściowe są jednostkowe, w domenie ^x*,x*,x*$(powtórzone xsą ograniczone przez ,).

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

Wypróbuj online! (Silnik regex .NET)
Wypróbuj online! (Silnik regex 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.

Pytanie brzmi: „Trzy liczby całkowite, zapisane dziesiętnie ”, więc to może się nie kwalifikować (ponieważ wymaga wprowadzenia danych jednostronnych), ale tworzy tak elegancki, czysty wyrażenie regularne, że mam nadzieję, że przynajmniej zostanie to docenione.

Należy jednak zauważyć, że jeśli frazowanie ma być dosłownie interpretowane, przesłania funkcji lambda i funkcji, które przyjmują argumenty całkowite, również powinny zostać zdyskwalifikowane, aby ściśle przestrzegać specyfikacji pytania, musiałyby przyjąć dane wejściowe w postaci łańcucha.







1

Befunge-98 (FBBI) , 83 bajty

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

Wypróbuj online!

Dane wejściowe, które są potrójnymi liczbami całkowitymi, [A,B,C]są wprowadzane do Befunge jako liczby całkowite rozdzielone spacjami C B A.


1

Mathematica 35 bajtów

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

jeśli kolejność jest ważna:

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

lub...

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

1

Retina 0.8.2 , 42 41 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Edycja: Zapisano 1 bajt dzięki @Deadcode. Wyjaśnienie:

\d+
$*

Konwertuj na unary.

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

Sprawdź, czy A i B nie mają wspólnego czynnika.

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

Sprawdź, czy A <B i A + B = C.


1
Wygląda na to, że w twoim programie jest błąd. [121, 48234375, 48234496] zwraca wartość false.
Deadcode

1
@Deadcode Naprawiono, dziękuję za poinformowanie mnie.
Neil

Podobnie jak w przypadku mojego wyrażenia regularnego, możesz upuścić 1 bajt, zmieniając ^(1+),(1+\1),\1\2$na ^(1+)(,1+\1)\2\1$.
Deadcode

1
@Deadcode Thanks! Szkoda, że ​​moje użycie operacji Retiny Atak naprawdę nie oszczędza mi żadnych bajtów.
Neil

1
@Deadcode Używam zachowania Retiny, polegającego na przekształceniu ostatniego wyrażenia regularnego w twierdzenie pozytywne (właściwie etap dopasowania (liczenie)), więc przeniesienie antygrepu kosztowałoby mnie 5 bajtów.
Neil

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.