Sự khác biệt của ba số nguyên đầu vào


30

Thực hiện một hàm diff lấy ba số nguyên x, y và z đầu vào. Nó sẽ trả về việc trừ đi một trong những số này từ số khác cho số thứ ba.

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

Bạn không phải đặt tên cho hàm, bạn có thể triển khai các phương thức nhập mặc định, các ví dụ ở trên không phải là một hướng dẫn nghiêm ngặt.


5
Đây là một thách thức hợp lý, nhưng không cần phải giới hạn nó với Python hoặc các hàm. Nói chung, những hạn chế như vậy được tán thành vì chúng hạn chế sự tham gia. Ngoài ra, bạn nên bao gồm một số trường hợp thử nghiệm.
xnor

Này tôi đã sửa nó một chút. Hy vọng điều này đủ!
Mir

2
Trông tốt hơn! Tôi vẫn thực sự khuyên bạn nên cho phép các phương thức nhập mặc định , trong các chương trình cụ thể, vì một số ngôn ngữ không có chức năng. Và, cho phép các chức năng có tên khác hoặc không có tên.
xnor 7/2/2016

Các đoạn đầu tiên và cuối cùng hiện đang xung đột, vì vậy chỉ cần kiểm tra lại - chúng ta có phải viết một hàm hoặc các chương trình đầy đủ được không?
Sp3000

các chương trình đầy đủ đều ổn, tôi muốn áp đặt càng ít hạn chế càng tốt ngoại trừ các phương thức nhập mặc định được tuân theo. ef các ví dụ python3 là gọn gàng!
Mir

Câu trả lời:



51

Python 3, 21 byte

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

Nếu hai số cộng với số kia, tổng của cả ba sẽ gấp đôi số kia, vì vậy một nửa tổng sẽ là một phần tử của danh sách. Python 3 là cần thiết để tránh phân chia sàn, trừ khi các số được đưa ra 3.0thay vì 3.


7

ES6, 31 byte

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

Thêm 5 byte nếu bạn cần đặt tên hàm diff.

Chỉnh sửa: Đã lưu 2 byte nhờ @Alex L.


Bạn có thể lưu hai byte bằng cách thay thế ||bằng |(tôi nghĩ)
HyperNeutrino

@AlexL. À đúng rồi, tôi đã quá nôn nao khi phải trả lại Booleans.
Neil

Ngay cả với booleans, |trả về boolean khi và chỉ khi cả hai giá trị là booleans. Vì vậy true | false == true, nhưng 3 | 5 == 7. Áp dụng tương tự &&&. Sự khác biệt duy nhất giữa |||khi nói đến booleans: |sẽ lấy giá trị đầu tiên và giá trị thứ hai và tìm OR của hai giá trị đó. ||sẽ lấy giá trị đầu tiên; nếu đúng, trả về true, nếu không, trả về giá trị thứ hai.
HyperNeutrino

@AlexL. true | falseước tính là 1 trong JavaScript (đó là sự thật, nhưng không phải là Boolean).
Neil

Oh. Xin lỗi, tôi không thực sự sử dụng JS. Tôi chủ yếu sử dụng Java, đó là nơi tôi lấy thông tin đó. ;)
HyperNeutrino

4

APL, 8 5 byte

+/∊+⍨

Đây là một hàm chức năng đơn âm chấp nhận một mảng và trả về một boolean (0/1 trong APL). Nó sử dụng thuật toán tương tự như câu trả lời Python 3 của xnor .

Giải trình:

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

Dùng thử trực tuyến

Đã lưu 3 byte nhờ Dennis!


4

JavaScript ES6, 38 34 33 byte

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

Hàm ẩn danh rất đơn giản và mượn từ câu trả lời của Python. Đưa đầu vào xdưới dạng một mảng; trả lại truehoặc false. Byte được cạo thành Molarmanful và jrich

Một chương trình 38 byte, lấy mỗi số làm đối số:

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

Hãy thử x=>x.some(a=>a==eval(x.join`+`)/2), tiết kiệm 4 byte.
Mama Fun Roll

@ ӍѲꝆΛҐӍΛNET Cảm ơn! Bí quyết đẹp.
Conor O'Brien

x=>x.some(a=>2*a==x[0]+x[1]+x[2])dường như làm việc
jrich

@jrich Cảm ơn! Bí quyết đẹp!
Conor O'Brien

3

Oracle SQL 11.2, 49 byte

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

Viết lại giải pháp @xnor, danh tiếng cho anh ấy.


3

J, 6 byte

+/e.+:

Hãy thử nó với J.js .

Làm thế nào nó hoạt động

+/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 ký tự / 39 byte

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

Try it here!

Trình DUP đầu tiên của tôi từ trước đến giờ! Unicode là con hàu của bạn.

Đó là một chức năng ẩn danh / lambda. Sử dụng:

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

Giải trình

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

Tôi không nghĩ đó là cách mã hóa hoạt động ...
Conor O'Brien

øcó mã điểm 248, vì vậy nó là một byte nếu được mã hóa theo ISO 8859-1.
Dennis

1
... Sẽ tốt thôi miễn là trình thông dịch thực sự có thể làm việc với tệp nguồn được mã hóa ISO 8859-1.
Martin Ender

@ MartinBüttner Tôi không nghĩ có thể kiểm tra điều đó.
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 byte

Tôi có hai hàm bằng nhau về số byte, vì vậy tôi sẽ đặt cả hai. Đánh giá cao bất cứ điều gì tickles ưa thích của bạn.

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

Cách sử dụng: gán một trong hai cho một biến mà bạn có thể gọi nó.
EDIT: Cảm ơn @ b2gills về việc giảm byte


{@_∋@_.sum div 2}{@_∋+~(@_.sum/2)}cả hai đều ngắn hơn
Brad Gilbert b2gills 8/2/2016

Oh cảm ơn, tôi luôn quên bạn có thể gọi tổng như một phương pháp Dotty
Hotkeys

Không gì làm gì?
Người dùng112638726

"" Là toán tử infix 'chứa', nói rằng bên trái chứa bên phải. Đó là chị em với yếu tố "∈" 'nói rằng bên trái là một yếu tố của bên phải. Cả hai đều đặt ops và perl 6 thực sự cũng hỗ trợ nhiều người khác! docs.perl6.org/language/...
Hotkeys

3

Java 8 (hàm lambda), 29 byte

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

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

Các giải pháp golf mã Java thường chỉ ngắn khi chương trình không phải là một chương trình đầy đủ chức năng. (* ho ho * khai báo lớp, phương thức chính)


2

Bình thường, 6 byte

/Q/sQ2

Hãy thử trực tuyến!

Dự kiến ​​đầu vào là một danh sách các số nguyên. Đầu ra 0 nếu không có số nào có thể được xây dựng bằng cách trừ hai số còn lại và> 0 nếu ít nhất một số có thể.

Giải trình:

Thuật toán tương tự như câu trả lời của @xnor

/ Q / sQ2

   sQ # Tổng hợp tất cả các yếu tố trong danh sách
  / 2 # Chia tổng cho 2
/ Q # Đếm số lần xuất hiện trên trong danh sách

2

05AB1E , không cạnh tranh

4 byte , không cạnh tranh vì một điều ngu ngốc. Mã số:

DO;¢

Sử dụng 0 là giả và> 0 là trung thực. Sử dụng mã hóa CP-1252.


Điều "ngu ngốc" làm cho điều này không cạnh tranh là gì?
Kyle Kanos 7/2/2016

@KyleKanos tôi đã có viết bằng Info.txt rằng ;nửa phía trên cùng của ngăn xếp. Nhưng đoán xem, tôi chưa bao giờ thực hiện nó -_-.
Ad Nam

1
À. Tôi có thể thấy cách nó sẽ làm điều đó
Kyle Kanos 7/2/2016

2

Kona 16 ký tự

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

Lấy một vectơ từ ngăn xếp, tính tổng chúng, chia cho 2 và xác định xem nó có trong vectơ không. Trả về 1 là trung thực và 0 là falsey.

Gọi qua

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

2

jq, 17 ký tự

