การพิมพ์ที่แข็งแกร่งของ FOIL Python!


35

งานของคุณคือการเขียนโค้ดใน Python 2 หรือ 3 เพื่อให้นิพจน์นี้:

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

จะประเมินTrueโดยไม่เพิ่มข้อยกเว้นใด ๆ

ชี้แจงผมจะคัดลอกโค้ดของคุณลงในไฟล์แล้วไฟล์from แล้วฉันจะพิมพ์นิพจน์ลงคอนโซลและตรวจสอบว่ามันเป็นimport *True

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่มีความยาวสั้นที่สุด (เป็นไบต์) จะชนะ

คำตอบ:


20

54 52 50 49 48 45 39 ไบต์

นำออก 4 ไบต์ด้วย Dennis

รุ่นล่าสุดได้รับแรงบันดาลใจจาก "เหตุผลบางอย่าง" ในคำตอบของ xnor

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

ดี! มี0 .__mul__ไว้สำหรับlambda y:0แต่มันมีความยาวเท่ากัน
xnor

x.countบันทึกเป็นไบต์
เดนนิส

1
ฉันไม่ได้รับมัน ... type(t(), t())หรือt().type(t())พ่นยกเว้นดังนั้นสิ่งที่เกิดขึ้นเมื่อคุณทำt() + t()?
feersum

1
@feersum __add__เรียกว่ามีสอง แต่คนแรกที่ถูกตีความว่าเป็นselfเพียงถูกส่งไปยังother typeแปลกใช่
Jonathan Allan

1
@feersum: แรกพยายามa + b คือเพื่อที่จะกลายเป็น ความแตกต่างที่สำคัญระหว่างกรณีนี้และกรณีปกติสำหรับวิธีการคือโดยปกติแล้วจะเป็นวัตถุที่แตกต่างจากสิ่งที่คุณตั้งค่าไว้ในคำจำกัดความของคลาสเนื่องจากโปรโตคอลตัวอธิบายซึ่งวัตถุฟังก์ชันทั่วไปใช้ (นอกจากนี้ยังมีบิตหากินอื่น ๆ อีกสองสามตัวที่ไม่เกี่ยวข้องที่นี่)a.__add__(b)a.__add__typetype(b)a.__add____add__
user2357112 รองรับ Monica

10

54 ไบต์

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

สร้างวัตถุที่สืบทอดมาintยกเว้นการเพิ่มหรือการโทรเพียงแค่ส่งคืนสำเนาของตัวเอง

ความยาวเท่ากัน:

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

ฉันคิดminหรือ{}.getจะทำงานแทนlambda a,b:aแต่ด้วยเหตุผลบางอย่างที่พวกเขาทำเฉพาะในข้อโต้แย้งที่สอง


1
(มันเป็นรหัสกอล์ฟ )
Addison Crump

1
โอ๊ะฉันเห็น แต่ปริศนาตัวเขียนโปรแกรมเท่านั้นที่จะเล่นกอล์ฟ
xnor

3
นั่นเป็นการลด oo
Addison Crump

@xnor มันไม่ทำงานเพราะminมี__self__แอตทริบิวต์อยู่แล้วดังนั้นคลาสจะข้ามการผูกมัดตนเอง ทำไมถึงminมี__self__คำถามอื่น ...
matsjoyce

@matsjoyce: ไม่มันไม่ได้มีอะไรจะทำอย่างไรกับความจริงที่ว่ามีmin เป็นเพียงสิ่งประดิษฐ์ของวิธีการใช้งานฟังก์ชั่นในตัวและวิธีการในตัวเป็นประเภทเดียวกัน ไม่ทำงานที่นี่เพราะไม่เหมือนกับฟังก์ชั่นที่เขียนใน Python ฟังก์ชั่นในตัวไม่รองรับโปรโตคอล descriptor ซึ่งมีหน้าที่ผูกมัดอาร์กิวเมนต์แรก __self__min.__self__min
user2357112 รองรับ Monica


1

68 ไบต์

แม้ว่ามันจะไม่สามารถแข่งขันกับคำตอบที่มีอยู่ได้ แต่สิ่งนี้จะทำการคำนวณจริง ๆ

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

คำอธิบาย:

  • SymPy เป็นโมดูลสำหรับการคำนวณเชิงสัญลักษณ์
  • sympy.abcประกอบด้วยสัญลักษณ์ตัวอักษรเดียวในคนโดยเฉพาะอย่างยิ่งการตั้งชื่อa, b, และcd
  • a+bเป็นAddวัตถุซึ่งแสดงถึงผลรวมทั่วไป
  • type(a+b).__call__= […]Monkey-patch เป็นAddคลาสที่ให้ความสามารถในการประเมินผลในกรณีนี้ทำให้สามารถใช้งานได้เหมือนการเพิ่มจำนวนผู้เรียกและผู้รับสาย
  • expand จำเป็นต้องทำให้นิพจน์มีค่าเท่ากันจริง ๆ (เนื่องจาก SymPy ทำการตรวจสอบความเท่าเทียมกันอย่างละเอียดตามความต้องการเท่านั้น)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.