Nhân với các hoạt động hạn chế


44

500 tiền thưởng không chính thức để đánh bại câu trả lời tốt nhất hiện tại .

Mục tiêu

Mục tiêu của bạn là nhân hai số chỉ bằng một tập hợp rất hạn chế các phép toán số học và phép gán biến.

  1. Thêm vào x,y -> x+y
  2. Đối ứng x -> 1/x( không phân chia x,y -> x/y)
  3. Phủ định x -> -x( không trừ x,y -> x-y, mặc dù bạn có thể thực hiện dưới dạng hai thao tác x + (-y))
  4. Hằng số 1(không cho phép các hằng số khác, trừ khi được tạo bởi các hoạt động từ 1)
  5. Phân công biến [variable] = [expression]

Chấm điểm: Các giá trị bắt đầu bằng các biến ab. Mục tiêu của bạn là lưu sản phẩm của họ a*bvào biến cbằng cách sử dụng càng ít thao tác càng tốt. Mỗi thao tác và gán +, -, /, =chi phí một điểm (tương đương, mỗi lần sử dụng (1), (2), (3) hoặc (4)). Hằng số 1là miễn phí. Giải pháp ít điểm nhất sẽ thắng. Tiebreak là bài sớm nhất.

Phụ cấp: Biểu thức của bạn phải chính xác về mặt thực tế đối với các số thực "ngẫu nhiên" ab. Nó có thể thất bại trong tập hợp con số 0 của R 2 , tức là một tập hợp không có diện tích nếu được vẽ trong mặt phẳng a- bCartesian. (Điều này có thể cần thiết do sự đối ứng của các biểu thức có thể 0giống như 1/a.)

Ngữ pháp:

Đây là một . Không có hoạt động khác có thể được sử dụng. Cụ thể, điều này có nghĩa là không có hàm, điều kiện, vòng lặp hoặc kiểu dữ liệu không phải là số. Đây là một ngữ pháp cho các hoạt động được phép (khả năng được phân tách bằng |). Một chương trình là một chuỗi các <statement>s, trong đó a <statement>được đưa ra như sau.

<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

Bạn thực sự không phải đăng mã theo ngữ pháp chính xác này, miễn là nó rõ ràng những gì bạn đang làm và số lượng hoạt động của bạn là đúng. Ví dụ, bạn có thể viết a-bcho a+(-b)và đếm nó như hai cuộc phẫu thuật, hoặc xác định macro cho ngắn gọn.

(Có một câu hỏi trước đây Nhân mà không cần Nhân , nhưng nó cho phép một tập hợp hoạt động lỏng lẻo hơn nhiều.)


4
Điều này thậm chí có thể?
Ypnypn

1
@Ypnypn Có, và tôi đã viết một ví dụ để đảm bảo.
xnor

2
Điều này cảm thấy giống như một thách thức trong đó một giải pháp tối ưu có khả năng được tìm thấy (một khi bất kỳ giải pháp nào đã được tìm thấy). Vì vậy, những gì các breaker trong trường hợp đó?
Martin Ender

1
@ MartinBüttner Tiebreak được đăng sớm nhất trong trường hợp đó. Tôi nghĩ rằng có rất nhiều chỗ để tối ưu hóa, vì vậy tôi không nghĩ rằng đó sẽ chỉ là một cuộc đua để tìm ra một hoạt động và viết nó sạch sẽ. Ít nhất, đó là những gì tôi tìm thấy khi thử nó; có lẽ ai đó sẽ tìm thấy một giải pháp tối thiểu rõ ràng.
xnor

2
Ok vì không phải ai cũng nghĩ rằng anwer của tôi cũng buồn cười như tôi, tôi đã xóa nó và nhận xét ở đây: Quy tắc về tập hợp số 0 không được lựa chọn rất khôn ngoan vì các số hữu tỷ là số đo được đặt cho số đo lebesgue, tôi đề nghị sử dụng một tỷ lệ nhất định thay thế. (Hoặc một loại khác) Nhưng tôi hoàn toàn thích ý tưởng của thử thách này!
flawr

Câu trả lời:


34

22 hoạt động

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

Hãy thử trực tuyến!

Các ops là 10 bổ sung, 7 đảo ngược, 2 phủ định và 3 bài tập.

Vì vậy, làm thế nào tôi có được điều này? Tôi bắt đầu với mẫu trông đầy hứa hẹn về tổng của hai phân số hai tầng, một mô típ đã xuất hiện trong nhiều lần thử trước đó.

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

Khi chúng tôi giới hạn tổng số x+y+z+w=0, một sự hủy bỏ đẹp xảy ra, đưa ra:

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

trong đó có chứa một sản phẩm. (Nó thường dễ dàng hơn để có được t*u/vhơn là t*uvì người đầu tiên có độ 1.)

Có một cách đối xứng hơn để suy nghĩ về biểu hiện này. Với hạn chế x+y+z+w=0, các giá trị của chúng được chỉ định bởi ba tham số p,q,rcủa tổng cặp của chúng.

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

và chúng tôi có c=-q*r/p. Tổng pđược phân biệt là nằm trong mẫu số tương ứng với các cặp (x,y)(z,w)các biến có cùng phân số.

Đây là một biểu thức hay cho cin p,q,r, nhưng phần hai tầng nằm trong x,y,z,wvì vậy chúng ta phải diễn đạt cái trước theo nghĩa sau:

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

Bây giờ, chúng tôi muốn chọn p,q,rsao cho c=-q*r/pbằng a*b. Một lựa chọn là:

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

Sau đó, các giá trị nhân đôi cho qrđược giảm một nửa thuận tiện trong:

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

Lưu 2dưới dạng một biến tvà cắm chúng vào phương trình để cđưa ra giải pháp 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

