제한된 연산으로 곱하기


44

있다 (500) 담당자 비공식 현상금 맞아서에 대한 현재의 최선의 대답은 .

목표는 매우 제한된 산술 연산과 변수 할당 만 사용하여 두 개의 숫자를 곱하는 것입니다.

  1. 부가 x,y -> x+y
  2. 역수 x -> 1/x( 되지 분할 x,y -> x/y)
  3. 부정 x -> -x( 하지 뺄셈 x,y -> x-y, 당신은 두 가지 작업으로 그것을 할 수 있지만 x + (-y))
  4. 상수 1(의 연산에 의해 생성 된 것을 제외하고 다른 상수는 허용되지 않음 1)
  5. 변수 할당 [variable] = [expression]

스코어링 : 값은 변수 a및로 시작합니다 b. 목표는 가능한 한 적은 조작으로 제품 a*b을 변수 에 저장하는 것 c입니다. 각 작업 및 할당 +, -, /, =에는 포인트가 필요합니다 (동일하게 (1), (2), (3) 또는 (4)의 각 사용). 상수 1는 무료입니다. 가장 적은 점수의 솔루션이 승리합니다. Tiebreak는 가장 빠른 게시물입니다.

수당 : 귀하의 표현 "임의의"실수에 대한 산술적으로 정확해야 a하고 b. R 2 의 측정 값이 0 인 부분 집합 , 즉 a- b직교 평면에 플롯 된 경우 영역이없는 집합에서 실패 할 수 있습니다 . (이것은 0같은 표현의 역수로 인해 필요할 수 있습니다 1/a.)

문법:

이것은 입니다. 다른 작업은 사용할 수 없습니다. 특히 이것은 함수, 조건부, 루프 또는 숫자가 아닌 데이터 유형이 없음을 의미합니다. 허용되는 작업에 대한 문법은 다음과 같습니다 (가능성은로 구분됨 |). 프로그램은 일련의 <statement>s이며 a <statement>는 다음과 같습니다.

<statement>: <variable> = <expr>
<variable>: a | b | c | [string of letters of your choice]
<expr>: <arith_expr> | <variable> | <constant>
<arith_expr>: <addition_expr> | <reciprocal_expr> | <negation_expr> 
<addition_expr>: <expr> + <expr>
<reciprocal_expr>: 1/(<expr>)
<negation_expr>: -<expr>
<constant>: 1

실제로 수행하고있는 작업이 명확하고 작업 수가 올바른 경우이 정확한 문법으로 코드를 게시 할 필요는 없습니다. 예를 들어, 당신은 쓸 수 a-b에 대한 a+(-b)두 개의 작업으로 계산, 또는 간결하게 매크로를 정의합니다.

( Multiply without Multiply 라는 이전 질문이 있었지만 훨씬 느슨한 작업 집합을 허용했습니다.)


4
이것도 가능합니까?
Ypnypn

1
@Ypnypn 예, 그리고 확실하게 예제를 작성했습니다.
xnor

2
이것은 최적의 솔루션을 찾을 수있는 경우 (어느 솔루션이든 발견 된 경우)와 같은 느낌입니다. 그렇다면 타이 브레이커는 무엇입니까?
마틴 엔더

1
이 경우 @ MartinBüttner Tiebreak가 가장 빠른 게시입니다. 나는 최적화의 여지가 충분하다고 생각하므로, 그것이 작동하는 것을 찾아서 깨끗하게 작성하는 것이 경쟁이 될 것이라고 생각하지 않습니다. 적어도 그게 내가 시도한 것입니다. 아마도 누군가가 분명히 최소한의 해결책을 찾을 것입니다.
xnor

2
모두가 내 anwer가 내가 한 것처럼 재미 있다고 생각하지 않았으므로 삭제하고 여기에 의견을 제시하십시오. 대신 특정 비율을 사용하십시오. (또는 다른 종류의) 그러나 나는이 도전의 아이디어를 완전히 좋아한다!
flawr

답변:


34

22 회

itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(itx + itx + 1/(1+nx)) + 1/(1/(a+nx) + 1/(b+nx)) ) #14

온라인으로 사용해보십시오!

작전은 10 개의 덧셈, 7 개의 역수, 2 개의 부정, 3 개의 과제입니다.

그래서 나는 이것을 어떻게 얻었습니까? 나는 이전의 많은 시도에서 나타난 모티브 인 두 개의 이층 분수의 합의 유망한 템플릿으로 시작했습니다.

