당신은 숫자의 목록 L = [17, 5, 9, 17, 59, 14]
, 운영자 가방 O = {+:7, -:3, *:5, /:1}
과 숫자가 제공 N = 569
됩니다.
직무
L
왼쪽의 모든 숫자 와 N
오른쪽 의 숫자 만 사용하는 방정식을 출력합니다 . 이것이 가능하지 않으면 False를 출력하십시오. 솔루션 예 :
59*(17-5)-9*17+14 = 569
한계와 설명
- 숫자를 연결할
[13,37]
수 없습니다 (로 사용할 수 없음1337
) - 에 자연수와 0 만 나타납니다
L
. - 순서는
L
중요하지 않습니다. - 의 모든 숫자를 사용해야합니다
L
. - 만 연산자는
+
,-
,*
,/
에 나타납니다O
. O
필요한 것보다 많은 연산자를 가질 수 있지만 최소한|L|-1
연산자는- 의 값까지 각 연산자를 여러 번 사용할 수 있습니다
O
. - 네 가지 연산 모두
O
표준 수학 연산입니다. 특히/
정확한 분수를 갖는 정규 분할입니다.
포인트들
- 적은 점수, 더 나은
- 코드의 모든 문자는 하나의 포인트를 제공합니다
읽기 쉬운 골프 용 버전을 제공해야합니다.
배경
비슷한 질문은 스택 오버플로에 질문을 받았다. 흥미로운 코드 골프 과제라고 생각했습니다.
계산 복잡성
Peter Taylor가 의견에서 말했듯 이 다음과 같이 부분 집합 합계 를 해결할 수 있습니다 .
- 부분 집합 합계의 인스턴스가 있습니다 (따라서 정수 세트 S와 숫자 x)
- L : = S + [0, ..., 0] (| S | 곱하기 0), N : = x, O : = {+ : | S | -1, * : | S | -1, / : 0,-: 0}
- 이제 내 문제 의이 사례를 해결하십시오.
- 부분 집합 합계에 대한 솔루션은 0으로 곱하지 않은 S의 수입니다.
O (2 ^ n)보다 나은 알고리즘을 찾으면 P = NP임을 증명합니다. 으로 NP 대 P가 A는 밀레니엄 상 문제 때문에 가치가 100 만 미국 달러, 누군가가 이것에 대한 해결책을 발견하는 것이 매우 어렵다. 그래서 나는 순위의이 부분을 제거했습니다.
테스트 사례
다음은 유일하게 유효한 답변이 아니며 다른 솔루션이 있으며 허용됩니다.
- (
[17,5,9,17,59,14]
,{+:7, -:3, *:5, /:1}
,569
)
=>59 * (17-5)- 9 * 17 + 14 = 569
- (
[2,2]
,{'+':3, '-':3, '*':3, '/':3}
,1
)
=>2/2 = 1
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,16
)
=>5+10-2*3+7+0+0+0+0+0+0+0 = 16
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,15
)
=>5+10+0*(2+3+7)+0+0+0+0+0+0 = 15
정확한 분수, 정수 (
—
반 시계 회전을 중단
/
≡ div
), 부동 소수점, 반올림 할 수없는 오류 등 어떤 종류의 산술이 사용 됩니까?
계산 복잡성에 대해 복잡한 스코어링 규칙이 필요한 이유는 무엇입니까? 부분 집합 합계를 쉽게 줄일 수 있으므로 O (2 ^ n)보다 나은 것은 백만 달러의 가치가 있습니다.
—
피터 테일러
세 번째 테스트 사례는 거짓이 아닙니다 ...
—
Shmiddty
5+10+2*3+7*0+0...
m = |L|
? 그렇다면 어떻게 런타임이 해당 목록의 크기에 의존하지 않을 것으로 예상 할 수 있습니까? 예를 들면 다음과 같습니다[2,2],[+,+,...,+,/],1
. 사실, n은 O (m)이므로 m으로 만 쓸 수 있습니다.