Diferencia de tres enteros de entrada


30

Implemente una función diff que tome como entrada tres enteros x, y y z. Debería devolver si restar uno de estos números de otro da el tercero.

Test cases:
diff(5, 3, 2) yields True because 5 - 3 = 2
diff(2, 3, 5) yields True because 5 - 3 = 2
diff(2, 5, 3) yields True because 5 - 3 = 2
diff(-2, 3, 5) yields True because 3 - 5 is -2
diff(-5, -3, -2) # -5 - -2 is -3
diff(2, 3, -5) yields False
diff(10, 6, 4) yields True because 10 - 6 = 4
diff(10, 6, 3) yields False

No tiene que nombrar la función, puede implementar métodos de entrada predeterminados. Los ejemplos anteriores no son una guía estricta.


55
Este es un desafío razonable, pero no es necesario restringirlo a Python o sus funciones. En general, tales restricciones están mal vistas porque limitan la participación. Además, debe incluir algunos casos de prueba.
xnor

Oye, lo arreglé un poco. Espero que esto sea suficiente!
Mir

2
¡Se ve mejor! Todavía recomiendo encarecidamente permitir los métodos de entrada predeterminados , en programas particulares, porque algunos idiomas no tienen funciones. Y, permitiendo que las funciones tengan otro nombre o ningún nombre.
xnor

El primer y el último párrafo ahora están en conflicto, así que solo para verificar dos veces: ¿tenemos que escribir una función o los programas completos están bien?
Sp3000

los programas completos están bien, quiero imponer la menor cantidad de restricciones posible, excepto que se siguen los métodos de entrada predeterminados. ¡Los ejemplos de python3 son geniales!
Mir

Respuestas:


14

Jalea , 5 3 bytes

¡Gracias a @ Sp3000 por guardar dos bytes!

Code, utiliza el mismo algoritmo que la gran respuesta de @ xnor :

SfḤ

Explicación:

S     # Sum of the argument list
  Ḥ   # Double the list
 f    # Filter, remove everything that isn't equal to the sum of the list

Esto da []como falso, y cualquier otra cosa como verdad.

Pruébalo en línea!


51

Python 3, 21 bytes

lambda*l:sum(l)/2in l

Si dos números se suman al otro, la suma de los tres será el doble de ese otro número, por lo que la mitad de la suma será un elemento de la lista. Python 3 es necesario para evitar la división del piso, a menos que los números se den como en 3.0lugar de 3.


7

ES6, 31 bytes

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

Agregue 5 bytes si necesita nombrar la función diff.

Editar: Guardado 2 bytes gracias a @Alex L.


Puede guardar dos bytes reemplazando ||con |(creo)
HyperNeutrino

@AlexL. Ah, claro, estaba demasiado obsesionado con tener que devolver los booleanos.
Neil

Incluso con booleanos, |devuelve un booleano si y solo si ambos valores son booleanos. Entonces true | false == true, pero 3 | 5 == 7. Lo mismo se aplica &&y &. La única diferencia entre |y ||cuando se trata de booleanos: |tomará el primer valor y el segundo valor y encontrará el OR de esos dos. ||tomará el primer valor; si es cierto, devuelve true, de lo contrario, devuelve el segundo valor.
HyperNeutrino

@AlexL. true | falseevalúa a 1 en JavaScript (que es verdad, pero no booleano).
Neil

Oh. Lo siento, realmente no uso JS. Principalmente uso Java, que es de donde obtuve esa información. ;)
HyperNeutrino

4

APL, 8 5 bytes

+/∊+⍨

Este es un tren de funciones monádicas que acepta una matriz y devuelve un valor booleano (0/1 en APL). Utiliza el mismo algoritmo que la respuesta Python 3 de xnor .

Explicación:

   +⍨  ⍝ Double the input (+⍨x is the same as x+x)
  ∊    ⍝ Test the membership of
+/     ⍝ The sum of the input

Pruébalo en línea

¡Guardado 3 bytes gracias a Dennis!


4

JavaScript ES6, 38 34 33 bytes

x=>x.some(a=>2*a==x[0]+x[1]+x[2])

Función anónima muy simple, y toma prestada de la respuesta de Python. Toma la entrada xcomo una matriz; vuelve trueo false. Bytes afeitados a Molarmanful y Jrich

Un programa de 38 bytes, tomando cada número como argumento:

(a,b,c)=>[a,b,c].some(t=>t==(a+b+c)/2)

Intenta x=>x.some(a=>a==eval(x.join`+`)/2), lo que ahorra 4 bytes.
Mama Fun Roll

@ ӍѲꝆΛҐӍΛПҒЦꝆ ¡Gracias! Buen truco.
Conor O'Brien

x=>x.some(a=>2*a==x[0]+x[1]+x[2])parece funcionar.
jrich

@jrich Gracias! ¡Buen truco!
Conor O'Brien

3

Oracle SQL 11.2, 49 bytes

SELECT 1 FROM DUAL WHERE(:1+:2+:3)/2IN(:1,:2,:3);

