FOIL digitação forte do Python!

35

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 Truesem 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.

Esolanging Fruit
fonte

Respostas:

20

54 52 50. 49. 48. 45 39 bytes

Removidos 4 bytes graças a Dennis.

A versão mais recente é inspirada no "algum motivo" na resposta do xnor.

class t(int):__add__=type
a=b=t()
c=d=0
jimmy23013
fonte
Agradável! Há 0 .__mul__por, lambda y:0mas é do mesmo comprimento.
Xnor
x.countsalva um byte.
Dennis
11
Eu não entendo ... type(t(), t())ou t().type(t())lança uma exceção, então o que está acontecendo quando você faz t() + t()?
feersum
11
@feersum __add__é chamado com dois, mas o primeiro é interpretado como self, somente otheré passado para type. Estranho sim.
Jonathan Allan
11
@feersum: a + bprimeiras tentativas a.__add__(b). a.__add__é type, então isso se torna type(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.)
user2357112 suporta Monica
10

54 bytes

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

Crie um objeto que herda int, exceto adicionar ou chamar apenas retorna uma cópia de si mesmo.

Mesmo comprimento:

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

Eu pensei minou {}.getiria trabalhar no lugar de lambda a,b:a, mas por algum motivo eles agem apenas no segundo argumento.

xnor
fonte
11
código-golfe )
Addison Crump
11
Opa, eu só vi quebra-cabeças de programação , vai jogar golfe.
Xnor
3
Isso foi uma redução bastante oo #
Addison Crump
@xnor Não funciona porque minjá possui um __self__atributo, então a classe pula a ligação de si mesma. Por que mintem __self__é outra questão ...
matsjoyce
@ matsjoyce: Não, não tem nada a ver com o fato de minter um __self__. min.__self__é apenas um artefato de como funções internas e métodos internos são implementados como o mesmo tipo. minnã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.
User2357112 suporta Monica
3

81 66 bytes

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

68 bytes

Embora não possa realmente competir com as respostas existentes, esta efetua o cálculo em questão:

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

Explicação:

  • SymPy é um módulo para cálculos simbólicos.
  • sympy.abccontém todas single-letra símbolos, nomeadamente os nomeados a, b,c , ed .
  • a+b é um Add objeto que representa uma soma geral.
  • type(a+b).__call__= […] remenda o macaco Add 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).
Wrzlprmft
fonte