BÓNG đánh máy mạnh mẽ của Python!


35

Nhiệm vụ của bạn là viết một số mã bằng Python 2 hoặc 3 sao cho biểu thức này:

(a+b)(c+d) == a*c + b*c + a*d + b*d

sẽ đánh giá Truemà không đưa ra bất kỳ ngoại lệ.

Để làm rõ, tôi sẽ sao chép mã của bạn vào một tệp, sau đó fromlà tệp import *. Sau đó, tôi sẽ gõ biểu thức vào bàn điều khiển và xác minh rằng nó là True.

Đây là môn đánh gôn, vì vậy câu trả lời có độ dài ngắn nhất (tính bằng byte) sẽ thắng.

Câu trả lời:


20

54 52 50 49 48 45 39 byte

Đã xóa 4 byte nhờ Dennis.

Phiên bản mới nhất được lấy cảm hứng từ "một số lý do" trong câu trả lời của xnor.

class t(int):__add__=type
a=b=t()
c=d=0

Tốt đẹp! Có 0 .__mul__cho lambda y:0nhưng nó cùng độ dài.
xnor

x.counttiết kiệm một byte.
Dennis

1
Tôi không hiểu ... type(t(), t())hoặc t().type(t())ném ngoại lệ, vậy chuyện gì đang xảy ra khi bạn làm vậy t() + t()?
frageum

1
@feersum __add__được gọi với hai, nhưng cái đầu tiên được hiểu là self, chỉ otherđược truyền cho type. Lạ, đúng vậy.
Jonathan Allan

1
@feersum: a + blần thử đầu tiên a.__add__(b). a.__add__type, vì vậy mà trở thành type(b). Sự khác biệt chính giữa trường hợp này và trường hợp thông thường cho các phương thức là thông thường, a.__add__sẽ là một đối tượng khác với điều bạn đặt __add__trong định nghĩa lớp, do giao thức mô tả , mà các đối tượng hàm thông thường thực hiện. (Ngoài ra còn có một số bit phức tạp khác không liên quan ở đây.)
user2357112 hỗ trợ Monica

10

54 byte

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

Tạo một đối tượng kế thừa từ int, ngoại trừ thêm hoặc gọi chỉ trả về một bản sao của chính nó.

Cùng chiều dài:

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

Tôi đã nghĩ minhoặc {}.getsẽ làm việc thay thế lambda a,b:a, nhưng vì một số lý do, họ chỉ hành động theo lập luận thứ hai.



1
Rất tiếc, tôi chỉ thấy câu đố lập trình , sẽ chơi gôn.
xnor

3
Đó là một mức giảm khá nhiều
Addison Crump

@xnor Nó không hoạt động vì minđã có một __self__thuộc tính, vì vậy lớp bỏ qua tự ràng buộc. Tại sao lại min__self__một câu hỏi khác ...
matjoyce

@matsjoyce: Không, nó không liên quan gì đến thực tế là min__self__. min.__self__chỉ là một tạo tác về cách các hàm dựng sẵn và các phương thức dựng sẵn được triển khai như cùng một loại. minkhông hoạt động ở đây vì không giống như các hàm được viết bằng Python, các hàm dựng sẵn không hỗ trợ giao thức mô tả, chịu trách nhiệm ràng buộc đối số đầu tiên.
user2357112 hỗ trợ Monica


1

68 byte

Mặc dù nó không thể thực sự cạnh tranh với các câu trả lời hiện có, nhưng câu trả lời này thực sự thực hiện phép tính trong câu hỏi:

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

Giải trình:

  • SymPy là một mô-đun cho các tính toán tượng trưng.
  • sympy.abcchứa tất cả những biểu tượng đơn thư, trong những người đặc biệt được đặt tên a, b, c, và d.
  • a+blà một Addđối tượng, đại diện cho một tổng số chung.
  • type(a+b).__call__= […]khỉ vá các Addlớp để cung cấp cho nó khả năng đánh giá, trong trường hợp này cho phép nó hoạt động như một phép nhân của người gọi và callee.
  • expand là cần thiết để làm cho các biểu thức thực sự bằng nhau (vì SymPy chỉ thực hiện kiểm tra công bằng theo yêu cầu).
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.