c = 1/(1/x + 1/y) + 1/(1/z + 1/w)

합계를로 제한하면 x+y+z+w=0아름다운 취소가 발생하여 다음을 제공합니다.

c = (x+z)*(y+z)/(x+y),

제품이 들어 있습니다. ( 첫 번째 학위는 1 학위이기 때문에 종종 얻는 t*u/v것이 더 쉽습니다 t*u.)

이 표현에 대해 더 대칭적인 방법이 있습니다. 제한 사항으로 x+y+z+w=0, 값은 p,q,r쌍별 합계의 세 매개 변수 로 지정됩니다 .

 p = x+y
-p = z+w
 q = x+z
-q = y+w
 r = x+w
-r = y+z

그리고 우리는 c=-q*r/p. 합이 p쌍에 대응하여 분모 인 것으로 구별된다 (x,y)(z,w) 있는 것으로, 동일한 분수에있는 변수에 해당합니다.

이것은 cin에 대한 좋은 표현 p,q,r이지만 double-decker fraction은 in x,y,z,w이므로 후자를 기준으로 전자를 표현해야합니다.

x = ( p + q + r)/2
y = ( p - q - r)/2
z = (-p + q - r)/2
w = (-p - q + r)/2

이제 우리 p,q,rc=-q*r/p같 도록 선택하고 싶습니다 a*b. 하나의 선택은 다음과 같습니다.

p = -4
q = 2*a
r = 2*b

그런 다음에 대한 두 배의 값은 다음 qr같이 편리하게 반으로 줄어 듭니다.

x = -2 + a + b
y = -2 - a - b
z =  2 + a - b
w =  2 - a + b

2변수로 저장 하고이를 t방정식에 꽂으 c면 24-op 솔루션이 제공됩니다.

#24 ops
t = 1+1   #2
c = 1/(1/(-t+a+b) + 1/-(t+a+b))  +  1/(1/(-b+t+a) + 1/(-a+b+t)) #1, 10, 1, 10

12 개의 추가, 6 개의 역, 4 개의 부정 및 2 개의 과제가 있습니다.

x,y,z,w관점 에서 표현하기 위해 많은 작전이 소비 1,a,b됩니다. 작전을 저장하려면, 대신 표현 xp,q,r(때문에 a,b,1) 다음 쓰기 y,z,w의 관점에서 x.

y = -x + p
z = -x + q
w = -x + r

고르는

p = 1
q = a
r = b

c와 같이 부정으로 표현 c=-q*r/p하면

x = (1+a+b)/2
y = -x + 1
z = -x + a
w = -x + b

불행하게도, 반 x은 비용이 많이 든다. 반전, 결과를 추가 한 후 다시 반전하여 수행해야합니다. 우리는를 위해 생산 nx을 부정 합니다. -x왜냐하면 그것이 y,z,w사용 하는 것이기 때문입니다 . 이것은 23-op 솔루션을 제공합니다 :

#23 ops
itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(1/(-nx) + 1/(1+nx))  +  1/(1/(a+nx) + 1/(b+nx)) ) #15

itx1 / (2 * x)이며 nx입니다 -x. 마지막 표현의 최적화 1/xitx+itx대신 템플릿 1/(-nx)문자를 삭감과 22 개 작전에 솔루션 다운을 제공합니다.


21 가지 작업을 쉽게 최적화 할 수 있습니다. itx + itx두 번 발생하지만 itx다른 상황에서는 발생하지 않습니다. 대신 정의 ix = (1+1)/(1+a+b)하면 두 개의 추가를 하나로 대체합니다.
피터 테일러

그리고 추출 m = -1하면 20을 얻을 수 있습니다.nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
Peter Taylor

3
아, 지원되는 작업이 나누기보다는 상호 적이므로 두 최적화 모두 실패합니다.
피터 테일러

만약 ab하나 떨어져, 다음 중 하나입니다 a + nx = 0또는 b + nx = 0, 0으로 나누기에 대한 솔루션을 유발.
MooseOnTheRocks

1
@MooseOnTheRocks 괜찮습니다. 코드가 측정 값이 0 인 부분 집합에서 실패 할 수 있다는 도전에서 "허용"을보십시오. 그렇지 않으면 도전이 불가능하다고 생각합니다.
xnor

26

23 작업

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
res = z+z