(Tuy nhiên, một viết lại của XNOR 's Python 3 câu trả lời . Upvotes nên đi đến một điều đó.)

contains([add/2])

Đầu vào: mảng 3 số nguyên.

Chạy mẫu:

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

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

Bài kiểm tra trực tuyến:

jq, 18 ký tự

(Mã 17 ký tự + 1 ký tự tùy chọn dòng lệnh.)

contains([add/2])

Đầu vào: danh sách 3 số nguyên.

Chạy mẫu:

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 byte

Sử dụng phương pháp tuyệt vời của @ xnor :

s2/Gm

Hãy thử trực tuyến!

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

Phương pháp tiếp cận mạnh mẽ, 12 byte :

Y@TT-1h*!s~a

Hãy thử trực tuyến!

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 byte

l~:d_:+2/&

Xóa 2 byte nhờ @ MartinBüttner.

Điều này hiển thị một số là kết quả trung thực và không có kết quả đầu ra là sai.

Hãy thử nó ở đây

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

Nghiêm túc, 6 byte

,;䫡u

Kết quả 0 nếu sai và số nguyên dương khác.


2

Toán học, 20 19 byte

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

Hoạt động tương tự như hầu hết các câu trả lời khác.


Thế còn MemberQ[2{##},+##]&? (và bạn đã quên số byte của mình)
Martin Ender

2

Haskell, 20 byte

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

Sử dụng giải pháp của xnor.


(/)không hoạt động đối với số nguyên và thử thách yêu cầu số nguyên, tôi không chắc chắn rằng đây thực sự là một giải pháp hợp lệ.
Zeta

Tôi đã không nhìn thấy điều đó. Chuyển đổi loại nên là một phần của mã? Như thế này: (\l->sum l/2`elem`l).map fromIntegervà nó có thể được sử dụng như thế này : ((\l->sum l/2`elem`l).map fromInteger) ([2,3,5] :: [Integer]). Tôi đoán điều khiến tôi thất vọng là xnor đề cập đến việc sử dụng python 3 nên đầu vào không phải là 3.0 thay vì 3. Tôi nghĩ rằng kiểu đầu vào không được chỉ định, chỉ là cách chúng được viết ...
basile- henry

Nếu loại đó thực sự là một vấn đề thì thực tế là tôi đang lấy một danh sách làm đầu vào có phải là vấn đề không?
basile-henry

Điểm tốt. Tôi sẽ hỏi OP về điều đó. Nhưng do tất cả các câu trả lời khác cũng sử dụng một danh sách, tôi đoán nó ổn (đồng thời, bây giờ tôi hiểu lý do tại sao chức năng của bạn không gõ kiểm tra khi sử dụng bộ dữ liệu).
Zeta

Có nếu đầu vào là một tuple thay vì danh sách sumcũng không elemhoạt động, tôi có lẽ nên chỉ định nó là một danh sách nhưng vì câu trả lời này đúng nghĩa là những gì xnor đã gửi (trong Haskell) Tôi không nghĩ rằng nó là cần thiết. :)
basile-henry

2

Perl, 24 + 4 = 28 byte

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

Yêu cầu -paXcờ chạy, in 1là Đúng và không có gì là Sai:

-X vô hiệu hóa tất cả các cảnh báo.

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

Truyền cảm hứng một. Lấy cảm hứng này: $_=eval(y/ /+/r)/2~~@F(sử dụng các tùy chọn dòng lệnh tương tự).
manatwork

@manatwork Cách sử dụng thú vị tr:)
andlrc

Bạn có thể loại bỏ điều đó -Xbằng cách chỉ định một số phiên bản Perl [5.10 .. 5.18). (Trận đấu thông minh được giới thiệu vào 5.10 và cảnh báo thực nghiệm đã được giới thiệu trong 5,18 Bất kỳ phiên bản giữa hai sẽ làm việc tốt với. ~~Không -X.)
manatwork


1

Giá treo , 8

Một triển khai khác của thuật toán xnor.

i:As2A/_

Làm thế nào nó hoạt động:

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 byte

Sử dụng công thức xnors

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

xuất 1 nếu đúng và 0 nếu sai


1

05AB1E , 6 5 byte

;Oм_O

-1 byte bằng cách tạo một cổng thuật toán Python 3 của @xnor .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Tôi khá chắc chắn м_Ocó thể rút ngắn, nhưng tôi không chắc tôi phải sử dụng lệnh nào cho nó ..


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.