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ą.


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:



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.


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.


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!


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)

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.


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.

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}

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;}

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


{@_∋@_.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)


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

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.


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

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

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


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)

2

Poważnie, 6 bajtów

,;䫡u

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


2

Mathematica, 20 19 bajtów

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

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


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.


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

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

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.

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


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.


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.