Perbedaan tiga bilangan bulat input

30

Menerapkan fungsi dif yang diambil sebagai input tiga bilangan bulat x, y, dan z. Itu harus mengembalikan apakah mengurangi salah satu dari angka-angka ini dari yang lain memberi yang ketiga.

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

Anda tidak harus menyebutkan nama fungsinya, Anda dapat menerapkan metode input default, contoh di atas bukan pedoman yang ketat.

Mir
sumber
5
Ini adalah tantangan yang masuk akal, tetapi tidak perlu untuk membatasi ke Python atau fungsi. Secara umum, pembatasan semacam itu disukai karena membatasi partisipasi. Anda juga harus memasukkan beberapa test case.
xnor
Hei aku memperbaikinya sedikit. Semoga ini cukup!
Mir
2
Terlihat lebih baik! Saya masih sangat menyarankan mengizinkan metode input default , dalam program tertentu, karena beberapa bahasa tidak memiliki fungsi. Dan, memungkinkan fungsi untuk memiliki nama lain atau tanpa nama.
xnor
Paragraf pertama dan terakhir sekarang saling bertentangan, jadi cukup dengan memeriksa ulang - apakah kita harus menulis suatu fungsi atau apakah program lengkap oke?
Sp3000
program lengkap baik-baik saja, saya ingin menerapkan pembatasan sesedikit mungkin kecuali bahwa metode input standar diikuti. ef contoh python3 rapi!
Mir

Jawaban:

14

Jelly , 5 3 byte

Terima kasih kepada @ Sp3000 untuk menghemat dua byte!

Kode, menggunakan algoritma yang cukup sama dengan jawaban luar biasa @ xnor :

SfḤ

Penjelasan:

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

Ini memberikan []kepalsuan, dan hal lain sebagai kebenaran.

Cobalah online!

Adnan
sumber
51

Python 3, 21 byte

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

Jika dua angka menambah yang lain, jumlah ketiganya akan menjadi dua kali lipat dari angka lainnya, jadi setengah dari jumlah tersebut akan menjadi elemen dari daftar. Python 3 diperlukan untuk menghindari pembagian lantai, kecuali jika angka diberikan seperti 3.0bukan 3.

Tidak
sumber
7

ES6, 31 byte

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

Tambahkan 5 byte jika Anda perlu memberi nama fungsi diff.

Sunting: Disimpan 2 byte berkat @Alex L.

Neil
sumber
Anda dapat menyimpan dua byte dengan menggantinya ||dengan |(saya pikir)
HyperNeutrino
@AlexL. Ah benar aku terlalu menutup telepon karena harus mengembalikan Boolean.
Neil
Bahkan dengan booleans, |mengembalikan boolean jika dan hanya jika kedua nilai tersebut adalah booleans. Jadi true | false == true, tapi 3 | 5 == 7. Hal yang sama berlaku &&dan &. Satu-satunya perbedaan antara |dan ||ketika datang ke boolean: |akan mengambil nilai pertama dan nilai kedua dan menemukan OR dari keduanya. ||akan mengambil nilai pertama; jika itu benar, kembalikan true, jika tidak, kembalikan nilai kedua.
HyperNeutrino
@AlexL. true | falsemengevaluasi ke 1 dalam JavaScript (yang benar, tetapi tidak Boolean).
Neil
Oh Maaf, saya tidak benar-benar menggunakan JS. Saya kebanyakan menggunakan Java, dari sanalah saya mendapatkan informasi itu. ;)
HyperNeutrino
4

APL, 8 5 byte

+/∊+⍨

Ini adalah kereta fungsi monadik yang menerima larik dan mengembalikan boolean (0/1 dalam APL). Ia menggunakan algoritma yang sama dengan xnor's Python 3 answer .

Penjelasan:

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

Cobalah online

Disimpan 3 byte berkat Dennis!

Alex A.
sumber
4

JavaScript ES6, 38 34 33 byte

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

Fungsi anonim yang sangat sederhana, dan meminjam dari jawaban Python. Mengambil input xsebagai array; mengembalikan trueatau false. Byte dicukur menjadi Molarmanful dan jrich

Program 38 byte, mengambil setiap angka sebagai argumen:

(a,b,c)=>[a,b,c].some(t=>t==(a+b+c)/2)
Conor O'Brien
sumber
Coba x=>x.some(a=>a==eval(x.join`+`)/2), yang menghemat 4 byte.
Mama Fun Roll
@ ӍѲꝆΛҐӍΛПҒЦꝆ Terima kasih! Trik yang bagus.
Conor O'Brien
x=>x.some(a=>2*a==x[0]+x[1]+x[2])sepertinya berhasil.
jrich
@ jrich, terima kasih! Trik yang bagus!
Conor O'Brien
3

