Giúp Beth thoát khỏi sa mạc


11

Mặc dù tương tự như câu đố mang nước khác , các khía cạnh độc đáo của thử thách này làm cho nó hoàn toàn khác.

Bê

Beth nằm ở một ốc đảo giữa sa mạc. Có rất nhiều nước trong hồ, nhưng thật không may, chỉ có các thùng X, mỗi thùng có dung tích Y lít nước.

Beth có thể mang 2 thùng trong tay, nhưng để sống sót, cô phải uống đúng 1 lít sau mỗi km cô đi. Cô ấy cũng có thể để một số xô nửa chừng (nước không bay hơi).

Các thách thức

Chỉ ra công thức và viết giải pháp ngắn nhất sẽ hoạt động cho các giá trị nguyên dương của X và Y và tính khoảng cách tối đa mà Beth có thể đi từ ốc đảo. Nước di chuyển giữa các xô được cho phép.

Thí dụ

X = 3, Y = 5

  1. Beth để lại 1 xô đầy 3KM từ ốc đảo, quay trở lại (uống lần cuối từ ốc đảo)
  2. Beth mang đến một thùng đầy đủ khác tại điểm 3KM, hiện có 12L.
  3. Beth có thể tiến tới điểm 6KM và để lại xô với 4L nước trong đó.
  4. Quay trở lại điểm 3KM. Bây giờ cô ấy có chính xác 2L để trở lại ốc đảo.
  5. Đổ đầy xô và đi đến điểm 6KM. Hiện cô có 8L nước.
  6. Tiếp tục tất cả các cách để điểm 15KM.

Trả lời là: 15

Đầu ra đầu vào

Bạn có thể xác định X / Y trực tiếp trong mã hoặc đọc từ đầu vào. Kết quả có thể được đặt trong biến hoặc đầu ra, tùy theo cái nào là ngắn nhất.


2
Đây có phải là mã golf? Nó được gắn thẻ như một thách thức mã.
Dennis

Vâng, đó là mã golf, tôi đã thêm thẻ. Hãy đến với một công thức chính xác và thể hiện nó thông qua mã.
romaninsh

1
Tôi nghĩ rằng nó đáng để mở rộng ở bước 1. Ban đầu tôi không rõ ràng về cách Beth có thể đi 6km chỉ với 5 lít nước: cô ấy chỉ uống sau mỗi km cô ấy đi, và ở lần cuối cùng cô ấy ở ốc đảo.
xnor

1
Bạn có thể đưa ra một trường hợp thử nghiệm, theo cách mà một chương trình sẽ xuất nó không?
Pavel

Chỉnh sửa câu hỏi để giải quyết cả hai điểm.
romaninsh

Câu trả lời:


2

JavaScript (ES6), 25 byte

x=>y=>((x<3?x:3)+x)*y/2+1
x=>y=>(x<3?x+x:x+3)*y/2+1
x=>y=>(x<3?x:(x+3)/2)*y+1
x=>y=>(x<3?x:x/2+1.5)*y+1

Tất cả những tính toán này có cùng giá trị; Tôi dường như không thể đưa ra một công thức ngắn hơn.

Khi xít hơn 3, bạn lấy càng nhiều nước càng tốt và đi bộ càng xa càng tốt, điều đó đơn giản x*y+1.

Khi xcó ít nhất 3, bạn phải bắt đầu xây dựng bộ đệm.

Từ ốc đảo, bạn có thể để một thùng đầy ở khoảng cách xa y/2và quay trở lại ốc đảo. Bạn cần 2 thùng để làm điều này, nhưng điều này không hữu ích nếu bạn chỉ có 2 thùng vì bạn muốn có thể lấp đầy 2 thùng khi bạn quay trở lại ốc đảo.

Từ ốc đảo, với một cái xô ở khoảng cách xa y/2, bạn có thể để một cái xô đầy ở khoảng cách xa yvà trở về ốc đảo. Bạn cần 3 thùng để làm điều này.

Từ ốc đảo, với đầy đủ xô ở cả hai yy/2, bạn có thể để một thùng đầy ở khoảng cách xa 3y/2và quay trở lại ốc đảo. Bạn cần 4 thùng để làm điều này. Sau đó, bạn phải để một thùng đầy đủ ở một khoảng cách y/2và trở về ốc đảo.

Cuối cùng, bạn có thể kết thúc với một xô đầy đủ tại (x-1)y/2. (Bạn không thể để một thùng đầy đủ tại xy/2vì bạn sẽ không thể quay lại ốc đảo, vì chuyến đi khứ hồi là xytổng công suất của các thùng.)

Sử dụng các thùng còn lại của bạn, bạn có thể để các thùng đầy đủ tại (x-3)y/2... yhoặc y/2. Tại thời điểm này, bạn chỉ cần đi bộ càng xa càng tốt, nhặt những chiếc xô đầy đủ của bạn khi bạn đi. Khi bạn đạt đến (x-1)y/2bạn vẫn còn hai thùng đầy đủ, cho phép bạn tiếp cận (x+3)y/2.

Phần bổ sung 1đến từ việc giải quyết các quy tắc cho phép bạn đi được quãng đường cuối cùng mà không cần có nước. Mặc dù ví dụ cho thấy rằng bạn có thể để các thùng cách xa hơn một chút so với mô tả ở trên, nhưng điều này thực sự không giúp bạn đi được nữa, vì bạn phải để lại ít nước hơn hoặc uống nước từ xô khi bạn đến trước khi bạn có thể di chuyển trê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.