Create a gist now

Instantly share code, notes, and snippets.

@JunichiIto /ticket-train.md Secret
Last active Jan 2, 2017

チケット・改札機問題

チケット・改札機問題

問題

以下のシナリオに登場するチケットや改札機をRubyプログラムとして表現してください。

プログラムの要件

  • テストコード付きで書いてください。テスティングフレームワークは問いません。
  • シナリオに登場するテストパターンは最低限網羅してください。それよりも詳細なテストを書いても構いません。
  • UI(WebやCUI)の作成は不要です。(テストコード上でのみ動作すればOK)
  • リファクタリングは随時実施してもらって構いません。

プログラミングスキルに合わせたヒント

  • レベルA: コード本体もテストコードもすべて回答者自身で考えて書く。
  • レベルB: コード本体のAPIのみ、出題者から提示する。回答者はそれを参考にしながらコード本体やテストコードを書く。
  • レベルC: コード本体のスケルトン(メソッドの定義だけがあって中身が空のもの)と、一通りのテストシナリオを網羅したテストコード(RSpec)を提供する。回答者はテストコードがすべてパスするようにコード本体を実装する。

運賃表

乗車駅・降車駅と運賃の関係は以下のとおり。

梅田
150 十三
180 150 庄内
220 180 150 岡町

実装上の制限事項

  • 購入できる切符は150円、180円、220円の3種類のみとする。それ以外の切符は考慮しない。
  • 乗車・降車する駅は梅田、十三、庄内、岡町の4つのみとする。それ以外の駅は考慮しない。

テストシナリオ

シナリオ1(1区間)

  • 150円の切符を購入する。
  • 梅田で入場し、十三で出場する。
  • 期待する結果: 出場できる。

シナリオ2(2区間・運賃不足)

  • 150円の切符を購入する。
  • 梅田で入場し、庄内で出場する。
  • 期待する結果: 出場できない。

シナリオ3(2区間・運賃ちょうど)

  • 180円の切符を購入する。
  • 梅田で入場し、庄内で出場する。
  • 期待する結果: 出場できる。

シナリオ4(2区間・運賃過多)

  • 220円の切符を購入する。
  • 梅田で入場し、庄内で出場する。
  • 期待する結果: 出場できる。

シナリオ5(3区間・運賃不足)

  • 180円の切符を購入する。
  • 梅田で入場し、岡町で出場する。
  • 期待する結果: 出場できない。

シナリオ6(3区間・運賃ちょうど)

  • 220円の切符を購入する。
  • 梅田で入場し、岡町で出場する。
  • 期待する結果: 出場できる。

シナリオ7(梅田以外の駅から乗車する・運賃不足)

  • 150円の切符を購入する。
  • 十三で入場し、岡町で出場する。
  • 期待する結果: 出場できない。

シナリオ8(梅田以外の駅から乗車する・運賃ちょうど)

  • 180円の切符を購入する。
  • 十三で入場し、岡町で出場する。
  • 期待する結果: 出場できる。

シナリオ9(岡町方面から梅田方面へ向かう)

  • 梅田方面から岡町方面(下り)だけでなく、岡町方面から梅田方面(上り)に対して上記のようなシナリオが有効であることを確認する。

シナリオ10(同じ駅で降りる)

  • 150円の切符を購入する。
  • 梅田で入場し、梅田で出場する。
  • 期待する結果: 出場できない。(出場できない理由がわかるようにすること)

シナリオ11(一度入場した切符でもう一度入場する)

  • 150円の切符を購入する。
  • 梅田で入場する。
  • さらに同じ切符で梅田から再入場する。
  • 期待する結果: 入場できない。(入場できない理由がわかるようにすること)

シナリオ12(使用済みの切符でもう一度出場する)

  • 150円の切符を購入する。
  • 梅田で入場し、十三で出場する。
  • さらに同じ切符で十三で再出場する。
  • 期待する結果: 出場できない。(出場できない理由がわかるようにすること)

シナリオ13(改札を通っていない切符で出場する)

  • 150円の切符を購入する。
  • 入場時に改札機を通さないまま梅田で出場する。
  • 期待する結果: 出場できない。(出場できない理由がわかるようにすること)

シナリオ14(自分で新しい仕様を考える)

  • 実際の改札機を想像しながら、プログラムに新しい機能を追加する。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment