Różnica trzech wejściowych liczb całkowitych

30

Zaimplementuj różnicę funkcji, która przyjmuje jako dane wejściowe trzy liczby całkowite x, y i z. Powinien zwrócić, czy odjęcie jednej z tych liczb od drugiej daje trzecią.

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

Nie musisz nazywać funkcji, możesz zaimplementować domyślne metody wprowadzania danych, powyższe przykłady nie są ścisłą wytyczną.

Mir
źródło
5
Jest to rozsądne wyzwanie, ale nie trzeba ograniczać go do Pythona ani funkcji. Ogólnie rzecz biorąc, takie ograniczenia są odrzucane, ponieważ ograniczają uczestnictwo. Powinieneś również dołączyć kilka przypadków testowych.
xnor
Hej, trochę to naprawiłem. Mam nadzieję, że to wystarczy!
Mir
2
Wygląda lepiej! Nadal zdecydowanie zalecam stosowanie domyślnych metod wprowadzania danych , w szczególności programów, ponieważ niektóre języki nie mają funkcji. I, pozwalając funkcjom mieć inną nazwę lub bez nazwy.
xnor
Pierwszy i ostatni akapit są teraz sprzeczne, więc po prostu podwójnie sprawdź - czy musimy napisać funkcję, czy pełne programy są w porządku?
Sp3000,
pełne programy są w porządku, chcę nałożyć jak najmniej ograniczeń, tyle że przestrzegane są domyślne metody wprowadzania. ef przykłady w python3 są czyste!
Mir

Odpowiedzi:

14

Galaretka , 5 3 bajtów

Dzięki @ Sp3000 za zapisanie dwóch bajtów!

Kod korzysta z tego samego algorytmu, co świetna odpowiedź @ xnor :

SfḤ

Wyjaśnienie:

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

To daje []fałsz, a wszystko inne jako prawdę.

Wypróbuj online!

Adnan
źródło
51

Python 3, 21 bajtów

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

Jeśli dwie liczby dodają się do drugiej, suma wszystkich trzech będzie podwojona w stosunku do tej drugiej liczby, więc połowa sumy będzie elementem listy. Python 3 jest potrzebny, aby uniknąć podziału podłogi, chyba że liczby są podane 3.0raczej niż zamiast 3.

xnor
źródło
7

ES6, 31 bajtów

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

Dodaj 5 bajtów, jeśli chcesz nazwać funkcję diff.

Edycja: Zapisano 2 bajty dzięki @Alex L.

Neil
źródło
Można zapisać dwa bajty, zastępując ||z |(chyba)
HyperNeutrino
@AlexL. Ach, tak, byłem zbyt rozluźniony, że musiałem zwrócić Boolean.
Neil
Nawet w przypadku wartości logicznych |zwraca wartość logiczną wtedy i tylko wtedy, gdy obie wartości są wartościami logicznymi. Tak true | false == true, ale 3 | 5 == 7. To samo dotyczy &&i &. Jedyna różnica pomiędzy |i ||jeśli chodzi o booleany: |weźmie pierwszą wartość i drugą wartość i znajdzie OR tych dwóch. ||przyjmie pierwszą wartość; jeśli to prawda, zwróć true, w przeciwnym razie zwróć drugą wartość.
HyperNeutrino,
@AlexL. true | falseocenia się na 1 w JavaScript (co jest zgodne z prawdą, ale nie logiczne).
Neil
O. Niestety, tak naprawdę nie używam JS. Najczęściej używam Javy, z której czerpię te informacje. ;)
HyperNeutrino
4

APL, 8 5 bajtów

+/∊+⍨

Jest to monadyczny ciąg funkcji, który przyjmuje tablicę i zwraca wartość logiczną (0/1 w APL). Korzysta z tego samego algorytmu jak XNOR za Python 3 odpowiedzi .

Wyjaśnienie:

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

Wypróbuj online

Zaoszczędzono 3 bajty dzięki Dennisowi!

Alex A.
źródło
4

JavaScript ES6, 38 34 33 bajtów

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

Bardzo prosta anonimowa funkcja i zapożycza z odpowiedzi w języku Python. Pobiera dane wejściowe xjako tablicę; zwraca truelub false. Bajty ogolił się do Molarmanfula i jricha

Program 38-bajtowy, w którym każda liczba jest argumentem:

(a,b,c)=>[a,b,c].some(t=>t==(a+b+c)/2)
Conor O'Brien
źródło
Spróbuj x=>x.some(a=>a==eval(x.join`+`)/2), co pozwala zaoszczędzić 4 bajty.
Mama Fun Roll
@ ҒЦꝆПҒЦꝆ Dzięki! Niezła sztuczka.
Conor O'Brien
x=>x.some(a=>2*a==x[0]+x[1]+x[2])wydaje się działać.
jrich
@jrich Thanks! Niezła sztuczka!
Conor O'Brien,
3

