Bot say rượu cận thị lịch sự trên một bãi mìn


11

Như tiêu đề có thể gợi ý, vấn đề này được lấy cảm hứng từ Bot say rượu cận thị lịch sự của @NP

Bot nghèo của chúng tôi được đặt trên lưới cartesian ở điểm gốc và sau mỗi phút, nó di chuyển 1 đơn vị theo một trong bốn hướng (Lên, Xuống, Trái, Phải).

Sau n phút, tất cả các mỏ tiềm ẩn trên lưới kích hoạt, giết chết bất kỳ bot nghèo nào có thể tự tìm thấy chúng. Các mỏ được đặt tại tất cả các tọa độ nguyên thỏa mãn phương trình | y | = | x |.

Thử thách

Bạn sẽ được cung cấp n , số phút trước khi nổ mìn, làm đầu vào và là đầu ra, bạn phải tìm xác suất để bot chết .

Đầu vào : Một số tự nhiên đại diện cho n .

Đầu ra : Đặt xác suất bot chết là p / q, trong đó p và q là các số nguyên tương đối nguyên tố (q không thể là 0, nhưng p có thể). Đầu ra p.

Quy tắc

  • Thuật toán của bạn không được chạy theo thời gian theo cấp số nhân hoặc cao hơn. Nó lý tưởng nên chạy trong thời gian đa thức hoặc ít hơn.
  • Thuật toán của bạn phải có khả năng xử lý các đầu vào n<20 (có thể điều chỉnh nếu quá khó) trong thời gian hợp lý.
  • Đây là một thách thức .
  • Lặp lại tất cả các khả năng cho một n nhất định chắc chắn sẽ không được chấp nhận như một câu trả lời.

Các trường hợp thử nghiệm

1->0

2->3

4->39

6->135

8->7735

10->28287

Tính toán ví dụ cho n = 6

Chúng tôi có 4 cách di chuyển có thể: U, D, R và L. Tổng số đường có thể được thực hiện là 4 ^ 6 hoặc 4096. Có 4 trường hợp có thể xảy ra dọc theo đường y = x: x, y = ± 1; x, y = ± 2; x, y = ± 3; hoặc x = y = 0. Chúng tôi sẽ đếm số cách kết thúc tại (1,1), (2,2) và (3,3), nhân chúng với 4 để tính các góc phần tư khác và thêm điều này đến số cách kết thúc tại (0,0).

Trường hợp 1: Bot kết thúc tại (3, 3). Để bot kết thúc ở đây, nó phải có 3 bước di chuyển đúng và 3 lần di chuyển lên. Nói cách khác, tổng số cách để đến đây là các cách sắp xếp lại các chữ cái trong chuỗi RRRUUU, trong đó 6 chọn 3 = 20.

Trường hợp 2: Bot kết thúc ở (2,2). Để bot kết thúc ở đây, nó có thể có 2 lần di chuyển lên, 3 lần di chuyển phải và 1 lần di chuyển trái; hoặc 2 di chuyển đúng, 3 di chuyển lên và 1 di chuyển xuống. Do đó, tổng số cách để đến đây là tổng số cách sắp xếp lại các chữ cái trong chuỗi RRRLUU và UUUDRR, cả hai cách này (6 chọn 1) * (5 chọn 2) = 60, với tổng số 120 khả năng .

Trường hợp 3: Bot kết thúc ở (1,1). Để bot kết thúc ở đây, nó có thể có: 1 di chuyển đúng, 3 di chuyển lên và 2 di chuyển xuống. Trong trường hợp này, số cách sắp xếp lại các chữ cái trong chuỗi RUUUDD là (6 chọn 1) * (5 chọn 2) = 60.

1 di chuyển lên, 3 di chuyển phải và 2 di chuyển trái. Trong trường hợp này, số cách sắp xếp lại các chữ cái trong chuỗi URRRLL là (6 chọn 1) * (5 chọn 2) = 60.

2 di chuyển phải, 1 di chuyển trái, 2 di chuyển lên và 1 di chuyển xuống. Trong trường hợp này, số cách sắp xếp lại các chữ cái trong chuỗi UUDRRL là (6 chọn 1) * (5 chọn 1) * (4 chọn 2) = 180.

Do đó, tổng số cách kết thúc tại (1,1) là 300.

Trường hợp 4: Bot kết thúc ở (0,0). Để bot kết thúc ở đây, nó có thể đã có:

3 động tác phải và 3 động tác trái. Trong trường hợp này, số cách sắp xếp lại các chữ cái trong chuỗi RRRLLL là (6 chọn 3) = 20.

3 di chuyển lên và 3 di chuyển xuống. Trong trường hợp này, số cách sắp xếp lại các chữ cái trong chuỗi UUUDDD là (6 chọn 3) = 20.

1 di chuyển phải, 1 di chuyển trái, 2 di chuyển lên và 2 di chuyển xuống. Trong trường hợp này, số cách sắp xếp lại các chữ cái trong chuỗi RLUUDD là (6 chọn 1) * (5 chọn 1) * (4 chọn 2) = 180.

1 di chuyển lên, 1 di chuyển xuống, 2 di chuyển phải và 2 di chuyển trái. Trong trường hợp này, số cách sắp xếp lại các chữ cái trong chuỗi RRLLUD là (6 chọn 1) * (5 chọn 1) * (4 chọn 2) = 180.

Do đó, tổng số cách kết thúc tại (0,0) là 400.

Cộng các trường hợp này lại với nhau, chúng ta có được tổng số cách kết thúc trên | y | = | x | là 4 (20 + 120 + 300) + 400 = 2160. Do đó, xác suất của chúng tôi là 2160/4096. Khi phần này được giảm hoàn toàn, nó là 135/256, vì vậy câu trả lời của chúng tôi là 135 .


