読者です 読者をやめる 読者になる 読者になる

人材募集企画 2011年版のソースとか

「人生を書き換える者すらいた。人材募集企画 2011年版」 やってみた。 - kyuridenamidaのチラ裏

↑これ。

もう公開可能時期過ぎてたので公開しようと思うます。

といっても、実は当時のソース紛失したのでさっき急いで書きました。

1番:

なんかよくわかんないけど与えられた数"以上"で最小の2^nで表せる数を表示するんだと思います。

0の時も最後の+1によってうまくいくのがナウい

イメージ的には自分を複製していってビットをフルに満たした上での+1なので2^nの形になります。

2番:

ソース無くしたので急いで書いた。10分程度とかいってましたがやっぱりデバッグ含めたら15分くらいは最低でも掛かるらしいです。ごめんなさい。いちおう速いつもりでしたがソースは汚くて、僕が採用する側だったら間違いなくrejectしてる。カンマ演算子等悪質。

(23:23)入力気に食わなかったので弄った。出力はかなり適当ですごめんなさい

#include <iostream>
#include <vector>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)

int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};

bool down(vector<string> &d){
	bool changed = false;
	rep(i,13)rep(j,6)rep(k,12){
		if(d[k][j] != ' ' && d[k+1][j] == ' ')swap(d[k+1][j],d[k][j]) ,changed = true;
	}
	return changed;
}
bool done[100][100] = {0};
vector<string> puyo(19);
void init(){
	rep(j,100)rep(i,100)done[i][j] = false;
}
int rec(int x,int y,char color , bool remove){
	if(puyo[y][x] != color || done[y][x])return 0;
	else if(remove)puyo[y][x] = ' ';
	done[y][x] = true;
	
	int ret = 1;
	rep(i,4){
		int tx = x+dx[i] , ty = y+dy[i];
		if(tx < 0 || ty < 0 || tx >= 6 || ty >= 13)continue;
		ret += rec(tx,ty,color,remove);
	}
	return ret;
}
int main(){
	rep(i,13){
		getline(cin,puyo[i]);
		puyo[i].substr(0,6);
	}
	bool f;
	rep(i,13)cout << puyo[i] << endl;
	do{
		f = down(puyo);
		rep(i,13)cout << puyo[i] << endl;
		rep(i,13)rep(j,6){
			if(puyo[i][j] != ' '){
				if( init(),rec(j,i,puyo[i][j],false) >= 4){
					init(),rec(j,i,puyo[i][j],true);
					f = true;
				}
			}
		}
	}while(f);
	
}