FOIL Python güçlü yazıyor!


35

Görevin, Python 2 veya 3'te bu ifadenin yer aldığı kod yazmak.

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

Trueİstisnaları yükseltmeden değerlendirir .

Netleştirmek için, kodunuzu bir dosyaya sonra fromda dosyaya kopyalayacağım import *. Sonra ifadeyi konsola yazıp doğrulayacağım True.

Bu kod golf, yani en kısa uzunluğa (bayt cinsinden) sahip olan cevap kazanır.

Yanıtlar:


20

54 52 50 49 48 45 39 bayt

Dennis sayesinde 4 bayt kaldırıldı.

En son sürüm, xnor'ın cevabındaki "bazı nedenlerden" esinlenmiştir.

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

Güzel! Şunun 0 .__mul__için var lambda y:0ama aynı uzunluk.
xnor

x.countbir bayt kaydeder.
Dennis,

1
Anlamadım ... type(t(), t())ya da t().type(t())bir istisna atarsan, ne zaman oluyorsun t() + t()?
feersum

1
@feersum __add__iki ile çağrılır, ancak birincisi selfsadece othergeçirildiği şeklinde yorumlanır type. Garip, evet
Jonathan Allan,

1
@ feersum: a + bilk dener a.__add__(b). a.__add__öyle type, öyle olur type(b). Bu vaka ile yöntemlerin olağan durumu arasındaki temel fark, genellikle, normal fonksiyon nesnelerinin uyguladığı tanımlayıcı protokol nedeniyle sınıf tanımlamasında a.__add__belirlediğinizden farklı bir nesne olmasıdır . (Burada ilgili olmayan birkaç başka zor bit daha var.)__add__
user2357112

10

54 bayt

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

Miras alan bir nesneyi yapmak int, eklemek veya çağırmak dışında sadece bir kopyasını döndürür.

Aynı uzunluk:

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

Düşündüm minya {}.getda çalışacaktım lambda a,b:aama bir nedenden ötürü sadece ikinci argüman üzerinde hareket ediyorlar.



1
Hata! Sadece programlama yapbozunu gördüm , golf oynayacak.
xnor

3
Bu oldukça bir azalma oldu
Addison Crump,

@xnor Çalışmıyor çünkü minzaten bir __self__özniteliği var, bu yüzden sınıf kendi kendine bağlamayı atlıyor. Neden minsahip __self__başka sorum ...
matsjoyce

@matsjoyce: Hayır, aslında bir ilgisi yoktur minbir sahiptir __self__. min.__self__yerleşik fonksiyonların ve yerleşik metotların aynı tipte nasıl uygulandığının bir eseridir. minBurada çalışmaz çünkü Python'da yazılmış işlevlerin aksine, yerleşik işlevler ilk argümanı bağlamadan sorumlu olan tanımlayıcı protokolünü desteklemez.
user2357112, 1


1

68 bayt

Mevcut cevaplarla gerçekten rekabet edemese de, bu gerçekten söz konusu hesaplamayı yapıyor:

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

Açıklama:

  • SymPy sembolik hesaplamalar için bir modül.
  • sympy.abcTüm tek harfli sembolleri içeren, adında belirli olanlarda a, b, c, ve d.
  • a+bAddgenel bir toplamı temsil eden bir nesnedir.
  • type(a+b).__call__= […]maymunu Addsınıfına değerlendirme kabiliyetleri kazandırması için sınıflandırır, bu durumda arayan ve callee çarpımı gibi çalışmasını sağlar.
  • expand ifadelerin gerçekte eşit olmasını sağlamak için gereklidir (çünkü SymPy yalnızca talep üzerine tam bir eşitlik kontrolü yapar).
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.