Có 12 bổ sung, 6 đảo ngược, 4 phủ định và 2 bài tập.

Rất nhiều ops được dành để thể hiện x,y,z,wtrong điều khoản 1,a,b. Để lưu ops, thay vào đó hãy thể hiện xbằng p,q,r(và do đó a,b,1) và sau đó viết y,z,wtheo x.

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

Lựa chọn

p = 1
q = a
r = b

và bày tỏ cvới một phủ định như c=-q*r/p, chúng ta nhận được

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

Thật không may, giảm một nửa xlà tốn kém. Nó cần phải được thực hiện bằng cách đảo ngược, thêm kết quả cho chính nó và đảo ngược lại. Chúng tôi cũng phủ nhận để sản xuất nxcho -x, vì đó là những gì y,z,wsử dụng. Điều này cho chúng ta giải pháp 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

itxlà 1 / (2 * x) và nx-x. Một tối ưu hóa thức thể hiện 1/xnhư itx+itxthay vì templated 1/(-nx)cắt giảm một nhân vật và mang xuống giải pháp cho 22 ops.


Có tối ưu hóa dễ dàng đến 21 hoạt động. itx + itxxảy ra hai lần, nhưng itxkhông xảy ra trong bất kỳ bối cảnh nào khác. Xác định thay thế ix = (1+1)/(1+a+b)và bạn thay thế hai bổ sung bằng một.
Peter Taylor

Và bằng cách trích xuất m = -1, có thể nhận được 20:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
Peter Taylor

3
Ah, cả hai tối ưu hóa đều thất bại vì hoạt động được hỗ trợ là đối ứng chứ không phải phân chia.
Peter Taylor

Nếu abchỉ cách nhau một, thì a + nx = 0hoặc b + nx = 0, làm cho giải pháp của bạn chia cho số không.
MooseOnTheRocks

1
@MooseOnTheRocks Điều đó tốt, hãy xem "trợ cấp" trong thử thách rằng mã có thể thất bại trong tập hợp con zero-zero. Tôi nghĩ rằng thách thức là không thể khác.
xnor

26

23 hoạt động

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

bằng chứng vụ nổ:

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

Tôi đã lạm dụng wolfram alpha để có được hình ảnh đẹp này (wolfram alpha đã cố gắng để tôi đăng ký pro để lưu nó, nhưng sau đó ctrl-c ctrl-v ;-)):

điểm số (có thêm +vào phép trừ):

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

Chúc mừng giải pháp ngắn nhất!
xnor

@xnor cảm ơn vì đã cho tôi câu trả lời đầu tiên được chấp nhận và tiền thưởng đầu tiên của tôi!
tự hào

Không kén chọn, nhưng không nên ... (b + 1)) - 1 + 1 ... và ... 1)) - (1 / a + ... được ... (b + 1 )) + - 1 + 1 ... và ... 1)) + - (1 / a + ... tương ứng?
tfitzger

@tfitzger Tôi nghĩ nó dễ hơn theo cách đó. Câu hỏi nói rằng nó không quan trọng. Lưu ý tôi đếm số điểm chính xác (Mỗi điểm trừ là hai)
tự hào

Wolfram Alpha có bản dùng thử miễn phí 7 ngày, fyi.
ghosts_in_the_code

13

29 hoạt động

Không hoạt động cho tập {(a, b) R 2 | a + b = 0 hoặc a + b = -1 hoặc ab = 0 hoặc ab = -1}. Đó có lẽ là số không?

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

Cấu trúc của rfc(Reciprocal-Four-C) rõ ràng hơn nếu chúng ta xác định một macro:

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)

Hãy làm toán:

  • s(x), về mặt toán học, 1/(1/x - 1/(x+1))đó là sau một chút đại số là x*(x+1)hay x*x + x.
  • Khi bạn phụ tất cả mọi thứ vào rfc, nó thực sự 1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))chỉ là 1/((a+b)^2 - (a-b)^2).
  • Sau khi sự khác biệt của hình vuông, hoặc chỉ mở rộng đồng bằng, bạn nhận được rằng rfc1/(4*a*b).
  • Cuối cùng, clà đối ứng của 4 lần rfc, vì vậy 1/(4/(4*a*b))trở thành a*b.

2
+1, tôi đang ở giữa hoàn thành phép tính giống hệt này
Eric Tressler

1
Đó chắc chắn là số không; đó là một liên minh của các dòng.
xnor

Sẽ không đưa ra nhận xét về sự kết hợp của các dòng ... @alacticmshark Bạn có thể cho chúng tôi biết thêm về cách bạn đã đưa ra danh tính này không? Làm thế nào bạn đã giải quyết vấn đề?
flawr

1
@flawr Tôi nhớ lại rằng các thuộc tính s(x)phù hợp với yêu cầu của câu hỏi, từ phép tính, vì vậy điều đó có nghĩa là tôi có hàm vuông. Sau một vài lần lo lắng, tôi thấy tôi có thể nhận được một a*bthuật ngữ với sự khác biệt của thủ thuật bình phương. Khi tôi đã có nó, đó là vấn đề thử các bài tập đã lưu hoạt động.
thuật toán

Vì bạn sử dụng -1ba lần trong rfc, bạn không thể đánh gôn một nhân vật bằng cách gán nó cho một biến?
isaacg

9

27 hoạt động

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: =++-

Không có lý thuyết đằng sau điều này. Tôi chỉ cố gắng để có được (const1+a*b)/const2và bắt đầu với (1/(1-a)+1/(1+b))(-1/a+1/b).


Bạn tmpthực sự là 23, làm cho điểm số của bạn 27. Mặc dù vậy, tìm thấy tốt đẹp.
thuật toán
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.