fukuriko

日記とか

「あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定」にチャレンジ

2010-05-01 20:36:54 |  日記
makeplex salon:あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定 (2/2) - ITmedia エンタープライズ via kwout

GW突入!

で、やっと時間ができたので、

「あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定」

の問題をやってみました。言語は Java で3時間くらいかかった、あんまスマートじゃない気が。。。
ロジックは、とりあえず、順子・刻子の組み合わせを全て抽出したら、
頭を見つけて、残った牌が「待ち」というアプローチで探索してみました。

。。。ぁ、七対子は対応してませんw

記事には40分くらいで解いた人もいるとか...凄すぎる


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;

public class WorkOut {

	List<Integer> list = new ArrayList<Integer>();
	boolean[] isUsed;
	
	Stack<Integer> number = new Stack<Integer>();
	List<List<Integer>> patterns = new ArrayList<List<Integer>>();
	Stack<List<Integer>> stack = new Stack<List<Integer>>();
	List<String> resultList = new ArrayList<String>();

	public static void main(String[] args) {
		new WorkOut().start("1112224588899");
		new WorkOut().start("1122335556799");
		new WorkOut().start("1112223335559");
		new WorkOut().start("1223344888999");
		new WorkOut().start("1112345678999");
	}

	void start(String s) {
		
		System.out.println(s);

		init(s);

		checkPear(0);
		
		checkCombine(0);
		
		for (String result : resultList) {
			System.out.println(result);
		}
		
		System.out.println();
	}

	void init(String s) {
		for (Character c : s.toCharArray()) {
			if (Character.isDigit(c)) {
				list.add(Integer.parseInt(String.valueOf(c)));
			}
		}
		Collections.sort(list);
		isUsed = new boolean[list.size()];
	}
	
	String getResult() {
		
		StringBuilder sb = new StringBuilder();
		
		for (int i = 0 ; i < stack.size() ; i++) {
			
			if (i < stack.size() - 1) {
				sb.append("(");
			} else {
				sb.append("[");
			}

			for (int j : stack.get(i)) {
				sb.append(list.get(j));
			}

			if (i < stack.size() - 1) {
				sb.append(")");
			} else {
				sb.append("]");
			}

		}
		
		return sb.toString();
	}
	
	boolean checkAblableSpace(List<Integer> list) {
		for (int i : list) {
			if (isUsed[i]) {
				return false;
			}
		}
		for (int i : list) {
			isUsed[i] = true;
		}
		return true;
	}

	void removeAblableSpace(List<Integer> list) {
		for (int i : list) {
			isUsed[i] = false;
		}
	}
	
	void checkMati() {
		
		List<Integer> mList = new ArrayList<Integer>();
		
		for (int i = 0 ; i < isUsed.length ; i++) {
			if (!isUsed[i]) {
				mList.add(i);
			}
		}
		
		String result = null;
		stack.push(mList);

		if (mList.size () == 1) {
			result = getResult();
		} else if (mList.size() > 1) {
			if (list.get(mList.get(0)) == list.get(mList.get(1))) {
				result = getResult();
			}
			
			if (list.get(mList.get(0)) + 1 == list.get(mList.get(1))) {
				result = getResult();
			}

			if (list.get(mList.get(0)) + 2 == list.get(mList.get(1))) {
				result = getResult();
			}
		}

		stack.pop();

		if (result != null) {
			if (!resultList.contains(result)) {
				resultList.add(result);
			}
		}

		for (int i : mList) {
			isUsed[i] = false;
		}
		
	}
	
	void checkAtama(int pos) {
		
		if (number.size() > 1) {
			
			if (list.get(number.get(0)) == list.get(number.get(1))) {
				stack.push(number);
				checkMati();
				stack.pop();
			}
			
			return;
		}
		
		for (int i = pos ; i < isUsed.length ; i++) {
			if (!isUsed[i]) {
				isUsed[i] = true;
				number.push(i);
				checkAtama(i + 1);
				number.pop();
				isUsed[i] = false;
			}
		}
		
	}
	
	void checkCombine(int pos) {
		
		if (stack.size() == 3) {
			checkAtama(0);
		} else if (stack.size() == 4) {
			checkMati();
		}

		if (pos == patterns.size()) {
			return ;
		}

		for (int i = pos ; i < patterns.size() ; i++) {
			
			if (checkAblableSpace(patterns.get(i))) {
				stack.push(patterns.get(i));
				checkCombine(i+1);
				removeAblableSpace(patterns.get(i));
				stack.pop();
			}
		}

	}

	void checkPear(int pos) {

		if (number.size() == 3) {
			if (isKotsu() || isJuntsu()) {
				patterns.add(new ArrayList<Integer>(number));
			}
		}

		for (int i = pos; i < isUsed.length; i++) {
			if (!isUsed[i]) {
				isUsed[i] = true;
				number.push(i);
				checkPear(i + 1);
				number.pop();
				isUsed[i] = false;
			}
		}
	}

