파이썬 2.7 - 380 378 372 371 367 363 357 354 352 348 336 문자
단순한 무차별 대입 검색.
from itertools import*
s=lambda x:[x]['1'>x>'0':]+['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
def E(e):
try:return eval(e.replace("^","**"))
except:0
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
print len(A)
for v in A:print v,A[v]
예제 실행 :
1
300
9
128 (2^(8-1))
289 ((9+8)^2)
216 (6^(1+2))
121 (11^2)
153 (3*51)
25 (5^2)
125 (5^(2+1))
126 (6*21)
127 ((2^7)-1)
설명:
s(x)
일련의 숫자가 포함 된 문자열을 가져 와서 해당 숫자를 사용하는 모든 표현식을 순서대로 반환하는 함수입니다.
[x]['1'>x>'0':]
x가 '0'이거나 '0'으로 시작하지 않는 일련의 숫자 인 경우 x를 포함하는 목록으로 평가합니다. 그렇지 않으면 빈 목록으로 평가됩니다. 기본적으로 이것은 모든 숫자를 함께 결합하는 경우를 처리합니다.
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
기본적으로 x를 두 부분으로 나누고 (길이가 0이 아닌) 각 부분에서 s ()를 호출하고 product ()를 사용하여 모든 결과를 그들 사이의 일부 연산자와 결합합니다.
E(e)
기본적으로 안전한 평가입니다. e가 유효하면 e의 값을 리턴하고 그렇지 않으면 None을 리턴합니다.
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
기본적 으로이 코드는 범위의 모든 숫자를 시도하고 숫자를 치환하고 x가 '0'으로 시작하지 않으면 첫 번째 표현식을 무시하고 s ()가 해당 순열에 대해 생성하는 각 표현식을 테스트합니다. 0 '이면 첫 번째 표현식은 x입니다.
대체 버전-397 자
분수를 사용해야하는 경우 내 코드는 다음과 같습니다.
from fractions import*
from itertools import*
s=lambda x:["Fraction(%s)"%x]['1'>x>'0':]+['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
def E(e):
try:return eval(e.replace("^","**"))
except:0
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
print len(A)
for v in A:print v,A[v].replace("Fraction","")
/작동 방식을 설명 할 수 있습니까 ? 예를 들어 무엇1/3입니까?