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.


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!


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.


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.


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!


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)

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.


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.

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}

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

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


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


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

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.


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

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

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


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)

2

Serius, 6 byte

,;䫡u

Menghasilkan 0 jika false dan bilangan bulat positif sebaliknya.


2

Mathematica, 20 19 byte

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

Berfungsi serupa dengan sebagian besar jawaban lainnya.


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.


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

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.


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.

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


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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.