Різниця трьох вхідних цілих чисел


30

Реалізуйте функцію diff, яка приймає за вхід три цілі числа x, y та z. Він повинен повернути, чи віднімання одного з цих чисел від іншого дає третє.

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

Вам не потрібно називати цю функцію, ви можете реалізувати методи введення за замовчуванням, наведені вище приклади не є суворими рекомендаціями.


5
Це розумне завдання, але не потрібно обмежувати його Python або функціями. Взагалі такі обмеження нападають, оскільки вони обмежують участь. Також слід включити кілька тестових випадків.
xnor

Гей, я це трохи виправив. Сподіваюся, цього достатньо!
Мир

2
Виглядає краще! Я все-таки настійно рекомендую дозволити методи введення за замовчуванням , зокрема програми, оскільки деякі мови не мають функцій. І, дозволяючи функціям мати інше ім’я або без імені.
xnor

Перший та останній абзаци зараз суперечать один одному, тому просто для подвійної перевірки - чи потрібно писати функцію чи повноцінні програми добре?
Sp3000

Повні програми добре, я хочу ввести якомога менше обмежень, за винятком того, що дотримуються методи введення за замовчуванням. Якщо приклади python3 акуратні!
Мир

Відповіді:


14

Желе , 5 3 байти

Завдяки @ Sp3000 за збереження двох байтів!

Код, використовує зовсім той самий алгоритм, що і чудова відповідь @ xnor :

SfḤ

Пояснення:

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

Це дає []як хибність, так і все інше, як правду.

Спробуйте в Інтернеті!


51

Python 3, 21 байт

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

Якщо два числа додати до інших, сума всіх трьох буде вдвічі більшою за інше число, тож половина суми буде елементом списку. Python 3 необхідно , щоб уникнути пів-ділення, якщо число не дано , як 3.0замість 3.


7

ES6, 31 байт

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

Додайте 5 байт, якщо вам потрібно назвати функцію diff.

Редагувати: збережено 2 байти завдяки @Alex L.


Можна зберегти два байти, замінивши ||на |(я думаю)
HyperNeutrino

@AlexL. Ага, я був занадто повішений на тому, щоб повернути булів.
Ніл

Навіть із |булевими значеннями, повертає булеве значення, якщо і лише якщо обидва значення булеві. Так true | false == true, але 3 | 5 == 7. Це ж стосується &&і &. Єдина різниця між |і ||коли мова йде про булеви: |візьме перше значення і друге значення і знайде АБО цих двох. ||прийме перше значення; якщо це правда, поверніть true, інакше поверніть друге значення.
HyperNeutrino

@AlexL. true | falseоцінюється на 1 у JavaScript (що є правдоподібним, але не булевим).
Ніл

Ой. Вибачте, я не дуже використовую JS. Я в основному використовую Java, звідки я і отримав цю інформацію. ;)
HyperNeutrino

4

APL, 8 5 байт

+/∊+⍨

Це поїзд монадичних функцій, який приймає масив і повертає булеву (0/1 в APL). Він використовує той самий алгоритм, що і відповідь Python 3 xnor .

Пояснення:

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

Спробуйте в Інтернеті

Збережено 3 байти завдяки Деннісу!


4

JavaScript ES6, 38 34 33 байт

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

Дуже проста анонімна функція, запозичена з відповіді Python. Приймає введення xяк масив; повертає trueабо false. Байти голилися до Моларманфу і розбагатіли

38-байтова програма, кожне число як аргумент:

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

Спробуйте x=>x.some(a=>a==eval(x.join`+`)/2), що економить 4 байти.
Mama Fun Roll

@ ӍѲꝆΛҐӍΛПҒЦꝆ Дякую! Гарний трюк.
Conor O'Brien

x=>x.some(a=>2*a==x[0]+x[1]+x[2])здається, працює.
jrich

@jrich Дякую! Гарний трюк!
Conor O'Brien

3

Oracle SQL 11.2, 49 байт

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

Перепишіть розчин @xnor, кудо йому.


3

J, 6 байт

+/e.+:

Спробуйте його з J.js .

Як це працює

+/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 символів / 39 байт

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

Try it here!

Моє перше подання про DUP коли-небудь! Unicode - ваша устриця.

Це анонімна функція / лямбда. Використання:

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

Пояснення

