Tugas Anda adalah menulis beberapa kode dengan Python 2 atau 3 sehingga ungkapan ini:
(a+b)(c+d) == a*c + b*c + a*d + b*d
akan mengevaluasi True
tanpa menaikkan pengecualian.
Untuk memperjelas, saya akan menyalin kode Anda ke dalam file, lalu from
file tersebut import *
. Lalu saya akan mengetik ekspresi ke konsol dan memverifikasi itu True
.
Ini adalah kode-golf, jadi jawabannya dengan panjang terpendek (dalam byte) menang.
0 .__mul__
untuklambda y:0
tapi panjangnya sama.x.count
menghemat satu byte.type(t(), t())
ataut().type(t())
melempar pengecualian, jadi apa yang terjadi ketika Anda melakukannyat() + t()
?__add__
dipanggil dengan dua, tetapi yang pertama ditafsirkan sebagaiself
, hanyaother
diteruskan ketype
. Aneh ya.a + b
percobaan pertamaa.__add__(b)
.a.__add__
adalahtype
, jadi itu menjaditype(b)
. Perbedaan utama antara kasus ini dan kasus biasa untuk metode adalah bahwa biasanya,a.__add__
akan menjadi objek yang berbeda dari yang Anda atur__add__
dalam definisi kelas, karena protokol deskriptor , yang mengimplementasikan objek fungsi biasa. (Ada juga beberapa bit rumit lainnya yang tidak relevan di sini.)54 byte
Membuat objek yang mewarisi dari
int
, kecuali menambahkan atau menelepon hanya mengembalikan salinannya sendiri.Sama panjang:
Saya pikir
min
atau{}.get
akan bekerja di tempatlambda a,b:a
, tetapi untuk beberapa alasan mereka hanya bertindak pada argumen kedua.sumber
min
sudah memiliki__self__
atribut, sehingga kelas melompati pengikatan sendiri. Mengapamin
memiliki__self__
pertanyaan lain ...min
memiliki__self__
.min.__self__
hanyalah artefak tentang bagaimana fungsi dan metode bawaan diimplementasikan sebagai jenis yang sama.min
tidak berfungsi di sini karena tidak seperti fungsi yang ditulis dengan Python, fungsi bawaan tidak mendukung protokol deskriptor, yang bertanggung jawab untuk mengikat argumen pertama.8166 bytesumber
68 byte
Meskipun tidak dapat benar-benar bersaing dengan jawaban yang ada, yang ini benar-benar melakukan perhitungan yang dipertanyakan:
Penjelasan:
sympy.abc
berisi semua simbol huruf tunggal, dalam yang khusus bernamaa
,b
,c
, dand
.a+b
adalahAdd
objek, yang mewakili jumlah umum.type(a+b).__call__= […]
monkey-patchAdd
kelas untuk memberikannya kemampuan evaluasi, dalam hal ini memungkinkannya bekerja seperti penggandaan penelepon dan callee.expand
diperlukan untuk membuat ekspresi benar-benar sama (karena SymPy hanya melakukan pemeriksaan kesetaraan menyeluruh berdasarkan permintaan).sumber