Reescribe la solución @xnor, felicitaciones a él.


3

J, 6 bytes

+/e.+:

Prueba con J.js .

Cómo funciona

+/e.+:    Monadic verb. Argument: A
    +:    Double the elements of A.
+/        Compute the sum of the elements of A.
  e.      Test for membership.

3

DUP , 31 caracteres / 39 bytes

[2ø2ø2ø++2/\%3ø^=3ø2ø=3ø3ø=||.]

Try it here!

¡Mi primera presentación de DUP! Unicode es tu ostra.

Es una función anónima / lambda. Uso:

5 3 2[2ø2ø2ø++2/\%3ø^=3ø2ø=3ø3ø=||.]!

Explicación

[                               {start lambda}
 2ø2ø2ø                         {duplicate 3 inputnums}
       ++                       {push sum(3 popped stack items)}
         2/\%                   {push (popped stack item)/2}
             3ø^=3ø2ø=3ø3ø=     {for all 3 inputs, -1 if inputnum=sum/2; else 0}
                           ||   {check if any of the 3 resulting values are truthy}
                             .  {output top of stack (boolean value)}
                              ] {end lambda}

No creo que sea así como funciona una codificación ...
Conor O'Brien

øtiene el punto de código 248, por lo que es un byte si está codificado como ISO 8859-1.
Dennis

1
... lo cual está bien siempre que el intérprete pueda trabajar con un archivo fuente codificado ISO 8859-1.
Martin Ender

@ MartinBüttner No creo que sea posible probar eso.
Mama Fun Roll

3

Java 7, 81

boolean d(int[]a){int s=0,t=1;for(int b:a)s+=b;for(int b:a)t*=2*b-s;return t==0;}

3

Perl 6, 20 19 bytes

Tengo dos funciones iguales en el recuento de bytes, así que pondré ambas. Aprecie lo que le haga cosquillas.

{@_@_.sum div 2}
{@_∋+~(@_.sum/2)}

Uso: asigne cualquiera de los dos a una variable desde la que pueda llamarlo.
EDITAR: Gracias @ b2gills por la reducción de bytes


{@_∋@_.sum div 2}y {@_∋+~(@_.sum/2)}son tanto más corto
Brad Gilbert b2gills

Oh, gracias, siempre olvido que puedes llamar a la suma como método punteado
Teclas de acceso

¿Qué hacer?
Usuario112638726

"∋" es el operador infijo 'contiene', que dice que la izquierda contiene la derecha. Es la hermana del "∈" 'elemento' op que dice que la izquierda es un elemento de la derecha. Ambos están configurados y Perl 6 también es compatible con muchos otros. docs.perl6.org/language/…
Teclas de acceso rápido del

3

Java 8 (función lambda), 29 bytes

// Lambda Signature: (int, int, int) -> boolean

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

Las soluciones de golf de código Java generalmente son cortas cuando el programa no tiene que ser un programa completamente funcional. (* tos tos * declaración de clase, método principal)


2

Pyth, 6 bytes

/Q/sQ2

Pruébalo en línea!

Espera entrada como una lista de enteros. Emite 0 si no se puede construir un número restando los otros dos y> 0 si al menos uno puede.

Explicación:

Mismo algoritmo que la respuesta de @xnor

/ Q / sQ2

   sQ # Suma todos los elementos en la lista
  / 2 # Divide la suma por 2
/ Q # Recuento de ocurrencias del número anterior en la lista

2

05AB1E , no competidor

4 bytes , no compiten por una estupidez. Código:

DO;¢

Usando 0 como falso y> 0 como verdadero. Utiliza la codificación CP-1252.


¿Qué es lo "estúpido" que hace que esto no compita?
Kyle Kanos

@KyleKanos Ya he escrito en Info.txt que ;reduce a la mitad la parte superior de la pila. Pero adivina qué, nunca lo he implementado -_-.
Adnan

1
Ah Puedo ver cómo eso lo haría
Kyle Kanos

2

Kona 16 caracteres

{((+/x)%2)_in x}

Toma un vector de la pila, los suma, divide por 2 y determina si está en el vector. Devuelve 1 como verdadero y 0 como falsey.

Llamado vía

> {((+/x)%2)_in x} [(2;3;5)]
1
> {((+/x)%2)_in x} [(2;3;4)]
0

2

jq, 17 caracteres

(Sin embargo, otra reescritura de la respuesta de Python 3 de xnor. Los votos a favor deberían ir a esa).

contains([add/2])

Entrada: matriz de 3 enteros.

Ejecución de muestra:

bash-4.3$ jq 'contains([add/2])' <<< '[5, 3, 2]'
true

bash-4.3$ jq 'contains([add/2])' <<< '[2, 3, -5]'
false

Prueba en línea:

jq, 18 caracteres

(Código de 17 caracteres + opción de línea de comando de 1 carácter).

contains([add/2])

Entrada: lista de 3 enteros.

Ejecución de muestra:

bash-4.3$ jq -s 'contains([add/2])' <<< '5 3 2'
true

bash-4.3$ jq -s 'contains([add/2])' <<< '2 3 -5'
false

