FOIL mengetik kuat Python!

35

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 Truetanpa menaikkan pengecualian.

Untuk memperjelas, saya akan menyalin kode Anda ke dalam file, lalu fromfile 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.

Buah Esolanging
sumber

Jawaban:

20

54 52 50 49 48 45 39 byte

Dihapus 4 byte berkat Dennis.

Versi terbaru terinspirasi oleh "beberapa alasan" dalam jawaban xnor.

class t(int):__add__=type
a=b=t()
c=d=0
jimmy23013
sumber
Bagus! Ada 0 .__mul__untuk lambda y:0tapi panjangnya sama.
xnor
x.countmenghemat satu byte.
Dennis
1
Saya tidak mengerti ... type(t(), t())atau t().type(t())melempar pengecualian, jadi apa yang terjadi ketika Anda melakukannya t() + t()?
feersum
1
@feersum __add__dipanggil dengan dua, tetapi yang pertama ditafsirkan sebagai self, hanya otherditeruskan ke type. Aneh ya.
Jonathan Allan
1
@feersum: a + bpercobaan pertama a.__add__(b). a.__add__adalah type, jadi itu menjadi type(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.)
user2357112 mendukung Monica
10

54 byte

class m(int):__call__=__add__=lambda*x:m()
a=b=c=d=m()

Membuat objek yang mewarisi dari int, kecuali menambahkan atau menelepon hanya mengembalikan salinannya sendiri.

Sama panjang:

class m(int):__call__=__add__=lambda a,b:a
a=b=c=d=m()

Saya pikir minatau {}.getakan bekerja di tempat lambda a,b:a, tetapi untuk beberapa alasan mereka hanya bertindak pada argumen kedua.

Tidak
sumber
1
(ini kode-golf )
Addison Crump
1
Ups, saya hanya melihat teka-teki pemrograman , akan bermain golf.
xnor
3
Itu pengurangan yang cukup besar
Addison Crump
@ xnor Tidak berfungsi karena minsudah memiliki __self__atribut, sehingga kelas melompati pengikatan sendiri. Mengapa minmemiliki __self__pertanyaan lain ...
matsjoyce
@matsjoyce: Tidak, itu tidak ada hubungannya dengan fakta yang minmemiliki __self__. min.__self__hanyalah artefak tentang bagaimana fungsi dan metode bawaan diimplementasikan sebagai jenis yang sama. mintidak berfungsi di sini karena tidak seperti fungsi yang ditulis dengan Python, fungsi bawaan tidak mendukung protokol deskriptor, yang bertanggung jawab untuk mengikat argumen pertama.
user2357112 mendukung Monica
3

81 66 byte

class e:__mul__=lambda*o:0;__add__=lambda*o:lambda x:0
a=b=c=d=e()
Jonathan Allan
sumber
1

68 byte

Meskipun tidak dapat benar-benar bersaing dengan jawaban yang ada, yang ini benar-benar melakukan perhitungan yang dipertanyakan:

from sympy.abc import*
type(a+b).__call__=lambda x,y:(x*y).expand()

Penjelasan:

  • SymPy adalah modul untuk perhitungan simbolik.
  • sympy.abcberisi semua simbol huruf tunggal, dalam yang khusus bernama a, b, c, dan d.
  • a+badalah Addobjek, yang mewakili jumlah umum.
  • type(a+b).__call__= […]monkey-patch Addkelas 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).
Wrzlprmft
sumber