¡FALLE el fuerte tipeo de Python!

35

Su tarea es escribir algún código en Python 2 o 3 de modo que esta expresión:

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

evaluará a Truesin plantear ninguna excepción.

Para aclarar, copiaré su código en un archivo, luego fromel archivo import *. Luego escribiré la expresión en la consola y verificaré que sea así True.

Este es el código de golf, por lo que gana la respuesta con la longitud más corta (en bytes).

Fruta Esolanging
fuente

Respuestas:

20

54 52 50 49 48 45 39 bytes

Eliminado 4 bytes gracias a Dennis.

La última versión está inspirada en "alguna razón" en la respuesta de xnor.

class t(int):__add__=type
a=b=t()
c=d=0
jimmy23013
fuente
¡Agradable! Hay 0 .__mul__para lambda y:0pero es de la misma longitud.
xnor
x.countGuarda un byte.
Dennis
1
No lo entiendo ... type(t(), t())o t().type(t())lanza una excepción, entonces, ¿qué sucede cuando lo haces t() + t()?
feersum
1
@feersum __add__se llama con dos, pero el primero se interpreta como self, solo otherse pasa a type. Raro si.
Jonathan Allan
1
@feersum: a + bprimeros intentos a.__add__(b). a.__add__es decir type, eso se convierte type(b). La diferencia clave entre este caso y el caso habitual de los métodos es que, por a.__add__lo general, sería un objeto diferente del que se estableció __add__en la definición de clase, debido al protocolo descriptor , que implementan los objetos de función ordinarios. (También hay algunas otras partes difíciles que no son relevantes aquí.)
user2357112 es compatible con Monica el
10

54 bytes

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

Hacer un objeto que herede de int, excepto que agregar o llamar solo devuelve una copia de sí mismo.

Mismo largo:

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

Pensé mino {}.getfuncionaría en lugar de lambda a,b:a, pero por alguna razón actúan solo en el segundo argumento.

xnor
fuente
1
(es código-golf )
Addison Crump
1
Vaya, solo vi rompecabezas de programación, jugaré golf.
xnor
3
Eso fue una gran reducción oo
Addison Crump
@xnor No funciona porque minya tiene un __self__atributo, por lo que la clase omite vincularse a sí misma. Por qué mintiene __self__otra pregunta ...
matsjoyce
@matsjoyce: No, no tiene nada que ver con el hecho de que mintiene un __self__. min.__self__es solo un artefacto de cómo se implementan las funciones integradas y los métodos integrados como el mismo tipo. minno funciona aquí porque, a diferencia de las funciones escritas en Python, las funciones integradas no admiten el protocolo descriptor, que es responsable de vincular el primer argumento.
user2357112 es compatible con Monica el
3

81 66 bytes

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

68 bytes

Si bien no puede competir realmente con las respuestas existentes, esta realmente realiza el cálculo en cuestión:

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

Explicación:

  • SymPy es un módulo para cálculos simbólicos.
  • sympy.abccontiene todos los símbolos de una sola letra, en las particulares nombrados a, b, c, y d.
  • a+bes un Addobjeto, que representa una suma general.
  • type(a+b).__call__= […]monkey parchea la Addclase para darle capacidades de evaluación, en este caso permitiéndole funcionar como una multiplicación de quien llama y quien llama.
  • expand es necesario para que las expresiones sean realmente iguales (ya que SymPy solo realiza comprobaciones de igualdad exhaustivas bajo demanda).
Wrzlprmft
fuente