폭발에 의한 증거 :

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
             1/(a+1)+1/(b+1)                            == (a+b+2) / (ab+a+b+1)
          1/(1/(a+1)+1/(b+1))                           == (ab+a+b+1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1                         == (ab - 1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1)             == ab / (a+b+2)
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))            == (a+b+2) / ab
                                              1/a+1/b   == (a+b) / ab
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)  == 2 / ab
    1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)) == ab / 2

z = ab / 2 and therefore z+z = ab

나는이 아름다운 이미지를 얻기 위해 wolfram alpha를 남용했습니다 (wolfram alpha는 저를 저장하기 위해 pro에 가입하려고했지만 ctrl-c ctrl-v ;-)).

점수 ( +감산에 추가 ) :

z = ////++/++-+/++++-/+/
res = +

가장 짧은 솔루션을 축하합니다!
xnor

@ xnor 내 첫 번째 수락 답변과 첫 번째 현상금을 주셔서 감사합니다!
자랑스런 Haskeller

칙칙한 것은 아니지만 ... (b + 1))-1 + 1 ... 및 ... 1))-(1 / a + ...는 ... (b + 1) )) +-1 + 1 ... 및 ... 1)) +-(1 / a + ...?
tfitzger 2016 년

@ tfitzger 그렇게 쉬운 방법이라고 생각합니다. 문제는 중요하지 않다고 말합니다. 참고 점수를 정확하게 계산합니다 (마이너스 2)
자랑스런 Haskeller

Wolfram Alpha는 7 일 무료 평가판을 제공합니다.
ghosts_in_the_code

13

29 건

세트 {(a, b) for R 2 | a + b = 0 또는 a + b = -1 또는 ab = 0 또는 ab = -1}. 아마도 0을 측정합니까?

sum = a+b
nb = -b
diff = a+nb
rfc = 1/(1/(1/sum + -1/(sum+1)) + -1/(1/diff + -1/(diff+1)) + nb + nb)  # rfc = 1/4c
c = 1/(rfc + rfc + rfc + rfc)

# sum  is  2: =+
# nb   is  2: =-
# diff is  2: =+
# rfc  is 18: =///+-/++-//+-/+++
# c    is  5: =/+++
# total = 29 operations

rfc매크로를 정의하면 (Reciprocal-Four-C) 의 구조 가 더 분명합니다.

s(x) = 1/(1/x + -1/(x+1))              # //+-/+ (no = in count, macros don't exist)
rfc = 1/(s(sum) + - s(diff) + nb + nb) # =/s+-s++ (6+2*s = 18)

수학을하자 :

  • s(x)수학적 1/(1/x - 1/(x+1))으로 약간의 대수 이후 x*(x+1)또는x*x + x 입니다.
  • 모든 것을 하위에 넣을 때 rfc실제로 1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))1/((a+b)^2 - (a-b)^2) .
  • 사각형의 차이 또는 평범한 확장 후에 rfc1/(4*a*b) 입니다.
  • 마지막으로, c4 배의 역수 rfc때문에, 1/(4/(4*a*b))이된다 a*b.

2
+1,이 동일한 계산을
마치는 중입니다

1
그것은 확실히 0을 측정합니다. 그것은 선의 연합입니다.
xnor

@algorithmshark에 대한 주석을 작성하지 않겠습니다. 문제를 어떻게 극복 했습니까?
flawr

1
@flawr 나는 s(x)미적분학에서 질문의 요구 사항 에 맞는 속성이 사각형 함수를 의미한다는 것을 상기했습니다. 난처한 후, 나는 a*b제곱 트릭의 차이로 용어를 얻을 수 있음을 발견했습니다 . 일단 내가 그것을 얻은 후에는 어떤 할당이 작업을 저장했는지 시도하는 문제였습니다.
algorithmshark

-1에서를 세 번 사용했기 때문에 rfc변수에 지정하여 캐릭터를 골프화 할 수 없습니까?
isaacg 2014 년

9

27 작업

tmp = 1/(1/(1+(-1/(1/(1+(-a))+1/(1+b))))+1/(1/(1/b+(-1/a))+1/(a+(-b))))
res = tmp+tmp+(-1)

# tmp is 23: =//+-//+-+/++///+-/+/+-
# res is 4: =++-

이것 뒤에는 이론이 없습니다. 난 그냥 가려고 (const1+a*b)/const2하고 시작 (1/(1-a)+1/(1+b))하고 (-1/a+1/b).


귀하의 tmp실제 점수는 23 세이며 점수는 27 점입니다.
algorithmshark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.