파이썬의 강력한 타이핑!


35

당신의 임무는 다음 식으로 파이썬 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 바이트

Dennis 덕분에 4 바이트가 제거되었습니다.

최신 버전은 xnor의 답변에서 "어떤 이유"에서 영감을 얻었습니다.

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

좋은! 거기 0 .__mul__에 대한 lambda y:0하지만 같은 길이입니다.
xnor

x.count바이트를 저장합니다.
Dennis

1
나는 그것을 얻지 못 type(t(), t())하거나 ... t().type(t())예외를 던지므로 당신이 할 때 무슨 일이 일어나고 t() + t()있습니까?
feersum

1
@feersum __add__은 두 개로 호출되지만 첫 번째는로 해석되고 self로만 other전달됩니다 type. 이상하다.
Jonathan Allan

1
@feersum : a + b먼저 시도합니다 a.__add__(b). a.__add__type즉가되도록, type(b). 이 경우와 메소드의 일반적인 경우의 주요 차이점은 보통 일반 함수 객체가 구현하는 디스크립터 프로토콜 로 인해 클래스 정의에서 a.__add__설정 한 것과 다른 객체라는 것 입니다. (여기에 관련이없는 몇 가지 다른 까다로운 비트도 있습니다.)__add__
user2357112는

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
그것은 상당히 줄어
들었습니다

@xnor min이미 __self__속성을 가지고 있기 때문에 작동하지 않으므로 클래스는 자체 바인딩을 건너 뜁니다. 또 다른 질문이있는 이유 min__self__...
matsjoyce

@matsjoyce : 아니요, . min가있는 사실과는 아무런 관련이 없습니다 __self__. min.__self__내장 함수와 내장 메소드가 동일한 유형으로 구현되는 방식의 인공물입니다. min내장 함수는 파이썬으로 작성된 함수와 달리 첫 번째 인수를 바인딩하는 디스크립터 프로토콜을 지원하지 않기 때문에 여기서 작동하지 않습니다.
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+bAdd일반 합을 나타내는 개체.
  • type(a+b).__call__= […]monkey는 Add클래스를 패치하여 평가 기능을 제공하며,이 경우 호출자와 호출 수신자의 곱셈처럼 작동 할 수 있습니다.
  • expand 실제로 표현식을 동일하게 만드는 데 필요합니다 (SymPy는 요청시 철저한 동등성 검사 만 수행하므로).
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.