Oracle SQL 11.2, 49 bajtów

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

Przepisz rozwiązanie @xnor, wyrazy uznania dla niego.

Jeto
źródło
3

J, 6 bajtów

+/e.+:

Spróbuj z J.js .

Jak to działa

+/e.+:    Monadic verb. Argument: A
    +:    Double the elements of A.
+/        Compute the sum of the elements of A.
  e.      Test for membership.
Dennis
źródło
3

DUP , 31 znaków / 39 bajtów

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

Try it here!

Moje pierwsze zgłoszenie DUP w historii! Unicode to Twoja ostryga.

To anonimowa funkcja / lambda. Stosowanie:

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

Wyjaśnienie

[                               {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
źródło
Nie sądzę, że tak działa kodowanie ...
Conor O'Brien
øma punkt kodowy 248, więc jest to jeden bajt, jeśli jest zakodowany jako ISO 8859-1.
Dennis
1
... co jest w porządku, o ile interpreter może faktycznie współpracować z plikiem źródłowym zakodowanym w standardzie ISO 8859-1.
Martin Ender
@ MartinBüttner Nie sądzę, że można to przetestować.
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
źródło
3

Perl 6, 20 19 bajtów

Mam dwie funkcje równe liczbie bajtów, więc wstawię obie. Doceń to, co łaskocze twoje upodobania.

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

Zastosowanie: przypisz dowolną zmienną, z której możesz ją wywołać.
EDYCJA: Dzięki @ b2gills za zmniejszenie bajtów

Skróty klawiszowe
źródło
{@_∋@_.sum div 2}i {@_∋+~(@_.sum/2)}oba są krótsze
Brad Gilbert b2gills
Och, dziękuję, zawsze zapominam, że można nazwać sumę metodą kropkową
Hotkeys
Co ma zrobić?
User112638726,
„∋” to operator infix „zawiera”, który mówi, że lewy zawiera prawy. To siostra elementu „∈”, która mówi, że lewica jest elementem prawicy. Oba są ustawione na ops, a perl 6 faktycznie obsługuje też wiele innych! docs.perl6.org/language/…
Skróty klawiszowe
3

Java 8 (funkcja lambda), 29 bajtów

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

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

Rozwiązania do golfa w kodzie Java są zazwyczaj krótkie, gdy program nie musi być w pełni funkcjonalnym programem. (* kaszel kaszel * deklaracja klasy, główna metoda)

HyperNeutrino
źródło
2

Pyth, 6 bajtów

/Q/sQ2

Wypróbuj online!

Oczekuje danych wejściowych jako listy liczb całkowitych. Wyprowadza 0, jeśli nie można zbudować żadnej liczby, odejmując pozostałe dwa, i> 0, jeśli przynajmniej jedna może.

Wyjaśnienie:

Ten sam algorytm jak odpowiedź @xnor

/ Q / sQ2

   sQ # Zsumuj wszystkie elementy na liście
  / 2 # Podziel sumę przez 2
/ Q # Count Liczba wystąpień powyższej liczby na liście
Denker
źródło
2

05AB1E , niekonkurujący

4 bajty , niekonkurujące z powodu głupoty. Kod:

DO;¢

Używanie 0 jako fałszu i> 0 jako prawdy. Wykorzystuje kodowanie CP-1252.

Adnan
źródło
Jaka jest „głupia” rzecz, która sprawia, że ​​ta niekonkuruje?
Kyle Kanos,
@KyleKanos Napisałem już w Info.txt, który dzieli; połowę stosu. Ale zgadnij co, nigdy go nie wdrożyłem.
Adnan
1
Ach Widzę, jak by to
zrobiło
2

Kona 16 znaków

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

Pobiera wektor ze stosu, sumuje je, dzieli przez 2 i określa, czy jest w wektorze. Zwraca 1 jako prawdę i 0 jako falsey.

Dzwoni za pośrednictwem

> {((+/x)%2)_in x} [(2;3;5)]
1
> {((+/x)%2)_in x} [(2;3;4)]
0
Kyle Kanos
źródło
2

jq, 17 znaków

(Kolejny przepisać XNOR „s Python 3 odpowiedź . Upvotes powinien udać się do tego.)

contains([add/2])

Dane wejściowe: tablica 3 liczb całkowitych.

Przykładowy przebieg:

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

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

Test on-line:

jq, 18 znaków

(17-znakowy kod + 1-znakowa opcja wiersza poleceń.)

contains([add/2])

Dane wejściowe: lista 3 liczb całkowitych.

Przykładowy przebieg:

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

bash-4.3$ jq -s 'contains([add/2])' <<< '2 3 -5'
false
człowiek w pracy
źródło
2

MATL , 5 bajtów

Korzystając z doskonałego podejścia @ xnor :

s2/Gm

Wypróbuj online!

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

Podejście brutalnej siły, 12 bajtów :

Y@TT-1h*!s~a

Wypróbuj online!

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
źródło
2

𝔼𝕊𝕄𝕚𝕟, 7 znaków / 9 bajtów

ï⒮≔⨭ï/2

Try it here (Firefox only).

Meh Nadal znajduję lepsze sposoby. To po prostu niesamowity algorytm @ xnor.

Mama Fun Roll
źródło
2

CJam, 10 12 bajtów

l~:d_:+2/&

2 bajty usunięte dzięki @ MartinBüttner.

Wyświetla liczbę jako prawdziwy wynik, a brak wyniku jako wynik fałszowania.

Wypróbuj tutaj

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
źródło
2

Poważnie, 6 bajtów

,;䫡u

Zwraca 0, jeśli fałsz, w przeciwnym razie dodatnią liczbę całkowitą.

Mego
źródło
2

Mathematica, 20 19 bajtów

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

Działa podobnie do większości innych odpowiedzi.

LegionMammal978
źródło
Jak o MemberQ[2{##},+##]&? (i zapomniałeś liczby bajtów)
Martin Ender
2

Haskell, 20 bajtów

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

Korzystanie z rozwiązania xnor.

basile-henry
źródło
Ponieważ (/)nie działa na liczbach całkowitych, a wyzwanie wymaga liczb całkowitych, nie jestem pewien, czy to jest prawidłowe rozwiązanie.
Zeta
Nie widziałem tego. Czy konwersja typu powinna być częścią kodu? Tak: (\l->sum l/2`elem`l).map fromIntegeri może być stosowany tak: ((\l->sum l/2`elem`l).map fromInteger) ([2,3,5] :: [Integer]). Myślę, że to, co mnie wytrąciło, to xnor wspominający użycie Pythona 3, więc wejście nie musiało być 3.0 zamiast 3. Myślałem, że typ wejścia nie został określony, tylko sposób, w jaki zostały napisane ...
basile- henz
Jeśli ten typ jest naprawdę problemem, czy fakt, że biorę listę jako dane wejściowe, nie powinien stanowić większego problemu?
basile-henry
Słuszna uwaga. Zapytałbym o to OP. Ale biorąc pod uwagę, że wszystkie pozostałe odpowiedzi również używają listy, wydaje mi się, że jest OK (teraz też rozumiem, dlaczego twoja funkcja nie wpisała polecenia check przy użyciu krotek).
Zeta
Tak, jeśli wejście nie było krotką zamiast listy sum nie elemdziałałyby, prawdopodobnie powinienem określić, że była to lista, ale skoro ta odpowiedź jest dosłownie przesłana przez xnor (w Haskell), nie uważam, że jest to konieczne. :)
basile-henry
2

Perl, 24 + 4 = 28 bajtów

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

Wymaga -paXflag do uruchomienia, drukuje 1jako Prawda i nic tak jak False:

-X wyłącza wszystkie ostrzeżenia.

$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 7'
$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 8'
1
andlrc
źródło
Inspirujący. Zainspirowany: $_=eval(y/ /+/r)/2~~@F(używa tych samych opcji wiersza poleceń).
manatwork
@manatwork Ciekawy sposób użycia tr:)
andlrc
Możesz to pominąć, -Xokreślając wersję Perla [5.10 .. 5.18). (Inteligentne dopasowanie zostało wprowadzone w 5.10, a eksperymentalne ostrzeżenia zostały wprowadzone w 5.18. Każda wersja między tymi dwoma będzie dobrze działać ~~bez -X).
manatwork
1

Jolf, 6 bajtów

Wypróbuj tutaj!

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

To niesamowite rozwiązanie xnora dla tego problemu, ale w Jolfie.

Conor O'Brien
źródło
1

Słupy , 8

Jeszcze jedna implementacja algorytmu xnor.

i:As2A/_

Jak to działa:

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
źródło
1

SpecBAS - 36 bajtów

Używa formuły xnors

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

wyprowadza 1 jeśli prawda i 0 jeśli fałsz

Brian
źródło
1

05AB1E , 6 5 bajtów

;Oм_O

-1 bajt poprzez utworzenie portu algorytmu @xnor w języku Python 3 .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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

Jestem prawie pewien, że м_Omożna go skrócić, ale nie jestem pewien, których poleceń muszę użyć do tego.

Kevin Cruijssen
źródło