FOIL сильний набір Python!


35

Ваше завдання полягає в тому, щоб написати якийсь код у Python 2 або 3 таким чином, щоб цей вираз:

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

буде оцінювати, Trueне створюючи жодних винятків.

Для уточнення я скопію ваш код у файл, потім fromу файлimport * . Потім я наберу вираз у консоль і перевірте, чи є він True.

Це код-гольф, тому відповідь з найменшою довжиною (у байтах) виграє.

Відповіді:


20

54 52 50 49 48 45 39 байт

Видалено 4 байти завдяки Деннісу.

Остання версія натхненна "деякою причиною" у відповіді xnor.

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

Приємно! Там 0 .__mul__для, lambda y:0але це однакова довжина.
xnor

x.countзберігає байт.
Денніс

1
Я цього не розумію ... type(t(), t())або t().type(t())кидає виняток, то що відбувається, коли ти робиш t() + t()?
feersum

1
@feersum __add__називається двома, але перший інтерпретується як self, otherпередається тільки type. Дивно, так.
Джонатан Аллан

1
@feersum: a + bперші спроби a.__add__(b). a.__add__є type, так що стає type(b). Ключова відмінність цього випадку від звичайного випадку для методів полягає в тому, що зазвичай a.__add__це буде інший об'єкт від того, що ви встановили __add__у визначенні класу, завдяки протоколу дескриптора , який реалізують звичайні об'єкти функцій. (Також є кілька інших складних бітів, які тут не стосуються.)
user2357112 підтримує Monica

10

54 байти

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

Зробіть об’єкт, який успадковує int, за винятком додавання або виклику, просто повертає копію себе.

Однакова довжина:

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

Я думав minчи {}.getпрацював би замість цього lambda a,b:a, але чомусь вони діють лише за другим аргументом.



1
На жаль, я бачив лише програмування-головоломки , буде гольф.
xnor

3
Це було досить скорочення oo
Addison Crump

@xnor Це не працює, тому що minвже має __self__атрибут, тому клас пропускає прив'язку власного "я". Чому minє __self__ще одне питання ...
matsjoyce

@matsjoyce: Ні, це не має нічого спільного з тим, що minмає __self__. min.__self__це лише артефакт того, як вбудовані функції та вбудовані методи реалізуються як один і той же тип. minтут не працює, оскільки на відміну від функцій, написаних на Python, вбудовані функції не підтримують протокол дескриптора, який відповідає за прив'язку першого аргументу.
user2357112 підтримує Моніку


1

68 байт

Хоча він і справді не може конкурувати з існуючими відповідями, цей фактично виконує відповідний розрахунок:

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

Пояснення:

  • SymPy - модуль для символічних обчислень.
  • sympy.abcмістить всі поодинокі літери символів, зокрема , з них по імені a, b,c , і d.
  • a+b є Add об'єктом, який представляє загальну суму.
  • type(a+b).__call__= […] мавпа-патчі Add класу для надання йому можливостей оцінювання, в цьому випадку дозволяє йому працювати як множення абонента та виклику.
  • expand необхідно, щоб вирази були фактично рівними (оскільки SymPy виконує лише ретельну перевірку рівності за потребою).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.