Beth'in çölden kaçmasına yardım et


11

Diğer su taşıyan bulmacanınkine benzer olsa da , bu zorluğun benzersiz yönleri onu tamamen farklı kılar.

Beth

Beth bir çölün ortasındaki bir vahada bulunur. Gölde bol su var, ancak maalesef her biri Y litre su kapasitesine sahip sadece X kovaları var.

Beth elinde 2 kova taşıyabilir, ancak hayatta kalmak için seyahat ettiği her kilometreden sonra tam olarak 1 litre içmelidir. Ayrıca bazı kovaları yarıya kadar bırakabilir (su buharlaşmaz).

Meydan okuma

Formülü anlayın ve X ve Y'nin pozitif tamsayı değerleri için çalışacak ve Beth'in vahadan gidebileceği maksimum mesafeyi hesaplayacak en kısa çözümü yazın . Kovalar arasında suyun taşınmasına izin verilir.

Misal

X = 3, Y = 5

  1. Beth 3 dolu tam kovadan vahadan ayrılır, geri döner (vahadan son içeceği)
  2. Beth, şimdi 12L'ye sahip olan 3KM noktasına başka bir dolu kova getiriyor.
  3. Beth 6KM noktasına ilerleyebilir ve içinde 4L su bulunan kova bırakabilir.
  4. 3 KM noktasına geri dön. Şimdi vaha geri almak için tam 2L var.
  5. Kovaları doldurun ve 6KM noktasına gidin. Şimdi 8L suyu var.
  6. 15KM noktasına kadar devam edin.

Yanıt: 15

Giriş çıkış

X / Y'yi doğrudan kodda tanımlayabilir veya girişten okuyabilirsiniz. Sonuç, hangisi en kısasa, değişkene veya çıktıya yerleştirilebilir.


2
Bu kod golf mü olmalı? Kod sorgusu olarak etiketlenir.
Dennis

Evet, kod-golf, etiketi ekledim. Doğru bir formülle gelin ve kodu kullanarak ifade edin.
romaninsh

1
Bence adım 1'de genişlemeye değer. İlk başta Beth'in sadece 5 litre suyla nasıl 6km seyahat edebileceği belli değildi: sadece seyahat ettiği her kilometreden sonra içiyor ve sonuncusunda vahada.
xnor

1
Bir programın çıktısını alma biçiminde bir test durumu verebilir misiniz?
Pavel

Her iki noktayı da ele almak için soruyu düzenledi.
romaninsh

Yanıtlar:


2

JavaScript (ES6), 25 bayt

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

Bütün bunlar aynı değeri hesaplar; Daha kısa bir formülasyon bulamıyorum.

Ne zaman xdaha az 3, olabildiğince çok su alırsınız ve olabildiğince yürüyebilirsiniz, ki bu basitçe x*y+1.

xEn az 3 olduğunda , önbellek oluşturmaya başlamanız gerekir.

Vahadan, tam bir kovayı uzaktan bırakabilir y/2ve vahaya geri dönebilirsiniz. Bunu yapmak için 2 kovaya ihtiyacınız var, ancak vahaya döndüğünüzde 2 kova doldurmak istediğiniz için sadece 2 kova varsa bu kullanışlı değildir.

Vahadan, uzaktaki bir kova ile, mesafeden y/2dolu bir kova bırakıp yvaha dönebilirsiniz. Bunu yapmak için 3 kovaya ihtiyacınız var.

Hem de tam kovalarla vaha, Dan yve y/2, sen bir mesafede tam kova bırakabilir 3y/2vaha ve karşılığında. Bunu yapmak için 4 kovaya ihtiyacınız var. Daha sonra tam bir kovayı uzakta bırakıp y/2vaha geri dönmelisiniz.

Sonunda adresinde tam bir kova ile sonuçlanabilir (x-1)y/2. (Dolu bir kovayı bırakamazsınız, xy/2çünkü gidiş dönüş, xykovaların toplam kapasitesi olduğu için vaha geri dönemezsiniz.)

Kalan kovalarınızı kullanarak tam kovaları (x-3)y/2... yveya konumunda bırakabilirsiniz y/2. Bu noktada, gittiğiniz kadar dolu kovaları toplayarak olabildiğince yürüyebilirsiniz. Eğer ulaştığınızda (x-1)y/2hala iki dolu kova kaldı, ulaşmak için izin (x+3)y/2.

Ekstra 1, herhangi bir su olmadan son milinizi yürümenizi sağlayan kurallardaki tuhaflıktan gelir. Örnek, kovaları yukarıda tarif edilenden biraz daha uzakta bırakabileceğinizi gösterse de, aslında daha fazla yürümenize yardımcı olmaz, çünkü hareket etmeden önce daha az su bırakmanız veya kovadan ulaştığınız anda suyu içmeniz gerekir. üzerinde.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.