[                               {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}

Я не думаю, що так працює кодування ...
Conor O'Brien

øмає кодову точку 248, тому вона є одним байтом, якщо кодується як ISO 8859-1.
Денніс

1
... що добре, якщо перекладач може насправді працювати з кодованим вихідним файлом ISO 8859-1.
Мартін Ендер

@ MartinBüttner Я не думаю, що це можливо перевірити.
Mama Fun Roll


3

Perl 6, 20 19 байт

У мене дві функції рівні за кількістю байтів, тому я поставлю обидві. Вдячні за те, що тикає ваші фантазії.

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

Використання: призначте будь-яку змінній, з якої ви можете її викликати.
EDIT: Дякую @ b2gills за скорочення байтів


{@_∋@_.sum div 2}і {@_∋+~(@_.sum/2)}обидва коротші
Бред Гілберт b2gills

О, дякую, я завжди забуваю, що ви можете назвати суму як точковий метод
Hotkeys

Що робить ?
Користувач112638726

"∋" - це оператор інфікування "містить", який говорить, що ліворуч містить право. Це сестра опціону "∈" 'елемент, який говорить, що лівий - елемент правого. Вони обидва встановлені Ops, і Perl 6 насправді підтримує і багатьох інших! docs.perl6.org/language/…
Hotkeys

3

Java 8 (лямбда-функція), 29 байт

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

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

Рішення для гольфу з кодом Java, як правило, лише короткі, коли програма не повинна бути повністю функціональною програмою. (* кашель від кашлю * оголошення класу, основний метод)


2

Pyth, 6 байт

/Q/sQ2

Спробуйте в Інтернеті!

Очікує введення у вигляді списку цілих чисел. Виводить 0, якщо жодне число не можна побудувати, віднімаючи два інших та> 0, якщо хоча б один.

Пояснення:

Той самий алгоритм, що і відповідь @xnor

/ Q / sQ2

   sQ # Сума всіх елементів у списку
  / 2 # Розділіть суму на 2
/ Q # Кількість випадків вище числа в списку

2

05AB1E , не конкуруючий

4 байти , не конкуруючи з-за дурної речі. Код:

DO;¢

Використання 0 як хибний і> 0 як правдовий. Використовує кодування CP-1252.


Що "дурне", що робить це неконкурентоспроможним?
Кайл Канос

@KyleKanos Я вже писав в Info.txt, що вдвічі перевищує; верхню частину стека. Але здогадайтесь що, я ніколи цього не реалізував -_-.
Аднан

1
Ага. Я бачу, як це зробить
Кайл Канос

2

Кона 16 годин

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

Виймає вектор із стека, підсумовує їх, ділить на 2 і визначає, чи є він у векторі. Повертає 1 як трибуна та 0 як фальси.

Викликається через

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

2

jq, 17 символів

(Ще одне переписування відповіді на xnor 's Python 3.. Оновлення повинні перейти до цього.)

contains([add/2])

Вхід: масив з 3 цілих чисел.

Вибірка зразка:

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

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

On-line тест:

jq, 18 символів

(Код 17 символів + параметр командного рядка з 1 символом.)

contains([add/2])

Введення: список з 3 цілих чисел.

Вибірка зразка:

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 байт

Використання чудового підходу @ xnor :

s2/Gm

Спробуйте в Інтернеті!

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

Підхід грубої сили, 12 байт :

Y@TT-1h*!s~a

Спробуйте в Інтернеті!

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 байт

l~:d_:+2/&

2 байти видалено завдяки @ MartinBüttner.

Це відображає число як простий результат, а не результат як хибний результат.

Спробуйте тут

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

Серйозно, 6 байт

,;䫡u

Виходи 0, якщо помилкові, а додатне ціле число - інакше.


2

Математика, 20 19 байт

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

Працює аналогічно більшості інших відповідей.


Як щодо MemberQ[2{##},+##]&? (і ви забули свій рахунок байтів)
Мартін Ендер

2

Haskell, 20 байт

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

Використання рішення xnor.


Оскільки (/)не працює для цілих чисел, а виклик вимагає цілих чисел, я не впевнений, що це насправді правильне рішення.
Зета

Я цього не бачив. Чи має перетворення типу бути частиною коду? Як це: (\l->sum l/2`elem`l).map fromIntegerі він може бути використаний , як це: ((\l->sum l/2`elem`l).map fromInteger) ([2,3,5] :: [Integer]). Я здогадуюсь, що мене відкинуло - xnor, згадуючи про використання python 3, тому вхід не повинен був бути 3,0 замість 3. Я думав, що тип введення не вказаний, як саме вони були написані ...
basile- Генрі

Якщо тип справді є проблемою, чи не більшим буде питання про те, що я беру список як вхідний?
Базиль-Генрі

Влучне зауваження. Я б просив ОП про це. Але з огляду на те, що всі інші відповіді також використовують список, я думаю, це нормально (також, тепер я розумію, чому ваша функція не вводила перевірку під час використання кортежів).
Зета

Так, якщо введення було кортежем замість списку, ані sumне elemпрацювало, я, мабуть, повинен був би вказати, що це список, але оскільки ця відповідь буквально те, що подав xnor (в Haskell), я не вважав, що це потрібно. :)
basile-henry

2

Perl, 24 + 4 = 28 байт

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

Потрібні -paXпрапори для запуску, друкуються 1як True та нічого, як False:

-X вимикає всі попередження.

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

Натхненний. Надихнув це: $_=eval(y/ /+/r)/2~~@F(використовує ті самі параметри командного рядка).
манатура

@manatwork Цікавий спосіб використання tr:)
andlrc

Ви можете залишити це -X, вказавши певну версію Perl [5.10 .. 5.18). (Розумний матч був введений в 5.10, а експериментальні попередження були введені в 5.18. Будь-яка версія між цими двома буде відмінно працювати ~~без -X.)
манатура


1

Пілони , 8

Ще одна реалізація алгоритму xnor.

i:As2A/_

Як це працює:

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 байт

Використовує формулу xnors

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

виводить 1, якщо істинно, і 0, якщо помилково


1

05AB1E , 6 5 байт

;Oм_O

-1 байт, створивши порт алгоритму @xnor 's Python 3 .

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

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

Я майже впевнений, що м_Oможна скоротити, але я не впевнений, яку команду я повинен використовувати для цього ..


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.