大きさの異なる2つのバケットと、どちらを先に満たすかが与えられたとき、バケット間で戦略的に液体を移し替えて、正確なリットル数を量るには何回の操作が必要かを求めます。
解答が従わなければならないルールがいくつかあります。
プログラムは次のものを入力として受け取ります。
プログラムは次のことを求める必要があります。
注意: どちらか一方、または両方のバケットに変化が生じるたびに、1回の操作として数えます。
例: バケット1には最大7リットル、バケット2には最大11リットル入ります。 ある時点で、バケット1に7リットル、バケット2に8リットル入っているとします(7,8)。 バケット1を空にし、バケット2には何もせず、それぞれ0リットルと8リットル(0,8)になったとすると、これは1回の操作として数えます。 逆に、バケット2がいっぱいになるまでバケット1からバケット2へ注ぎ、その結果バケット1に4リットル、バケット2に11リットル(4,11)になったとしても、これも1回の操作としてしか数えません。
もう1つの例: バケット1には3リットル、バケット2には最大5リットル入ります。 ここでは、バケット1から始めなければならないとします。 すると、最初の操作はバケット1を満たすことになります。 2回目の操作として、バケット1を空にすることにします。 3回目の操作でバケット2を満たすことはできません。これは3つ目のルールに反するからです。どのような操作の後でも、開始バケットが空でもう一方のバケットがいっぱいである状態になってはいけません。
Fullstack AcademyのLindsay Levineが<3を込めて書きました。
twobucketパッケージで、次のシグネチャを持つGoの関数Solveを実装してください。
func Solve(sizeBucketOne,
sizeBucketTwo, goalAmount int, startBucket string,
) (goalBucket string, numSteps, otherBucketLevel int, e error)
Solveは4つの値を返します。ゴールとなるバケット("one"またはtwo")、ゴールの量に達するまでの移動回数(ステップ数)、もう一方のバケットに残っているリットル数、そしてエラー値です。
パラメータが無効な場合、または解が存在しない場合は、エラーを返します。