Oracle SQL 11.2, 49 byte

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

Menulis ulang solusi @xnor, pujian kepadanya.

Jeto
sumber
3

J, 6 byte

+/e.+:

Cobalah dengan J.js .

Bagaimana itu bekerja

+/e.+:    Monadic verb. Argument: A
    +:    Double the elements of A.
+/        Compute the sum of the elements of A.
  e.      Test for membership.
Dennis
sumber
3

DUP , 31 karakter / 39 byte

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

Try it here!

Pengajuan DUP pertama saya! Unicode adalah tirammu.

Ini adalah fungsi anonim / lambda. Pemakaian:

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

Penjelasan

[                               {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
sumber
Saya tidak berpikir itu cara pengodean bekerja ...
Conor O'Brien
ømemiliki titik kode 248, jadi satu byte jika disandikan sebagai ISO 8859-1.
Dennis
1
... yang baik-baik saja selama penerjemah benar-benar dapat bekerja dengan file sumber yang disandikan ISO 8859-1.
Martin Ender
@ MartinBüttner Saya tidak berpikir itu mungkin untuk menguji itu.
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
sumber
3

Perl 6, 20 19 byte

Saya memiliki dua fungsi yang sama dalam jumlah byte, jadi saya akan menempatkan keduanya. Hargai siapa pun yang menggelitik kesukaan Anda.

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

Penggunaan: tetapkan salah satu ke variabel dari mana Anda dapat memanggilnya.
EDIT: Terima kasih @ b2gills untuk pengurangan byte

Tombol cepat
sumber
{@_∋@_.sum div 2}dan {@_∋+~(@_.sum/2)}keduanya lebih pendek
Brad Gilbert b2gills
Oh, terima kasih, saya selalu lupa Anda dapat memanggil jumlah sebagai metode yang tepat
Hotkeys
Apa yang harus dilakukan
User112638726
"∋" adalah operator infiks 'berisi', yang mengatakan bahwa kiri berisi kanan. Ini adalah saudara perempuan dari op "elemen" ∈ "yang mengatakan bahwa kiri adalah elemen dari kanan. Keduanya sama-sama mengatur operasi dan perl 6 sebenarnya mendukung banyak lainnya juga! docs.perl6.org/language/…
Hotkeys
3

Java 8 (fungsi lambda), 29 byte

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

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

Solusi Java code golf biasanya hanya singkat ketika program tidak harus menjadi program yang berfungsi penuh. (* Batuk batuk * deklarasi kelas, metode utama)

HyperNeutrino
sumber
2

Pyth, 6 byte

/Q/sQ2

Cobalah online!

Mengharapkan input sebagai daftar bilangan bulat. Output 0 jika tidak ada angka yang dapat dibangun dengan mengurangi dua lainnya dan> 0 jika setidaknya satu bisa.

Penjelasan:

Algoritma yang sama dengan jawaban @xnor

/ Q / sQ2

   sQ # Jumlah semua elemen dalam daftar
  / 2 # Bagi jumlah dengan 2
/ Q # Hitung Kejadian nomor di atas dalam daftar
Denker
sumber
2

05AB1E , tidak bersaing

4 byte , tidak bersaing karena hal yang bodoh. Kode:

DO;¢

Menggunakan 0 sebagai falsy dan> 0 sebagai benar. Menggunakan pengodean CP-1252.

Adnan
sumber
Apa hal "bodoh" yang membuat ini tidak bersaing?
Kyle Kanos
@KyleKanos Saya sudah menulis di Info.txt yang ;membagi dua bagian atas tumpukan. Tapi coba tebak, saya belum pernah menerapkannya -_-.
Adnan
1
Ah. Saya bisa melihat bagaimana itu akan melakukannya
Kyle Kanos
2

Kona 16 karakter

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

Mengambil vektor dari tumpukan, menjumlahkannya, membaginya dengan 2 dan menentukan apakah itu ada dalam vektor. Mengembalikan 1 sebagai kebenaran dan 0 sebagai falsey.

Dipanggil via

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

jq, 17 karakter

(Namun menulis ulang lain xnor 's Python 3 jawaban . Upvotes harus pergi ke satu itu.)

contains([add/2])

Input: array 3 bilangan bulat.

Contoh dijalankan:

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

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

Tes online:

jq, 18 karakter

(17 karakter kode + 1 opsi opsi perintah karakter.)

contains([add/2])

Input: daftar 3 bilangan bulat.

Contoh dijalankan:

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

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

MATL , 5 byte

Menggunakan pendekatan hebat @ xnor :

s2/Gm

Cobalah 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

Pendekatan brute-force, 12 byte :

Y@TT-1h*!s~a

Cobalah 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
sumber
2

𝔼𝕊𝕄𝕚𝕟, 7 karakter / 9 byte

ï⒮≔⨭ï/2

Try it here (Firefox only).

Ah. Saya masih menemukan cara yang lebih baik. Ini hanya algoritma luar biasa @ xnor.

Mama Fun Roll
sumber
2

CJam, 10 12 byte

l~:d_:+2/&

2 byte dihapus berkat @ MartinBüttner.

Ini menampilkan angka sebagai hasil yang benar, dan tidak ada hasil sebagai hasil yang palsu.

Coba di sini

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
sumber
2

Serius, 6 byte

,;䫡u

Menghasilkan 0 jika false dan bilangan bulat positif sebaliknya.

Mego
sumber
2

Mathematica, 20 19 byte

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

Berfungsi serupa dengan sebagian besar jawaban lainnya.

LegionMammal978
sumber
Bagaimana dengan MemberQ[2{##},+##]&? (dan Anda lupa jumlah byte Anda)
Martin Ender
2

Haskell, 20 byte

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

Menggunakan solusi xnor.

basile-henry
sumber
Karena (/)tidak berfungsi untuk bilangan bulat dan tantangannya meminta bilangan bulat, saya tidak yakin ini sebenarnya solusi yang valid.
Zeta
Saya tidak melihat itu. Haruskah konversi tipe menjadi bagian dari kode? Seperti ini: (\l->sum l/2`elem`l).map fromIntegerdan dapat digunakan seperti ini: ((\l->sum l/2`elem`l).map fromInteger) ([2,3,5] :: [Integer]). Saya kira apa yang membuat saya marah adalah xnor atau menyebutkan penggunaan python 3 sehingga input tidak harus 3.0 bukan 3. Saya pikir tipe input tidak ditentukan, seperti cara mereka ditulis ...
basile- henry
Jika jenisnya benar-benar masalah, bukankah fakta bahwa saya mengambil daftar sebagai masukan lebih merupakan masalah?
basile-henry
Poin bagus. Saya akan bertanya OP tentang itu. Tetapi mengingat bahwa semua jawaban lain juga menggunakan daftar, saya kira tidak apa-apa (juga, sekarang saya mengerti mengapa fungsi Anda tidak mengetik cek saat menggunakan tupel).
Zeta
Ya jika inputnya adalah tuple dan bukan daftar sumatau tidak elemakan bekerja, saya mungkin harus menentukan itu adalah daftar tetapi karena jawaban ini secara harfiah apa yang xnor kirimkan (dalam Haskell) saya tidak berpikir itu perlu. :)
basile-henry
2

Perl, 24 + 4 = 28 byte

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

Membutuhkan -paXbendera untuk dijalankan, dicetak 1sebagai Benar dan tidak ada yang Salah:

-X menonaktifkan semua peringatan.

$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 7'
$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 8'
1
andlrc
sumber
Yang menginspirasi. Terinspirasi ini: $_=eval(y/ /+/r)/2~~@F(menggunakan opsi baris perintah yang sama).
manatwork
@manatwork Cara menarik untuk menggunakan tr:)
andlrc
Anda bisa mengabaikannya -Xdengan menentukan beberapa versi Perl [5.10 .. 5.18). (Pertandingan pintar diperkenalkan pada 5.10 dan peringatan eksperimental diperkenalkan pada 5.18. Versi mana pun di antara keduanya akan bekerja dengan baik ~~tanpa -X.)
manatwork
1

Jolf, 6 byte

Coba di sini!

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

Ini adalah solusi hebat xnor untuk masalah ini, tetapi di Jolf.

Conor O'Brien
sumber
1

Tiang , 8

Namun implementasi lain dari algoritma xnor.

i:As2A/_

Bagaimana itu bekerja:

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
sumber
1

SpecBAS - 36 byte

Menggunakan rumus xnors

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

menghasilkan 1 jika benar dan 0 jika salah

Brian
sumber
1

05AB1E , 6 5 byte

;Oм_O

-1 byte dengan membuat port dari algoritma Python 3 @xnor .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

Saya cukup yakin м_Odapat dipersingkat, tapi saya tidak yakin perintah mana yang harus saya gunakan untuk itu ..

Kevin Cruijssen
sumber