夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

1046,1051

今日は精進二問。あぁ…時間かかりすぎる…

1046

ある式にしたがって予め与えられる16個のRGB値の中から一番差が小さいものを選んでいくという物。

#include <iostream>
#include <vector>
#include <map>
#include <cstdio>
#include <cmath>
#define PB push_back
using namespace std;
typedef vector<int> vi;
typedef vector<vi> vvi;

int dis(int r1, int g1, int b1, int r2, int g2, int b2) {
	return (int)sqrt(pow(r1-r2, 2)+pow(g1-g2, 2)+pow(b1-b2, 2));
}

int main() {
	vvi target, maps;
	for (int i=0; i<16; i++) {
		vi temp(3); scanf("%d %d %d",&temp[0],&temp[1],&temp[2]);
		target.PB(temp);
	}
	int r,g,b;
	while (cin>>r>>g>>b&&r!=-1&&g!=-1&&b!=-1) {
		int min = 1000000;
		int c;
		for (int i=0; i<16; i++) {
			int dist = dis(r,g,b,target[i][0],target[i][1],target[i][2]);
			if (dist < min) {
				min = dist;
				c = i;
			}
		}
		printf("(%d,%d,%d) maps to (%d,%d,%d)\n",r,g,b,target[c][0],target[c][1],target[c][2]);
	}
}

1051

モールス信号を符号化し、どこで区切れば正しい文になるかを数字列にあらわしてそれを逆転し、逆転した数字列の区切りでモールス信号を解読すると正しい文が出てくるというようなルールで、正しい文を求めよう!というもの。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cctype>
#define FOR(i,a,n) for(int (i)=(a); (i)<(n); (i)++)
using namespace std;

string alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_,.?";
string morse[30] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","..--",".-.-","---.","----"};

char encode(string m) {
	int res;
	FOR(i,0,30) {
		if (morse[i]==m) {
			res = i;
			break;
		}
	}
	return alpha[res];
}

int main() {
	int t; cin >> t;
	FOR(ix, 1, t+1) {
		string ms = "", num = "";
		string input; cin >> input;
		FOR(i,0,input.length()) {
			if (isalpha(input[i])) {
				string tmp = morse[input[i]-'A'];
				ms += tmp; num += (char)tmp.length();
			} else {
				switch (input[i]) {
					case '_':
						ms += morse[26];
						num += (char)morse[26].length();
						break;
					case ',':
						ms += morse[27];
						num += (char)morse[27].length();
						break;
					case '.':
						ms += morse[28];
						num += (char)morse[28].length();
						break;
					case '?':
						ms += morse[29];
						num += (char)morse[29].length();
						break;
				}
			}
		}
		reverse(num.begin(), num.end());
		int ad = 0; string res = "";
		FOR(i,0,num.length()) {
			res += encode(ms.substr(ad, (int)num[i]));
			ad += (int)num[i];
		}
		cout << ix << ": " << res << endl;
	}
}

もっと精進したい