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.

Mir
fuente
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!

Adnan
fuente
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.

xnor
fuente
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.

Neil
fuente
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!

Alex A.
fuente
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)
Conor O'Brien
fuente
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.

Jeto
fuente
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.
Dennis
fuente
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}
Mama Fun Roll
fuente
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;}
Marky Markov
fuente
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

Teclas de acceso rápido
fuente
{@_∋@_.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)

Hiperneutrino
fuente
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
Denker
fuente
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.

Adnan
fuente
¿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
Kyle Kanos
fuente
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
hombre trabajando
fuente
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
Luis Mendo
fuente
2

𝔼𝕊𝕄𝕚𝕟, 7 caracteres / 9 bytes

ï⒮≔⨭ï/2

Try it here (Firefox only).

Meh Todavía estoy encontrando mejores formas. Es solo el asombroso algoritmo de @xnor.

Mama Fun Roll
fuente
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)
Luis Mendo
fuente
2

En serio, 6 bytes

,;䫡u

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

Mego
fuente
2

Mathematica, 20 19 bytes

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

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

LegionMammal978
fuente
¿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.

basile-henry
fuente
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
andlrc
fuente
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.

Conor O'Brien
fuente
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.
Morgan Thrapp
fuente
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

Brian
fuente
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.

Kevin Cruijssen
fuente