「第12回 オフラインリアルタイムどう書く」へなちょこ解答(Java)

オフラインリアルタイムどう書くとは
鍋谷さんが出してくださるお題を、参加者が好きなプログラミング言語で解いて楽しむ会です。

梅雨が明けたと思ったら真夏日ですね。今日はどう書くでした。

今回は、サイコロです!

鍋谷さんから参加者全員にサイコロのプレゼントがありまして、転がしながら解きました。

問題は易しめだったそうで、自分も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;
	}
}

メモ

最初はサイコロの向きと転がす方角のすべてのパターンを書き出そうとしたのですが、6×4で済まないことに気づいて絶望したので、方針を変えました。結果として、大量のデータ定義を避けられたので、よかったと思います。

また、Gistに貼ってあるとおり、テストデータのチェックをassertではなくprintlnにしました。これは新しい改善です(改善? と意外に思われるかもしれませんが)。どう書くの時には、1つでもテストがコケたらテスト実行を止めるのではなく、とりあえず全部実行して、通ったケースと通らなかったケースを見たいわけです。だから、assertするよりprintで出してしまった方がいいですよ、と前回鍋谷さんに言われたので、やってみました。一度ですべてのテストが通らない時、どんなテストデータでコケているかを見ることができるので、これは便利ですね。

そんな感じでした。今回もありがとうございました!