FOIL La tipizzazione forte di Python!


35

Il tuo compito è scrivere del codice in Python 2 o 3 in modo che questa espressione:

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

valuterà Truesenza sollevare eccezioni.

Per chiarire, copierò il tuo codice in un file, quindi fromil file import *. Quindi scriverò l'espressione nella console e verificherò che lo sia True.

Questo è code-golf, quindi vince la risposta con la lunghezza più breve (in byte).

Risposte:


20

54 52 50 49 48 45 39 byte

Rimossi 4 byte grazie a Dennis.

L'ultima versione è ispirata al "qualche motivo" nella risposta di xnor.

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

Bello! C'è 0 .__mul__per lambda y:0ma è della stessa lunghezza.
xnor

x.countsalva un byte.
Dennis,

1
Non capisco ... type(t(), t())o t().type(t())genera un'eccezione, quindi cosa sta succedendo quando lo fai t() + t()?
feersum

1
@feersum __add__viene chiamato con due, ma il primo viene interpretato come self, otherviene solo passato a type. Strano, si.
Jonathan Allan,

1
@feersum: a + bprimi tentativi a.__add__(b). a.__add__è typecosì che diventa type(b). La differenza chiave tra questo caso e il solito caso di metodi è che di solito, a.__add__sarebbe un oggetto diverso da quello impostato __add__nella definizione della classe, a causa del protocollo descrittore , che implementano gli oggetti di funzione ordinaria. (Ci sono anche alcune altre parti difficili che non sono rilevanti qui.)
user2357112 supporta Monica il

10

54 byte

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

Crea un oggetto che eredita da int, tranne l'aggiunta o la chiamata restituisce solo una copia di se stesso.

Stessa lunghezza:

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

Ho pensato mino {}.getavrebbe funzionato al posto di lambda a,b:a, ma per qualche ragione agiscono solo sul secondo argomento.



1
Oops, ho visto solo programmazione-puzzle , golf.
xnor

3
È stata una vera riduzione
Addison Crump,

@xnor Non funziona perché minha già un __self__attributo, quindi la classe salta il binding di se stessa. Perché minha __self__un'altra domanda ...
matsjoyce,

@matsjoyce: No, non ha nulla a che fare con il fatto che minha un __self__. min.__self__è solo un artefatto di come le funzioni integrate e i metodi integrati sono implementati nello stesso tipo. minnon funziona qui perché, diversamente dalle funzioni scritte in Python, le funzioni integrate non supportano il protocollo descrittore, che è responsabile dell'associazione del primo argomento.
user2357112 supporta Monica il

3

81 66 byte

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

1

68 byte

Sebbene non possa realmente competere con le risposte esistenti, questo in realtà esegue il calcolo in questione:

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

Spiegazione:

  • SymPy è un modulo per calcoli simbolici.
  • sympy.abccontiene tutti i simboli singola lettera, in particolare quelli di nome a, b, c, e d.
  • a+bè un Addoggetto, che rappresenta una somma generale.
  • type(a+b).__call__= […]scimmia corregge la Addclasse per dargli capacità di valutazione, in questo caso consentendole di funzionare come una moltiplicazione di chiamante e chiamante.
  • expand è necessario per rendere effettivamente le espressioni uguali (poiché SymPy esegue solo controlli di uguaglianza approfonditi su richiesta).
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.