「第12回 オフラインリアルタイムどう書く」へなちょこ解答(Java)
- オフラインリアルタイムどう書くとは
- 鍋谷さんが出してくださるお題を、参加者が好きなプログラミング言語で解いて楽しむ会です。
梅雨が明けたと思ったら真夏日ですね。今日はどう書くでした。
- 問題: サイコロを転がす http://nabetani.sakura.ne.jp/hena/ord12rotdice/
今回は、サイコロです!
鍋谷さんから参加者全員にサイコロのプレゼントがありまして、転がしながら解きました。
問題は易しめだったそうで、自分も40〜45分くらいで無事にテストが通りました。やりましたね。
自分の解答(Java)
文字列を+=で連結していましたが、発表時にツッ込まれてStringBuilderに直しました。
import java.util.ArrayList; import java.util.List; enum Direction { E { @Override Dice go(Dice d) { return d.goEast(); } }, W { @Override Dice go(Dice d) { return d.goWest(); } }, S { @Override Dice go(Dice d) { return d.goSouth(); } }, N { @Override Dice go(Dice d) { return d.goNorth(); } }; abstract Dice go(Dice d); } class Dice { int top; int west; int south; public Dice(int t, int w, int s) { top = t; west = w; south = s; } public Dice goEast() { return new Dice(west, 7 - top, south); } public Dice goWest() { return new Dice(7 - west, top, south); } public Dice goSouth() { return new Dice(7 - south, west, top); } public Dice goNorth() { return new Dice(south, west, 7 - top); } @Override public String toString() { return String.valueOf(top); } } public class Rotdice { public String solve(String input) { List<Direction> directions = parse(input); Dice dice = new Dice(1, 3, 5); StringBuilder sb = new StringBuilder(dice.toString()); for (Direction each : directions) { dice = each.go(dice); sb.append(dice.toString()); } return new String(sb); } List<Direction> parse(String input) { List<Direction> result = new ArrayList<>(); for (char each : input.toCharArray()) { result.add(Direction.valueOf(String.valueOf(each))); } return result; } }
- 上のコードと、テストコード https://gist.github.com/torazuka/5939368
メモ
最初はサイコロの向きと転がす方角のすべてのパターンを書き出そうとしたのですが、6×4で済まないことに気づいて絶望したので、方針を変えました。結果として、大量のデータ定義を避けられたので、よかったと思います。
また、Gistに貼ってあるとおり、テストデータのチェックをassertではなくprintlnにしました。これは新しい改善です(改善? と意外に思われるかもしれませんが)。どう書くの時には、1つでもテストがコケたらテスト実行を止めるのではなく、とりあえず全部実行して、通ったケースと通らなかったケースを見たいわけです。だから、assertするよりprintで出してしまった方がいいですよ、と前回鍋谷さんに言われたので、やってみました。一度ですべてのテストが通らない時、どんなテストデータでコケているかを見ることができるので、これは便利ですね。
そんな感じでした。今回もありがとうございました!