株式会社Moiの2019年度新卒採用用課題 のためのサーバ。
Websocket を介して FizzBuzzMoi の問題に答える。
$ dep ensure
$ go run main.go
ws://localhost:12345/websocket/:YourID
{
"signal": "start"
}
開始メッセージ送信後に次のような出題メッセージがサーバーから送信される。
{
"number": 15,
"previous": null
}
ここで受け取った number
に対して、次の表に従った回答メッセージを作成し送信する。
number | answer | example |
---|---|---|
3で割り切れる | Fizz | number が6のとき、answer は Fizz |
5で割り切れる | Buzz | number が10のとき、answer は Buzz |
7で割り切れる | Moi | number が14のとき、answer は Moi |
上記のうち複数にあてはまる | answer は、Fizz, Buzz, Moi の順で、あてはまる文字列を結合する |
number が35のとき、5で割り切れるかつ7で割り切れるので、answer は BuzzMoi |
いずれにもあてはまらない | number の値をそのまま格納する |
number が1のとき、answer は1 |
たとえば number
が21のとき、3で割り切れるかつ7で割り切れるので、回答メッセージは Fizz と Buzz を結合して次のようになる。
{
"answer": "FizzMoi"
}
また、たとえば number
が2のとき、上記のいずれにおあてはまらないので、回答メッセージは次のようになる。
{
"answer": "2"
}
回答メッセージを送信するたびにサーバーから出題メッセージが送信されるので、2. の通り繰り返し回答メッセージを送信する。
ただし、回答メッセージに answer
フィールドが含まれていない場合、その場でサーバーから終了メッセージ(後述)が送信されチャレンジは強制終了される。
また、出題メッセージの previous
フィールドは、直前の回答メッセージが正解だったかどうかを "success"
or "failure"
(初回は null
)で表している。
制限時間が経過すると、その後に一番最初にサーバーから送信されるメッセージは回答メッセージの代わりに次のような終了メッセージとなる。
{
"signal": "end",
"result": "success",
"score": 10,
"message": "Challenge is successful! Your record is 10 / 10 👏"
}
また、サーバーから終了メッセージが送信されると同時にコネクションは close されチャレンジは終了する。制限時間以内に既定の回数以上正解すると、result
フィールドは success となる。