Bantu Beth melarikan diri dari gurun

11

Meskipun mirip dengan puzzle pembawa air lainnya , aspek unik dari tantangan ini membuatnya sangat berbeda.

Beth

Beth terletak di sebuah oasis di tengah padang pasir. Ada banyak air di danau, tetapi sayangnya hanya ada X ember, yang masing-masing memiliki kapasitas Y liter air.

Beth dapat membawa 2 ember di tangannya, tetapi untuk bertahan hidup, dia harus minum tepat 1 liter setelah setiap kilometer dia bepergian. Dia juga dapat meninggalkan beberapa ember setengah jalan (air tidak menguap).

Tantangan

Cari tahu rumusnya dan tulis solusi terpendek yang akan bekerja untuk nilai integer positif X dan Y dan hitung jarak maksimum yang dapat ditempuh Beth dari oasis. Air bergerak di antara ember diizinkan.

Contoh

X = 3, Y = 5

  1. Beth meninggalkan 1 ember penuh 3 KM jauhnya dari oasis, kembali (minum terakhir dari oasis)
  2. Beth membawa ember penuh pada titik 3KM, memiliki 12L di sana sekarang.
  3. Beth dapat maju ke titik 6km dan meninggalkan ember dengan 4L air di dalamnya.
  4. Kembali ke poin 3 KM. Dia sekarang memiliki tepat 2L untuk kembali ke oasis.
  5. Isi ember dan bepergian ke titik 6 KM. Dia sekarang memiliki 8L air.
  6. Lanjutkan sampai titik 15km.

Jawabannya adalah: 15

Input output

Anda dapat mendefinisikan X / Y secara langsung dalam kode atau membaca dari input. Hasil dapat ditempatkan dalam variabel atau output, mana yang terpendek.

romaninsh
sumber
2
Apakah ini seharusnya kode golf? Ini ditandai sebagai tantangan kode.
Dennis
Ya, ini kode-golf, saya menambahkan tag. Munculkan formula yang benar dan ungkapkan melalui kode.
romaninsh
1
Saya pikir itu layak diperluas pada langkah 1. Pada awalnya tidak jelas bagi saya bagaimana Beth dapat melakukan perjalanan 6 km hanya dengan 5 liter air: dia minum hanya setelah setiap km yang dia lalui, dan yang terakhir dia berada di oasis.
xnor
1
Bisakah Anda memberikan test case, dengan cara program akan menampilkannya?
Pavel
Mengedit pertanyaan untuk mengatasi kedua poin.
romaninsh

Jawaban:

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

Semua ini menghitung nilai yang sama; Sepertinya saya tidak bisa menghasilkan formulasi yang lebih pendek.

Ketika xkurang dari 3, Anda mengambil air sebanyak yang Anda bisa dan berjalan sejauh yang Anda bisa, yang sederhana x*y+1.

Ketika xsetidaknya 3, Anda harus mulai membuat cache.

Dari oasis, Anda dapat meninggalkan ember penuh di kejauhan y/2dan kembali ke oasis. Anda perlu 2 ember untuk melakukan ini, tetapi ini tidak berguna jika Anda hanya memiliki 2 ember karena Anda ingin dapat mengisi 2 ember ketika Anda kembali ke oasis.

Dari oasis, dengan ember di kejauhan y/2, Anda dapat meninggalkan ember penuh di kejauhan ydan kembali ke oasis. Anda perlu 3 ember untuk melakukan ini.

Dari oasis, dengan ember penuh di keduanya ydan y/2, Anda dapat meninggalkan ember penuh di kejauhan 3y/2dan kembali ke oasis. Anda perlu 4 ember untuk melakukan ini. Anda kemudian harus meninggalkan ember penuh pada jarak y/2dan kembali ke oasis.

Akhirnya Anda bisa berakhir dengan ember penuh di (x-1)y/2. (Anda tidak dapat meninggalkan ember penuh xy/2karena Anda tidak akan dapat kembali ke oasis, karena perjalanan pulang-pergi xy, kapasitas total ember.)

Dengan menggunakan sisa ember, Anda dapat meninggalkan ember penuh di (x-3)y/2... yatau y/2. Pada titik ini Anda cukup berjalan sejauh yang Anda bisa, mengambil ember penuh Anda saat Anda pergi. Ketika Anda mencapai (x-1)y/2Anda masih memiliki dua ember penuh yang tersisa, memungkinkan Anda untuk mencapai (x+3)y/2.

Ekstra 1berasal dari kekhasan dalam aturan yang memungkinkan Anda untuk berjalan mil terakhir Anda tanpa air. Meskipun contoh menunjukkan bahwa Anda dapat meninggalkan ember sedikit lebih jauh dari yang dijelaskan di atas, ini sebenarnya tidak membantu Anda berjalan lebih jauh, karena Anda harus meninggalkan lebih sedikit air atau minum air dari ember saat Anda meraihnya sebelum Anda dapat memindahkan di.

Neil
sumber