Sua tarefa é escrever algum código no Python 2 ou 3, de modo que esta expressão:
(a+b)(c+d) == a*c + b*c + a*d + b*d
será avaliado True
sem gerar exceções.
Para esclarecer, copiarei seu código em um arquivo e depois from
no arquivo import *
. Então, digitarei a expressão no console e verificarei se está True
.
Isso é código-golfe, então a resposta com o menor comprimento (em bytes) vence.
0 .__mul__
por,lambda y:0
mas é do mesmo comprimento.x.count
salva um byte.type(t(), t())
out().type(t())
lança uma exceção, então o que está acontecendo quando você fazt() + t()
?__add__
é chamado com dois, mas o primeiro é interpretado comoself
, somenteother
é passado paratype
. Estranho sim.a + b
primeiras tentativasa.__add__(b)
.a.__add__
étype
, então isso se tornatype(b)
. A principal diferença entre esse caso e o caso usual dos métodos é que, normalmente,a.__add__
seria um objeto diferente daquele definido__add__
na definição de classe, devido ao protocolo do descritor , implementado por objetos de função comum. (Também existem alguns outros bits complicados que não são relevantes aqui.)54 bytes
Crie um objeto que herda
int
, exceto adicionar ou chamar apenas retorna uma cópia de si mesmo.Mesmo comprimento:
Eu pensei
min
ou{}.get
iria trabalhar no lugar delambda a,b:a
, mas por algum motivo eles agem apenas no segundo argumento.fonte
min
já possui um__self__
atributo, então a classe pula a ligação de si mesma. Por quemin
tem__self__
é outra questão ...min
ter um__self__
.min.__self__
é apenas um artefato de como funções internas e métodos internos são implementados como o mesmo tipo.min
não funciona aqui porque, diferentemente das funções escritas em Python, as funções internas não suportam o protocolo do descritor, responsável pela ligação do primeiro argumento.8166 bytesfonte
68 bytes
Embora não possa realmente competir com as respostas existentes, esta efetua o cálculo em questão:
Explicação:
sympy.abc
contém todas single-letra símbolos, nomeadamente os nomeadosa
,b
,c
, ed
.a+b
é umAdd
objeto que representa uma soma geral.type(a+b).__call__= […]
remenda o macacoAdd
classe para dar recursos de avaliação, neste caso, permitindo que ela funcione como uma multiplicação de chamador e chamado.expand
é necessário tornar as expressões realmente iguais (já que o SymPy executa apenas verificações completas de igualdade sob demanda).fonte