Averigua si una lista es un ABC-triple

16

Tres enteros positivos A, B, C son ABC-triples si son coprimos, con A <B y satisfaciendo la relación: A + B = C

Ejemplos:

  • 1, 8, 9 es un ABC-triple ya que son coprimos, 1 <8 y 1 + 8 = 9
  • 6, 8, 14 no es porque no son coprimos
  • 7, 5, 12 no es porque 7> 5

Puede ver esta presentación de Frits Beukers 2005 para obtener más detalles sobre ABC-triples.

De entrada y salida

Tres enteros, decimal escrito. Se pueden separar los valores o la lista. La salida tenía que ser un valor verdadero / falso si los tres enteros son un triple ABC.

Nota: Es importante respetar el orden de los enteros en la lista, por ejemplo: 1, 8, 9no se considera como la misma lista 9, 1, 8o cualquier otra combinación. Entonces, el primero es un ABC-triple y el segundo no.

Así, A es el primer elemento de la lista, B el segundo y C el tercero.

Casos de prueba

Cada una de las siguientes listas debe generar un valor verdadero

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

Cada una de las siguientes listas debe generar un valor falsey

[1, 1, 2]
[1, 2, 5]
[1, 9, 8]
[4, 12872682, 12872686]
[6, 8, 14]
[7, 5, 12]
david
fuente
¿La salida tiene que ser solo uno de los dos valores, o podemos generar diferentes valores de verdad / falsedad para diferentes entradas?
Luis Mendo
Creo que debería ser coherente: su código debe generar un tipo de valores de verdad / falsedad, independientemente de la entrada. Pero la pareja de verdad / falsedad puede ser lo que quieres en lo que hace el trabajo: diferenciar las listas.
David
Si tomamos la entrada como una lista de tres valores, ¿la entrada tiene que estar en el orden [A,B,C], o también se nos permite tomar la entrada en el orden [C,B,A]o [C,A,B]?
Kevin Cruijssen
Debe respetar el orden ya que A <B es un criterio en el desafío.
David
1
No creo que requerir un orden de lista particular sea compatible con permitir que la entrada se tome como valores separados, ya que los valores separados están inherentemente desordenados y pueden tomarse como una lista .
Dennis

Respuestas:

8

Jalea , 10 9 bytes

Ṫ=S×</=g/

Pruébalo en línea!

Cómo funciona

Ṫ=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).
Dennis
fuente
8

Haskell , 48 38 29 bytes

-10 bytes debido a TFeld 's gcdtruco!

-7 bytes gracias a HPWiz por mejorar la prueba de co-primalidad y detectar un espacio superfluo.

-2 bytes gracias a nimi por sugerir un operador infijo!

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

Pruébalo en línea!

Explicación

Las dos primeras condiciones a < by a + b == cson bastante obvias, la tercera usos que gcd(a,b)=gcd(a,c)=gcd(b,c) :

Escribir gcd(a,c)=Ua+Vc usando la identidad de Bézout y sustituyendo c=a+b da:

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

Dado que el gcd es la solución positiva mínima para esa identidad, se deduce que gcd(a,b)=gcd(a,c) . El otro caso es simétrico.

ბიმო
fuente
1
Además, creo que solo necesitas eso gcd a b==1. Ya que gcd a bdivide a+b=c. es decirgcd(gcd a b)c=gcd a b
H.PWiz
@ HPWiz: Ah sí, por supuesto, ¡gracias! Se editará más tarde cuando no esté en el móvil ..
ბიმო
7

Perl 6 , 33 32 bytes

-1 byte gracias a nwellnhof

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

Pruébalo en línea!

Bloque de código anónimo que toma una lista de tres números y devuelve Verdadero o Falso.

Explicación

{                              }  # 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
Jo King
fuente
2
32 bytes
nwellnhof
5

Excel, 33 bytes

=AND(A1+B1=C1,GCD(A1:C1)=1,A1<B1)
Wernisch
fuente
4

bash, 61 bytes

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

Pruébalo en línea!

Ingrese como argumentos de línea de comando, elabore en el código de salida (también produce resultados en stdout como efecto secundario, pero esto puede ignorarse)

