Разница трех входных целых


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). Он использует тот же алгоритм, что и ответ xnor на Python 3 .

Объяснение:

   +⍨  ⍝ 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

@ ӍѲꝆΛҐӍΛПҒЦꝆ Спасибо! Хороший трюк.
Конор О'Брайен

x=>x.some(a=>2*a==x[0]+x[1]+x[2])похоже на работу.
jrich

@jrich Спасибо! Хороший трюк!
Конор О'Брайен


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! Юникод это твоя устрица.

Это анонимная функция / лямбда. Использование:

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}

Я не думаю, что так работает кодировка ...
Конор О'Брайен,

øимеет кодовую точку 248, поэтому он равен одному байту, если кодируется как ISO 8859-1.
Деннис

1
... это хорошо, если интерпретатор действительно может работать с исходным файлом в кодировке ISO 8859-1.
Мартин Эндер

@ MartinBüttner Не думаю, что это можно проверить.
Mama Fun Roll


3

Perl 6, 20 19 байтов

У меня две функции, равные по числу байтов, поэтому я поставлю обе. Цените то, что щекочет ваше воображение.

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

Использование: присвойте любой из них переменной, из которой вы можете вызвать ее.
РЕДАКТИРОВАТЬ: Спасибо @ b2gills за сокращение байтов


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

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

Что делает ?
User112638726

«∋» - инфиксный оператор «содержит», который говорит, что левый содержит правый. Это сестра операции «∈» «element», которая говорит, что левый элемент является элементом правого. Они оба настроены, и 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-решения для гольфа обычно бывают короткими, когда программа не обязательно должна быть полнофункциональной. (* кашель кашель * объявление класса, метод main)


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

Kona 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 на 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

Он-лайн тест:

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

Mathematica, 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 (в Хаскеле), я не думал, что это необходимо. :)
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

@manatwork Интересный способ использования tr:)
andlrc

Вы можете оставить это -X, указав некоторую версию Perl [5.10 .. 5.18). (Смарт-совпадение было введено в 5.10, а экспериментальные предупреждения были введены в 5.18. Любая версия между этими двумя будет работать ~~без -X.)
manatwork


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 байт, создав порт алгоритма Python 3 @xnor .

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

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