駐車場
CoddyのKotlinジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 55/57。
チャレンジ
難しい駐車場を作成してください。
- 列挙型
Sizeには、順番にSMALL、MEDIUM、LARGEがあり、それぞれ小文字のlabelを持ちます。 Vehicle(plate)は、sizeとhourlyRateという抽象プロパティを持つ sealed クラスです。Motorbikeは小型(1時間あたり1)、Carは中型(3)、Vanは大型(5)です。Garage(small, medium, large)は、サイズごとの駐車スペース数を指定して作成されます。park(vehicle)は、車両を自身のサイズの空きスペースに駐車します。空きがない場合は、空きがある次に大きいサイズのスペースに駐車し、parked AB12 in medium、full for AB12、またはAB12 is already parkedを返します。leave(plate, hours)はスペースを空け、AB12 paid 9(料金に時間数を掛けたもの。ただし最低1時間)またはno vehicle AB12を返します。status()はfree: small 1, medium 0, large 2を返します。
提供されているコードは、駐車スペース数を small,medium,large として読み込み、その後に park car AB12(bike、car、または van)、leave AB12 3、または status のコマンドを読み込み、それぞれの応答を出力します。
コードは Size.kt、Vehicle.kt、Motorbike.kt、Car.kt、Van.kt、および Garage.kt に記述します。Main.kt には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
fun main() {
// 提供された入出力コード: そのままにしておく
val input = generateSequence(::readLine).toList()
val (small, medium, large) = input[0].split(",").map { it.toInt() }
val garage = Garage(small, medium, large)
for (cmd in input.drop(1)) {
val p = cmd.split(" ")
when (p[0]) {
"park" -> {
val vehicle = when (p[1]) {
"bike" -> Motorbike(p[2])
"van" -> Van(p[2])
else -> Car(p[2])
}
println(garage.park(vehicle))
}
"leave" -> println(garage.leave(p[1], p[2].toInt()))
else -> println(garage.status())
}
}
}
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Kotlinプレイグラウンド