La segunda parte (a partir de &&(() es bastante estándar, pero lo interesante es la prueba 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
Pomo de la puerta
fuente
el último &&puede cambiarse &por precedencia
Nahuel Fouilleul
4

Java 10, 65 64 bytes

(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 byte gracias a @Shaggy .

Pruébalo en línea.

Explicación:

(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
Kevin Cruijssen
fuente
a==1-> a<2para guardar un byte.
Shaggy
@ Shaggy Gracias!
Kevin Cruijssen
4

05AB1E , 12 11 10 bytes

Guardado 1 byte gracias a Kevin Cruijssen

ÂÆ_*`\‹*¿Θ

Pruébalo en línea! o como un conjunto de pruebas

Explicación

ÂÆ           # 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 ?
Emigna
fuente
¡Vaya! ... eliminé mi comentario ...>.> Así que de nuevo: puede guardar un byte usando múltiplos en lugar de intercambios con el producto: RÆ_*`\‹*¿Θ Test Suite .
Kevin Cruijssen
@KevinCruijssen: ¡Gracias! Sí, por lo general cuando tienes tantos intercambios, estás haciendo algo mal: P
Emigna
3

Python 2 , 69 67 63 62 55 bytes

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

Pruébalo en línea!


Python 3 , 58 51 bytes

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

Pruébalo en línea!


-7 bytes, gracias a H.PWiz

TFeld
fuente
es el gcdde gcdtruco válida? ¿Qué pasa si ano es coprime c?
Jo King
2
@ jo-king Si p divide a y c, debería dividir ca así que b.
David
2
@JoKing: es en este caso, pero no en general (puede probarlo a través de la identidad de Bezout).
ბიმო
Puede ir un paso más allá y usar gcd(a,b), ya que gcd(a,b)dividea+b
ir
@ H.PWiz Gracias :)
TFeld
3

Japt , 16 14 13 11 bytes

<V¥yU «NÔr-

Intentalo

                :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
Lanudo
fuente
Aquí hay otra solución de 11 bytes, aunque en una inspección más cercana no es muy diferente de la suya en su lógica real.
Kamil Drakari
@KamilDrakari, también tuvo una variación en eso en una etapa. Podría ser de 10 bytes si las variables se insertan automáticamente cuando se >indica a continuación ©.
Shaggy
3

JavaScript (ES6),  54 43 42  40 bytes

mcd(un,C)

trtumi0 0Funlsmi

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

Pruébalo en línea!

Arnauld
fuente
1
No creo que necesites hacer una prueba gcd(c,a).
Shaggy
@ Shaggy Gracias! He reescrito el código por completo.
Arnauld
3

Wolfram Language 24 30 28 26 bytes

Con 2 bytes afeitados por Doorknob. @Jaeyong sung eliminó otros 2 bytes

#<#2&&GCD@##==1&&#+#2==#3&
DavidC
fuente
Creo que también deberías poder usar CoprimeQ@##para guardar 2 bytes.
Pomo de la puerta
@Doorknob, si el primer y el segundo número son coprimos, ¿son necesariamente coprimos con su suma?
DavidC
Lo son , pero la definición original en realidad establece que A, B y C deben ser coprimos. La mayoría de las respuestas verifican solo A y B solo porque generalmente son más cortas.
Pomo de la puerta
Creo GCD@##==1que ahorraría 2 bytes
jaeyong cantó
2

C # (compilador interactivo de Visual C #) , 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]

Corre para números de hasta 1e8, toma alrededor de 35 segundos en mi máquina. En lugar de calcular el mcd como otros, la función solo crea una instancia de una gran matriz y filtra los índices que no son divisores de aob, y comprueba cuántos elementos quedan. Luego verifique si el elemento uno más el elemento dos es igual al elemento tres. Por último, comprueba si el primer elemento es menor que el segundo.

Pruébalo en línea!

Encarnación de la ignorancia
fuente
2

ECMAScript Regex, 34 bytes

La entrada está en unario, en el dominio ^x*,x*,x*$(repetido xs delimitado por ,).

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

Pruébalo en línea! (.NET regex engine) ¡
Pruébelo en línea! (Motor de expresiones regulares 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.

La pregunta dice "Tres enteros, decimales escrito", por lo que esto podría no calificar (ya que toma la entrada en unario), pero hace una expresión regular pura tan elegante que espero que al menos sea apreciada.

Sin embargo, tenga en cuenta que si la redacción se interpreta literalmente, las presentaciones lambda y de función que toman argumentos enteros también deben ser descalificadas, para cumplir estrictamente con la especificación de la pregunta, tendrían que tomar la entrada en forma de una cadena.

Código muerto
fuente
1

Limpio , 43 bytes

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

Pruébalo en línea!

Básicamente similar a todo lo demás porque la prueba directa es la misma.

Οurous
fuente
1

Mathematica 35 bytes

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

si el orden es importante:

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

o...

And[CoprimeQ @@ #, Sort@# == #, #[[1]] + #[[2]] == #[[3]]] &
David G. Stork
fuente
1

Retina 0.8.2 , 42 41 bytes

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

Pruébalo en línea! El enlace incluye casos de prueba. Editar: guardado 1 byte gracias a @Deadcode. Explicación:

\d+
$*

Convierte a unario.

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

Verifique que A y B no tengan un factor común.

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

Verifique que A <B y A + B = C.

Neil
fuente
1
Parece que hay un error en su programa. [121, 48234375, 48234496] está devolviendo falso.
Código muerto el
1
@Deadcode fijo, gracias por avisarme.
Neil
Al igual que con mi expresión regular, puede soltar 1 byte cambiando ^(1+),(1+\1),\1\2$a ^(1+)(,1+\1)\2\1$.
Código muerto el
1
@Deadcode ¡Gracias! Es una pena que mi uso de la Aoperación de Retina no me ahorre bytes.
Neil
1
@Deadcode Estoy usando el comportamiento de Retina de convertir la última expresión regular en una afirmación positiva (en realidad, una etapa de conteo), por lo que mover el antigrep me costaría 5 bytes.
Neil