Skip to content

エレベーターを制御して提示された制限内に乗客を輸送するプログラミングゲーム「Elevator Saga」での自分なりの解答です。

Notifications You must be signed in to change notification settings

Gakuto1112/MyElevatorSagaSolutions

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MyElevatorSagaSolutions

エレベーターを制御して提示された制限内に乗客を輸送するプログラミングゲーム「Elevator Saga」での自分なりの解答です。

Elevator Saga について

「Elevator Saga」はエレベーターの動作をプログラミングして、指定された時間内に指定された人数をエレベーターで輸送するプログラミングゲームです。ステージ(問題)は全てで18個あり、ステージが進むにつれ、輸送人数が増えたり、エレベーターが複数台になったり、追加の条件が加わったりと厳しくなっていきます。

Elevator Sagaは以下のリンクから遊ぶことができます。

https://play.elevatorsaga.com/

関連リンク

私の解答について

私の解答コードは./src/my_elevator_saga_solution.tsにありますが、拡張子からも分かる通り、TypeScriptで記述されています。しかし、Elevator Sagaが受け付けるコード言語はJavaScriptです。

このレポジトリで私が記述した解答コードはGitHub ActionsによってElevator Sagaで実行できるJavaScriptコードに変換されます。変換されたコードはGitHub Actionsワークフローのアーティファクトとして出力されます。実際に私の解答コードを実行してみたい方はアーティファクトをダウンロードし、コードをElevator Sagaにコピペして実行してください。

私の解答のアルゴリズムについて

配車アルゴリズム

エレベーターの行き先ボタン(上下ボタン)を押した時に複数台あるエレベーターからどのエレベーターをその階に向かわせるかを決めます。これをエレベーターの「配車」と言います。

私の解答では、それぞれのエレベーターが呼ばれた階に到着するまでに要する工程数を計算し、最小の工程で到着できるエレベーターを手配します。

行き先ボタンが押された場合とエレベーター内の階層ボタンが押された場合の配車の仕組みは殆ど同じであり、前者は全てのエレベーターの中で最適なエレベーターを、後者は自分自身を配車します。

工程数の算出

エレベーターの工程数の求め方として、エレベーターが持つ行き先の予約リスト(1階 → 3階 → 5階 → 2階 → ... といった感じのエレベーターが到着する予定の階のリスト)を基に、エレベーターの移動ルートを辿って求めます。

エレベーターが1階通過すると工程数が1加算されます。エレベーターが移動中に目的の階に到着する場合は、そこでエレベーターを停め、工程数の計算はそこまでになります。この時、エレベーターが移動する方向と呼び出された階に停止した後の移動方向が一致するように考慮されます。例えば、エレベーターが降下中で呼び出された階では上昇する向きで呼び出されている場合、目的階を通過しても停止させません。

エレベーターが予約された階に到着すると工程数が5加算されます。これは、エレベーターが停止している時間を考慮しています。この時、停止した階が目的階であればその時点で工程数の計算は終了になります。エレベーターが上端の階に到着し、エレベーターの向きが上昇から降下に変化しようとしている時、もし目的の階が到着した階よりも上にある場合、エレベーターの方向転換を中止し、その階まで再び上昇させます(逆もまた然り)。この場合の工程数の計算はここで終了です。

エレベーターの予約リストを全て消化してもなお目的階に到着できない場合は、予約リストの後に目的階に向かいます。あらゆる場合のエレベーターの工程計算はここまでで終わるはずです。

エレベーターの上下表示

Elevator Sagaでは、エレベーターの上昇/下降表示(上に参ります/下に参ります)は手動で操作する必要があり、これにより乗客がエレベーターに乗り込むか否かが決定されます。例えば、上の階に行きたい乗客は降下表示のエレベーターに乗ろうとはしません。

私の解答では、エレベーターの初期状態は停止状態であり、上昇表示も下降表示も消えています。この場合にエレベーターが呼び出されると現在のエレベーターが停まっている階と目的階の位置関係に応じて上昇/下降表示のどちらかが点灯します。エレベーターが階に停止する度に次のエレベーターの向きを決定し、上昇/下降表示も更新します。もし、エレベーターが次に向かうべき階が存在しない場合はその階で停止状態とし、上昇/下降表示を全て消灯します。

その階の上下ボタンがどちらも押されている階に停止した際は、予約リストの動きを妨げない方向になります。つまり、エレベーターが上昇中で次の階も上にある場合は上向きになります(逆もまた然り)。一方で、予約リストがない場合は直前の動きと同じ方向が優先されます。つまり、その階に上昇して到着した場合は上向きになります(逆もまた然り)。

About

エレベーターを制御して提示された制限内に乗客を輸送するプログラミングゲーム「Elevator Saga」での自分なりの解答です。

Topics

Resources

Stars

Watchers

Forks