	boolean isKotsu() {

		int[] num = new int[] { list.get(number.get(0)),
				list.get(number.get(1)), list.get(number.get(2)) };

		if (num[0] + 1 == num[1] && num[1] + 1 == num[2]) {
			return true;
		}

		return false;
	}

	boolean isJuntsu() {

		int[] num = new int[] { list.get(number.get(0)),
				list.get(number.get(1)), list.get(number.get(2)) };

		if (num[0] == num[1] && num[1] == num[2]) {
			return true;
		}

		return false;
	}

}




出力結果:
1112224588899
(111)(222)(888)(99)[45]

1122335556799
(123)(123)(555)(99)[67]
(123)(123)(567)(55)[99]
(123)(123)(567)(99)[55]

1112223335559
(111)(222)(333)(555)[9]
(123)(123)(123)(555)[9]

1223344888999
(123)(234)(888)(999)[4]
(123)(888)(999)(44)[23]
(234)(234)(888)(999)[1]

1112345678999
(111)(234)(567)(99)[89]
(111)(234)(567)(999)[8]
(111)(234)(678)(999)[5]
(111)(234)(789)(99)[56]
(111)(345)(678)(999)[2]
(111)(456)(789)(99)[23]
(123)(456)(789)(11)[99]
(123)(456)(789)(99)[11]
(123)(456)(999)(11)[78]
(123)(678)(999)(11)[45]
(345)(678)(999)(11)[12]





三連休

2010-03-23 00:46:55 |  日記
久しぶりに簿記の勉強をしてみた。

うーむかなり忘れている。。。

仕訳の勘定科目とかすっかりね

しばらく、復習に時間を割くしかないようだ

まぁ、試験は自分で納得した時点で申し込めばいいかなぁ

エビ餅カレーうどん

2010-03-17 12:35:36 |  日記
久しぶりに昼飯を外で食べましたぁ☆

最近、手弁当なので久々です(^w^)

職場近くのうどんやさんで「エビ餅カレーうどん」
おいしかったo(^-^)o
満腹で午後はウトウト、暖かくなりましたね♪

読書灯

2010-03-15 12:35:05 |  日記
ホワイトデーのプレゼントを買った時に一緒に購入しましたぁ☆

コンパクトかつ軽量でクリップで本にとめられるので就寝時の読書に最適です(^w^)

最近のLEDはけっこう明るいねw

2009年振り返り

2009-12-31 15:42:13 |  日記
久しぶりの日記だぁ

2009年最後の日なのでちょっとふりかえりを、、、

1~3月 客先にて教育案件&自社で開発のお手伝い
 最近の若い人は無責任だなぁと実感。周りの人達も甘やかしすぎじゃないかな?今後の研修はきびしめに行こうと決意。

4~6月 自社にて新人研修のお手伝い
 弊社の新人研修はおそらく他社の1.5倍くらい厳しいんじゃないかな?社内でも賛否両論ではないかと、、、シフト勤務で新人さんのフォローに励む日々(°□°;)ちょっと疲れたかな?

7~12月 客先にて教育案件
 まったく有給とれないまま本年のメインイベントに突入!来年度の教育資料作りがメインでしたぁ。まったく知らなかったドットネット環境も触れたし、無料でmsの人からクラウドの話も聞けました。数年後、国内のデータセンターってどうなっちゃうんでしょうね?半分くらいになりそうな予感はしてます。
 プロジェクト自体は六人体制でなんとか平和に過ごせてますかねぇ。
 あと、Mashup Award 5 にも個人で参加してみました。受賞はなかったけどイロイロと勉強になりました。GAE/J にも初挑戦できたってことで。来年は携帯コンテンツとかやってみたいなぁ


100時間!

2009-08-21 00:02:43 |  日記


「100時間かけたカレー」を頂いちゃいました!

先日、テレビで紹介されてて気になっていたので、嬉しい限りですw

食べるのたのしみ!


久しぶりの日記

2009-07-13 01:20:25 |  日記
4月~6月末まで、自社の新人研修をやってましたw

そんなわけで、ぜんぜん日記かけませんでした

で、今月からお客さん先で新人研修のお手伝い

年中研修か!?

いろいろと発見もある反面で浦島太郎状態になりそうですw

で、いろいろ話題の「Android携帯」がとうとう発売っと

http://www.rbbtoday.com/news/20090701/60964.html

自分のケータイは au なんで、しばらく関係ないかぁ


とりあえず「ぐぐれ!」

2009-06-07 00:57:27 |  日記


...ブラウザ起動したら、いきなりこんなのが出てきたので

記念に画面キャプチャしてみた。

Googleの急上昇ワードに「わかめ酒」

「とりあえずぐぐろう!」っていうのもどうなんだろうか?

って本気で考えちゃいますw

で、「わかめ酒」って何かって言うと・・・




































(自己責任で)ぐぐってみてください