Tôi thích thử thách nhưng tôi nghĩ nó sẽ có lợi khi bao gồm một ví dụ hoạt động cho một trong những trường hợp thử nghiệm rất nhỏ (2 hoặc 3) chẳng hạn.
Ông Xcoder

@ Mr.Xcoder Tôi sẽ thêm một cái khi có thời gian.
Don Ngàn

2
Thử thách thú vị. Lưu ý rằng việc sử dụng từ "lý tưởng" trong quy tắc làm cho nó không phải là quy tắc. Sẽ rất hữu ích khi nói chắc chắn cách này hay cách khác.
trichoplax

1
Nhưng không ai nói về thuật toán học tập Gen đầu tiên?
Chương trình Redwolf

1
@RedwolfPrograms ahaha yea nhưng bot này có cái tên ngầu hơn
Don Ngàn

Câu trả lời:


17

Python 2 , 65 byte

def p(n):b=2**n;r=b*b-((~b)**n/b**(n/2)%-b)**2;print~n%2*r/(r&-r)

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

Xác suất bot chết có thể được biểu thị bằng:

f(n)=2ss2, where s=12n(nn/2)

và nhị thức được hiểu bằng khi không phải là toàn bộ.0n/2

Chúng ta có thể lý do như thế này. Xác suất mà bot hạ cánh trên dòng bao nhiêu? Điều này xảy ra nếu tổng số lần di chuyển lên và trái bằng tổng số lần di chuyển xuống và phải. Đây là xác suất tương tự, giả sử, bạn lật một đồng xu lần và nhận được nhiều đuôi như đầu. Bạn phải chọn lần lật làm đầu của lần lật, có thể được thực hiện theo cách , trong tổng số trình tự có thể, đưa ra xác suấty=xnn/2n(nn/2)2n

s=12n(nn/2)

Xác suất hạ cánh của dòng cũng . Vì vậy, xác suất hạ cánh trên một trong hai dòng là tổng của hoặc , ngoại trừ chúng tôi tính hai lần xác suất hạ cánh của ở cả hai dòng và phải trừ đi để bù lại.y=xs2sx=y=0

Hóa ra xác suất hạ cánh trên chỉ là , sản phẩm của xác suất hạ cánh trên mỗi dòng. Chúng ta có thể lập luận các sự kiện là độc lập như sau: nếu chúng ta chọn một chuỗi ngẫu nhiên gồm số "Lên hoặc Trái" và "Xuống hoặc Phải" để hạ cánh trên và tương tự với "Lên hoặc Phải" và "Xuống hoặc Trái" "Với , chúng ta có thể kết hợp chúng một cách duy nhất thành một chuỗi Lên, Xuống, Trái, Phải bằng cách lấy giao điểm của các cặp hướng tại mỗi vị trí.x=y=0s2x=yx=y

Vì vậy, xác suất hạ cánh trên hoặc là .x=yx=y2ss2

Mã này tính toán nhị thức bằng cách sử dụng biểu thức này như với cơ sở . Để trích xuất tử số từ phân số xác suất, chúng tôi lưu ý rằng mẫu số là lũy thừa bằng 2, vì vậy chúng tôi sử dụng biểu thức để phân chia công suất cực đại của 2 là , được biểu thị dưới dạng thủ thuật bit cổ điển .(nn/2)(b+1)**n/b**(n/2)%bb=2**nr/(r&-r)rr&-r

Giải pháp được chơi bằng cách viết là để chỉ được tham chiếu một lần và hoạt động mà không có phân số để ở trong các số nguyên. Tính toán là thời gian đa thức tính theo ngay cả với cách tính nhị phân của máy tính.2ss21(1s)2s1/2nn


Sau khi viết bằng chứng về xác suất bot chết, tôi tìm thấy một cách có thể sạch hơn để chứng minh và trình bày nó.

Hãy theo dõi các giá trị của và sau mỗi lần di chuyển của bot. Mỗi trong bốn hướng lên, xuống, trái và phải tăng hoặc giảm từng hướng của và , với bốn hướng tương ứng với bốn kết hợp.a=x+yb=xyab

Vì vậy, một bước di chuyển ngẫu nhiên tương đương với việc thêm ngẫu nhiên vào và độc lập thành . Điều này tương đương với việc đi bộ ngẫu nhiên riêng biệt trên và .±1a±1bab

Bây giờ, robot kết thúc trên dòng hoặc chính xác khi hoặc . Vì vậy, xác suất kết thúc bằng là và tương tự cho . Do các bước đi là độc lập, nên xác suất và là , do đó xác suất có ít nhất một bằng 0 là phần bù .x=yx=ya=0b=0a=0s=12n(nn/2)b=0a0b0(1s)21(1s)2


3
Tuyệt diệu! Tôi đã chờ đợi ai đó để có được điều này. Tôi không tưởng tượng được nó lại nhanh đến thế. Nhược điểm bây giờ là hầu hết các câu trả lời khác sẽ không phải suy nghĩ quá nhiều :(. Tuyệt vời +1
Don Nghìn

tận hưởng tiền thưởng nhỏ (không có nhiều thứ để cho xin lỗi)
Don Nghìn

1
@RushabhMehta Cảm ơn bạn, đó là loại bạn rất tốt! Tiền thưởng của bạn đã thúc đẩy tôi viết ra một bằng chứng rõ ràng hơn mà tôi nghĩ đến sau đó.
xnor

Cảm hứng thực sự cho vấn đề này là AIME I 2014 số 11, nếu bạn muốn kiểm tra nó.
Don Ngà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.