あなたのスキルでは飯は食えないだろう

makeplex salon:あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定 (1/2) - ITmedia エンタープライズ

↑やってみた。

1時間かかったか掛からなかったくらい。しかし気でも狂ったんじゃないかというレベルの悲惨なソース。久々に載せて恥ずかしいソースだと思った。

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <sstream>
using namespace std;
typedef pair<vector<string>,string>  ans_t;

int limit[10];
vector<string> now;
set<ans_t> ans;
vector<string> able;
vector<string> ableHead;


vector<int> allCount(vector<string>tmp){
	vector<int> ret(10,0);
	
	for(int si=0;si<tmp.size();si++){	
		for(int i=0;i<tmp[si].length();i++){
			ret[tmp[si][i]-'0']++;
		}
	}
	return ret;
}

bool malCheck(vector<string> tmp){
	vector<int> t = allCount(tmp);
	for(int i=0;i<10;i++){
		if(t[i]>limit[i])return true;
	}
	return false;
}

bool wantCheck(string s){
	if(s[1]==s[0]+1|| s[0] == s[1])return false;
	return true;
}
void bt1(){
	/* 規定オーバーしたら抜け出し */
	if(malCheck(now))return;
	
	/* 4コ 面子がそろったなら */
	if(now.size() == 4){
		vector<int> t = allCount(now);
		
		for(int i=0;i<10;i++){
			if(limit[i]-t[i]){
				string sst="";sst+='0'+i;
				sort(now.begin(),now.end());
				ans.insert(make_pair(now,sst));
			}
		}
		return;
	}
	
	for(int i=0;i<able.size();i++){
		vector<string> t = now;
		now.push_back(able[i]);
		bt1();
		now = t;
	}
}

void bt2(){
	/* 規定オーバーしたら抜け出し */
	if(malCheck(now))return;
	
	/* 4コ 面子がそろったなら */
	if(now.size() == 4){
		vector<int> t = allCount(now);
		string sst="";
		
		for(int i=0;i<10;i++){
			if(limit[i]-t[i]){
				sst+='0'+i;
			}
		}
		if(sst.size()==1)sst+=sst;
		if(wantCheck(sst))return;
		sort(now.begin(),now.end());
		ans.insert(make_pair(now,sst));
		return;
	}
	
	for(int i=0;i<able.size();i++){
		vector<string> t = now;
		now.push_back(able[i]);
		bt2();
		now = t;
	}
}

int main(){
	string s,chk;
	cin >> s;
	sort(s.begin(),s.end());
	chk = s;
	chk.erase(unique(chk.begin(),chk.end()),chk.end());
	
	/*個数数え*/
	for(int i=0;i<s.length();i++)limit[s[i]-'0']++;
	
	/* 刻子 と 頭 */
	for(int i=0;i<chk.length();i++){
	
		/* 刻子 */
		if(count(s.begin(),s.end(),chk[i]) >= 3){
			string t="";
			t+=chk[i];t+=chk[i];t+=chk[i];
			able.push_back(t);
		}
		
		/* 頭 */
		if(count(s.begin(),s.end(),chk[i]) >= 2){
			string t="";
			t+=chk[i];t+=chk[i];
			ableHead.push_back(t);
		}
		
	}
	/* 順子 */
	for(int i=0;i<chk.length()-2;i++){
		if(chk[i+1]==chk[i]+1 && chk[i+2]==chk[i]+2){
			string t="";
			t+=chk[i];t+=chk[i]+1;t+=chk[i]+2;
			able.push_back(t);
		}
	}
	
	/* 単騎待ち探し */
	bt1();
	
	/* 頭待ち探し */
	for(int i=0;i<ableHead.size();i++){
		now.push_back(ableHead[i]);
		bt2();
		now.pop_back();
	}
	
	/* 出力 */
	for(set<ans_t>::iterator it = ans.begin();it != ans.end();it++){
		vector<string> t = (*it).first;
		for(int i=0;i<t.size();i++){
			cout << "(" << t[i] << ")";
		}
		cout << "[" << (*it).second << "]" << endl;
	}
	
}