鍋谷さんの参考問題: へなちょこ解答(Java)

鍋谷さんのオフラインリアルタイムどう書くに参加したいなーと思って、試しに参考問題をJavaで解いてみました。

問題はこちら。http://qiita.com/items/cbc3af152ee3f50a822f

package sample;

import java.util.ArrayList;
import java.util.List;

class Card {
	char suit;
	String rank;

	Card() {
		rank = null;
	}
}

/**
 * 問題: http://qiita.com/items/cbc3af152ee3f50a822f
 */
public class Main {

	protected List<Card> convertToCard(String str) {
		List<Card> list = new ArrayList<>();
		for (int i = 0; i < str.length(); i++) {
			char ch = str.charAt(i);
			if (ch == 'S' || ch == 'H' || ch == 'D' || ch == 'C') {
				Card card = new Card();
				card.suit = ch;
				list.add(card);
			} else {
				Card card2 = list.remove(list.size() - 1);
				if (card2.rank != null) {
					String rank = card2.rank;
					card2.rank = rank.concat(String.valueOf(ch));
				} else {
					card2.rank = String.valueOf(ch);
				}
				list.add(card2);
			}
		}
		return list;
	}

	protected String confirmHand(List<Card> list) {
		String result = null;

		List<String> ranks = new ArrayList<String>();
		List<String> pairs = new ArrayList<>();
		for (Card card : list) {
			for (String r : ranks) {
				if (r.equals(card.rank)) {
					pairs.add(card.rank);
					break;
				}
			}
			ranks.add(card.rank);
		}

		if (pairs == null || pairs.size() == 0) {
			result = "--";
		} else if (pairs.size() == 1) {
			result = "1P"; // one pair
		} else if (pairs.size() == 2) {
			if (pairs.get(0).equals(pairs.get(1))) {
				result = "3K"; // three cards
			} else {
				result = "2P"; // two pair
			}
		} else if (pairs.size() == 3) {
			if (pairs.get(0).equals(pairs.get(1))
					&& pairs.get(0).equals(pairs.get(2))) {
				result = "4K"; // four cards
			} else {
				result = "FH"; // full house
			}
		}
		return result;
	}
}

正直1時間くらいかかった>< おいおい…ばかなの? しぬぞ!!

そして、nidoさんの回答例(Ruby)がわずか3行なのを見て、悶絶しているトコロ。凄いなぁ。

こんなレベルでも参加できるんだろうか? 『プログラマのための論理パズル』とか解いた方がいいかもね。。。

(追記)

(追記: 2012/6/25)

誤字訂正。suite→suit

(e_Mattsanさん、ご指摘ありがとうございます orz)