給你兩個大小不同的水桶,並指定要先裝滿哪一個水桶,請判斷在兩個水桶之間策略性地倒水,需要多少個動作才能量出剛好幾公升。
你的解法必須遵守以下規則:
你的程式會接收以下輸入:
你的程式應該判斷出:
注意:只要其中一個水桶或兩個水桶的狀態有改變,就算一個(1)動作。
範例: 第一個水桶最多可以裝 7 公升,第二個水桶最多可以裝 11 公升。 假設在某個步驟,第一個水桶裝了 7 公升,第二個水桶裝了 8 公升(7,8)。 如果你倒空第一個水桶,第二個水桶維持不變,兩個水桶分別剩下 0 公升和 8 公升(0,8),這算一個動作。 反過來說,如果你把第一個水桶倒進第二個水桶,直到第二個水桶滿了,結果第一個水桶剩下 4 公升、第二個水桶有 11 公升(4,11),這也同樣只算一個動作。
另一個範例: 第一個水桶可以裝 3 公升,第二個水桶最多可以裝 5 公升。 題目要求你必須從第一個水桶開始。 所以你的第一個動作是裝滿第一個水桶。 你選擇在第二個動作倒空第一個水桶。 到了第三個動作,你不能裝滿第二個水桶,因為這違反了第三條規則:任何動作之後,都不能出現起始水桶是空的、而另一個水桶是滿的狀態。
由 Lindsay Levine 在 Fullstack Academy 用 <3 寫成。
有時你會需要拋出例外。這麼做時,你應該一律附上有意義的錯誤訊息,指出錯誤的來源是什麼。這能讓你的程式碼更好讀,對除錯也大有幫助。如果你已經知道錯誤來源會是某一種類型,可以選擇拋出內建的錯誤型別,但仍然要附上有意義的訊息。
這個練習特別要求你使用raise敘述來「拋出」ValueError。只有同時raise這個exception並附上訊息,測試才會通過。
要拋出帶有訊息的ValueError,請把訊息寫成exception型別的引數:
raise ValueError("A meaningful error message here.")