2

MATL , 5 bytes

Usando el gran enfoque de @ xnor :

s2/Gm

Pruébalo en línea!

s    % implicitly input array of three numbers. Compute their sum
2/   % divide by 2
G    % push input again
m    % ismember function: true if sum divided by 2 equals some element of the input

Enfoque de fuerza bruta, 12 bytes :

Y@TT-1h*!s~a

Pruébalo en línea!

Y@       % input array of three numbers. Matrix with all
         % permutations, each one on a different row
TT-1h    % vector [1,1,-1]
*        % multiply with broadcast
!s       % transpose, sum of each column (former row)
~a       % true if any value is 0


2

CJam, 10 12 bytes

l~:d_:+2/&

2 bytes eliminados gracias a @ MartinBüttner.

Esto muestra un número como resultado verdadero y ninguna salida como resultado falso.

Pruébalo aquí

l~     e# read line and evaluate. Pushes the array
:d     e# convert array to double
_      e# duplicate
:+     e# fold addition on the array. Computes sum of the array
2/     e# divide sum by 2
&      e# setwise and (intersection)

2

En serio, 6 bytes

,;䫡u

Emite 0 si es falso y un entero positivo en caso contrario


2

Mathematica, 20 19 bytes

MemberQ[2{##},+##]&

Funciona de manera similar a la mayoría de las otras respuestas.


¿Qué tal MemberQ[2{##},+##]&? (y olvidó su número de bytes)
Martin Ender

2

Haskell, 20 bytes

(\l->sum l/2`elem`l)

Usando la solución de xnor.


Como (/)no funciona para enteros y el desafío pide enteros, no estoy seguro de que esta sea realmente una solución válida.
Zeta

Yo no vi eso. ¿Debería la conversión de tipo ser parte del código? De esta manera: (\l->sum l/2`elem`l).map fromIntegery que puede ser utilizado como esto: ((\l->sum l/2`elem`l).map fromInteger) ([2,3,5] :: [Integer]). Creo que lo que me confundió fue XNOR mencionar el uso de Python 3 por lo que la entrada no tiene por qué ser 3.0 en lugar de 3. pensé que el tipo de entrada no se ha especificado, sólo la forma en que fueron escritos ...
basile- Henry

Si el tipo es realmente un problema, ¿no debería ser un problema el hecho de que estoy tomando una lista como entrada?
basile-henry

Buen punto. Le preguntaría a OP sobre eso. Pero dado que todas las otras respuestas también usan una lista, supongo que está bien (también, ahora entiendo por qué su función no escribió check cuando usa tuplas).
Zeta

Sí, si la entrada fue una tupla en lugar de una lista, sumni elemfuncionaría, probablemente debería haber especificado que era una lista, pero como esta respuesta es literalmente lo que envió xnor (en Haskell), no pensé que fuera necesario. :)
basile-henry

2

Perl, 24 + 4 = 28 bytes

$^+=$_/2 for@F;$_=$^~~@F

Requiere -paXbanderas para correr, impresiones1 como Verdadero y nada como Falso:

-X deshabilita todas las advertencias.

$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 7'
$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 8'
1

Uno inspirador. Inspirado en esto: $_=eval(y/ /+/r)/2~~@F(usa las mismas opciones de línea de comandos).
manatwork

@manatwork Una forma interesante de usar tr:)
andlrc

Puede omitirlo -Xespecificando alguna versión de Perl [5.10 .. 5.18). (Smart partido se introdujo en 5,10 y advertencias experimentales fueron introducidas en 5,18 Cualquier versión entre los dos funcionará bien con. ~~Sin -X.)
manatwork

1

Jolf, 6 bytes

Pruébalo aquí!

 hx½ux
_hx    the input array
   ½ux  has half the sum of the array

Esta es la increíble solución de xnor al problema, pero en Jolf.


1

Pilones , 8

Otra implementación más del algoritmo de xnor.

i:As2A/_

Cómo funciona:

i    # Get command line input.
:A   # Initialize a constant A.
  s  # Set A to the sum of the stack.
2    # Push 2 to the stack.
A    # Push A to the stack.
/    # Divide A/2
_    # Check if the top of the stack is in the previous elements.
     # Print the stack on quit.

1

SpecBAS - 36 bytes

Utiliza la fórmula xnors

1 INPUT a,b,c: ?(a+b+c)/2 IN [a,b,c]

salidas 1 si es verdadero y 0 si es falso


1

05AB1E , 6 5 bytes

;Oм_O

-1 byte creando un puerto del algoritmo Python 3 de @xnor .

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

·        # Halve every item in the input-array
         #  i.e. [10,6,4] → [5.0,3.0,2.0]
 O       # Sum this array
         #  i.e. [5.0,3.0,2.0] → 10.0
  м_O    # Output 1 if the input-array contain this sum, 0 otherwise
         #  i.e. [10,6,4] and 10.0 → 1

Estoy bastante seguro de que м_Ose puede acortar, pero no estoy seguro de qué comando (s) tengo que usar para ello.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.