Giải quyết vấn đề xe đẩy


14

Các triết gia từ lâu đã suy ngẫm về vấn đề Xe đẩy . Thật không may, không có con người đã giải quyết vấn đề này. May mắn thay, là lập trình viên, chúng tôi có thể sử dụng máy tính để giải quyết vấn đề cho chúng tôi!

Đầu vào

Chương trình của bạn sẽ lấy đầu vào là một đồ thị có hướng (hữu hạn) (có nhiều nhất một cạnh từ xđến y, cho bất kỳ xy), với một nút được chỉ định và một số nguyên không âm được gắn vào mỗi cạnh (đại diện cho số người được gắn với rãnh đó) . Ngoài ra, mỗi nút có ít nhất một cạnh thoát.

Xe đẩy bắt đầu tại nút được chỉ định. Mỗi lượt, nếu xe đẩy ở nút x, người thực dụng chọn một cạnh (x,y). Những người ở rìa đó chết, và xe đẩy hiện đang ở rìa y. Quá trình này tiếp diễn mãi mãi.

Lưu ý rằng mọi người chỉ có thể chết một lần, vì vậy nếu cạnh (x,y)nngười bị trói, và xe đẩy chạy qua họ, giả sử, 100 lần, nó vẫn sẽ chỉ dẫn đến ntử vong.

Đầu ra

Người thực dụng đưa ra lựa chọn của mình theo cách giảm thiểu số người chết (được đảm bảo là hữu hạn, vì chỉ có những người hữu hạn). Chương trình của bạn sẽ xuất số này.

định dạng đầu vào

Bạn có thể lấy biểu đồ đầu vào theo bất kỳ cách hợp lý nào bạn muốn. Ví dụ: bạn có thể lấy nó làm ma trận và đếm nút được chỉ định là nút có nhãn 0. Hoặc bạn có thể sử dụng một cái gì đó như x1,y1,n1;x2,y2,n2;.... Ví dụ 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0để đại diện cho vấn đề xe đẩy tiêu chuẩn (với các vòng lặp ở cuối).

Tủ thử

  • 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0 -> 1 (Đi từ 0 đến a, a đến c (giết một người), rồi tiếp tục vòng xe đẩy từ c đến c).
  • 0,0,1;0,a,5;a,a,0 -> 1 (Tiếp tục từ 0 đến 0, chạy mãi mãi trên 1 người),
  • 0,a,5;0,b,1;a,a,1;b,b,6 -> 6 (0 -> a -> a -> a -> a -> ... (lưu ý rằng giải pháp tham lam đi đến b sẽ không chính xác))
  • 0,a,1;0,b,5;a,b,1;b,a,1 -> 3 (0 -> a -> b -> a -> b -> ...)
  • 0,a,1;0,b,1;a,a,0;b,b,0 -> 1 (Lưu ý rằng có hai tùy chọn khác nhau mà người thực dụng có thể cho rằng cả hai chỉ giết một người)

Đây là , vì vậy câu trả lời ngắn nhất sẽ thắng! Chúc may mắn.

Lưu ý: Sẽ không có vòng lặp bệnh devòng lặp đa nhiệm bị cấm. Ngoài ra, mặc dù tôi thích nghĩ về vấn đề này theo ba điều luật của Asimov, Peter Taylor đã lưu ý trong hộp cát rằng vấn đề này tương đương về mặt toán học với việc tìm ra rho (đường vòng trở lại chính nó) có trọng lượng thấp nhất .


4

2
@BetaDecay có, nhưng do nâng cấp lên xe đẩy, họ cư xử giống như những người bình thường cho mục đích của câu hỏi này.
PyRulez

Câu trả lời:


6

Thạch , 27 23 byte

ṗL$µṭ0FIm2ASµÐḟµQ⁴ySµ€Ṃ

Hãy thử trực tuyến! (trường hợp thử nghiệm cuối cùng)

Phiên bản độc ác (Làm mất lòng nhiều người nhất)

Lấy đầu vào là số. Đối với ví dụ cuối cùng, 1a2b. 0là nút bắt đầu. Đối số đầu tiên là danh sách các cạnh (ví dụ [0,1],[0,2],[1,1],[2,2]) và đối số thứ hai là danh sách các cạnh và số người trên đó (ví dụ [[0,1],[0,2],[1,1],[2,2]],[1,1,0,0]).

Làm thế nào nó hoạt động

ṗL$µṭ0FIm2ASµÐḟµQ⁴ySµ€Ṃ
ṗL$                       - on the first argument, get the Cartesian power of it to its length.
                            this gives all paths of the length of the input. Cycles are implicit
   µ        µÐḟ           - get valid paths starting with 0 -- filter by:
    ṭ0                      - prepend 0
      F                     - flatten
       I                    - get the difference between elements
        m2                  - every second difference: 0 for each edge that starts at the node the previous edge ended at, nonzero otherwise.
          AS                - 0 iff all elements are 0
               µ    µ€    - on each path:
                Q           - remove repeat edges.
                 ⁴y         - translate according to the mapping in the second program argument
                   S        - Sum
                      Ṃ   - get the minimum of these.

@Shaggy Umm, không chắc ý bạn là gì? Jelly có làm tổn thương mắt của bạn hay gì không?
Erik the Outgolfer 29/07/17

1
@EriktheOutgolfer anh ấy đang đề cập đến phiên bản của chương trình cố gắng cắt xén nhiều người nhất .
fireflame241

@Shaggy Đó sẽ là một thử thách thú vị.
PyRulez

9

Python 3 , 80 byte

y=lambda d,s=0,p=[],f=0:f in p and s or min(y(d,s+d[f][t],p+[f],t)for t in d[f])

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

Đưa đầu vào dưới dạng từ điển được khóa bởi id nút. Các mục là một từ điển của hàng xóm và số người trên đường giữa một nút và hàng xóm. Ví dụ, đối với trường hợp thử nghiệm đầu tiên:

{0: {1: 0}, 1: {2: 5, 3: 1}, 2: {2: 0}, 3: {3: 0}}

0 là nút bắt đầu, 1 là nút 'a', 2 là nút 'b', v.v.


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.