ベスが砂漠を脱出するのを手伝ってください


11

他の水を運ぶパズルと似ていますが、このチャレンジのユニークな側面はそれを完全に異なっています。

ベス

ベスは砂漠の真ん中のオアシスにあります。湖にはたくさんの水がありますが、残念ながら、バケツはX個しかなく、各バケツにはYリットルの水を入れることができます。

ベスは手に2個のバケツを持ち運ぶことができますが、生き残るためには、1キロ移動した後に正確に1リットル飲む必要があります。彼女はまた、いくつかのバケツを途中で残すことができます(水は蒸発しません)。

チャレンジ

式を計算し、XおよびYの正の整数値に対して機能する最短のソリューションを記述し、ベスがオアシスから移動できる最大距離を計算します。バケット間での水の移動は許可されています。

X = 3、Y = 5

  1. Bethはオアシスから3KM離れたバケツを1つ残して戻ります(オアシスからの最後の飲み物を持ち帰ります)
  2. Bethは3KMのポイントに別の完全なバケットをもたらし、現在12Lを持っています。
  3. ベスは6KMポイントに進み、4Lの水を入れたバケツを離れることができます。
  4. 3KMポイントに戻ります。彼女はオアシスに戻るためにちょうど2Lを持っています。
  5. バケツを満たし、6KMポイントまで移動します。彼女は今8Lの水を持っています。
  6. 15KMポイントまでずっと進みます。

答えは:15

入出力

X / Yをコードで直接定義するか、入力から読み取ることができます。結果は、変数または出力のいずれか短い方に配置できます。


2
これはコードゴルフのはずですか?コードチャレンジとしてタグ付けされています。
デニス

はい、コードゴルフです。タグを追加しました。正しい式を考え出し、コードで表現します。
ロマニンシュ

1
ステップ1で拡大する価値があると思います。ベスがどのように5リットルの水だけで6 kmを移動できるかは、最初は明確ではありませんでした。
xnor

1
プログラムが出力する方法で、テストケースを教えてもらえますか?
パベル

質問を編集して、両方の点に対処しました。
ロマニンシュ

回答:


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つのバケットが必要です。

オアシスからは、両方の完全なバケツでyy/2、あなたは距離でフルバケットを残すことができます3y/2し、オアシスに戻ります。これを行うには4つのバケットが必要です。その後、バケツ一杯を離れy/2てオアシスに戻る必要があります。

最終的に、で完全なバケットになり(x-1)y/2ます。(xy/2往復はxyバケットの合計容量であるため、オアシスに戻ることができないため、バケット全体を残すことはできません。)

残りのバケットを使用すると、(x-3)y/2... yまたはに完全なバケットを残すことができますy/2。この時点で、できる限り歩くだけで、いっぱいになったバケツを手に取ることができます。到達(x-1)y/2すると、まだ2つのバケットが残っているため、に到達できます(x+3)y/2

余分なもの1は、水がなくてもラストマイルを歩くことができるルールの癖に由来しています。この例では、バケットを上記よりも少し離れた場所に置いておくことができることを示していますが、実際には、水を少なくするか、移動する前にバケットから水を飲む必要があるため、これ以上歩くのに役立ちませんオン。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.