Допоможіть Бет уникнути пустелі


11

Незважаючи на інші головоносні головоломки , унікальні аспекти цього завдання роблять його зовсім іншим.

Бет

Бет розташована в оазисі посеред пустелі. Води в озері багато, але, на жаль, є лише X відра, кожне з яких має ємність Y літрів води.

Бет може нести в руках 2 відра, але щоб вижити, вона повинна випивати рівно 1 літр після кожного пройденого кілометра. Вона також може залишити кілька відер наполовину (вода не випаровується).

Змагання

Сформулюйте формулу і напишіть найкоротший розв'язок, який буде працювати для цілих значень натуральних чисел X і Y, і обчисліть максимальну відстань, яку може пройти Бет від оазису. Переміщення води між відрами дозволено.

Приклад

X = 3, Y = 5

  1. Бет залишає 1 повне відро в 3 км від оазису, повертається назад (випиваючи останній випиток з оазису)
  2. Бет приносить ще одне повне відро в точці 3 км, зараз там є 12 л.
  3. Бет може просунутися до точки 6 км і залишити відро з 4 л води в ньому.
  4. Поверніться до точки 3 км. Зараз у неї є рівно 2 л, щоб повернутися до оазису.
  5. Заповніть відра і вирушайте до точки 6 км. Зараз у неї є 8 л води.
  6. Продовжуйте весь шлях до точки 15 км.

Відповідь: 15

Введення-виведення

Ви можете визначити X / Y безпосередньо в коді або прочитати з введення. Результат може бути розміщений у змінному або вихідному, залежно від того, що є найкоротшим.


2
Це повинен бути кодовий гольф? Це позначено як виклик коду.
Денніс

Так, це код-гольф, я додав тег. Придумайте правильну формулу і висловіть її через код.
romaninsh

1
Я думаю, що варто розширитись на кроці 1. Спочатку мені не було зрозуміло, як Бет може проїхати 6 км лише з 5 літрами води: вона п’є лише після кожного проїзду км, а на останньому - у оазисі.
xnor

1
Чи можете ви надати тестовий випадок таким чином, щоб програма виводила його?
Павло

Відредагував питання, щоб вирішити обидва пункти.
romaninsh

Відповіді:


2

JavaScript (ES6), 25 байт

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

Всі ці обчислюють однакове значення; Я не можу, здається, придумати більш коротку формулювання.

Коли xменше 3, ви берете стільки води, скільки можете, і ходите, наскільки це можливо, що просто x*y+1.

Коли xпринаймні 3, ви повинні почати створювати кеші.

Від оазису можна залишити повне відро на відстані y/2і повернутися до оазису. Для цього вам потрібно 2 відра, але це не корисно, якщо у вас є лише 2 відра, оскільки ви хочете мати можливість заповнити 2 відра, коли повернетесь в оазис.

З оазису, з відром на відстані y/2, можна залишити повне відро на відстані yі повернутися в оазис. Для цього вам потрібно 3 відра.

З оазису, з повними відрами і в обох, yі y/2ви можете залишити повне відро на відстані 3y/2і повернутися в оазис. Для цього вам потрібно 4 відра. Тоді вам доведеться залишити повне відро на відстані y/2і повернутися в оазис.

Зрештою, ви можете закінчити повне відро на (x-1)y/2. (Ви не можете залишити повне відро у, xy/2тому що не змогли б повернутися в оазис, як в турецьку поїздку xy, загальна місткість відра.)

Використовуючи залишилися відра, ви можете залишити повні відра на (x-3)y/2... yабо y/2. У цей момент ви просто йдете, наскільки можете, збираючи повні відра, як ви йдете. Коли ви дістанетесь, у (x-1)y/2вас залишилося два повних відра, що дозволяє вам дістатися (x+3)y/2.

Додатковий 1прихід випливає з химерності в правилах, що дозволяють вам пройти останню милю, не маючи води. Хоча приклад показує, що ви можете залишити відра трохи далі, ніж описано вище, це насправді не допомагає вам далі ходити, оскільки вам доведеться залишити менше води або пити воду з відра, коли ви дістанетесь до неї, перш ніж ви зможете рухатися на.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.