kmjp's blog

競技プログラミング参加記です

April Fools Day Contest 2017

何か昨年より面白くなかったな…。
http://codeforces.com/contest/784


C,Dは自力で解けなかったのでコメント参照。

A. Numbers Joke

入力値aに対し整数を答えよ。

OEISでjokeを検索すると以下の数列が引っかかるので、これを答える。
A006753 - OEIS

int X;
int AA[]={4, 22, 27, 58, 85, 94, 121, 166, 202, 265, 274, 319, 346, 355, 378, 382, 391, 438, 454, 483, 517, 526, 535, 562, 576, 588, 627, 634, 636, 645, 648, 654, 663, 666, 690, 706, 728, 729, 762, 778, 825, 852, 861, 895, 913, 915, 922, 958, 985, 1086, 1111, 1165};
void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>X;
	cout<<AA[X-1]<<endl;
	
}

B. Kids' Riddle

プログラマの子供なが5~10分で解ける問題である、
入力値nに対し整数を答えよ。

入力値を16進数にし、穴の数を答える。元ネタは以下か。
幼児が数分で解けるのに大人が解けない算数(?)の問題が話題に - NAVER まとめ

int N;
char buf[101];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	sprintf(buf,"%X",N);
	int ret=0;
	FOR(i,10) {
		if(buf[i]=='0') ret++;
		if(buf[i]=='4') ret++;
		if(buf[i]=='6') ret++;
		if(buf[i]=='8') ret+=2;
		if(buf[i]=='9') ret++;
		if(buf[i]=='A') ret+=1;
		if(buf[i]=='B') ret+=2;
		if(buf[i]=='D') ret+=1;
	}
	cout<<ret<<endl;

}

C. INTERCALC

問題文が謎の文章である。
整数列が与えられるので、整数を答えよ。

INTERCALCという言語の処理系に通すと、各行エラーが発生するのでその単語を集める。
すると「配列の最大値と末尾の値のxorを取れ」という文章ができるようだ。

int N;
int A[101];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	FOR(i,N) cin>>A[i];
	cout<<(*max_element(A,A+N)^A[N-1])<<endl;
}

D. Touchy-Feely Palindromes

ある整数が与えられる。YESかNOを答えよ。

整数を点字列とみなし、回文判定する。

int N;
string S;
int T[10]={8,-1,-1,3,6,9,4,7,0,5};

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>S;
	N=S.size();
	FOR(i,N) S[i]-='0';
	FOR(i,N) if(S[N-1-i]!=T[S[i]]) return _P("NO\n");
	_P("YES\n");
}

E. Twisted Circuit

論理回路と4つの値が与えられる。0か1を出力せよ。

論理回路のorとxorを入れ替えて、回路を通した値を答える。

int A[4];
int B[4];
int C[2];
void solve() {
	int i,j,k,l,r,x,y; string s;
	
	FOR(i,4) cin>>A[i];
	B[0] = A[0] ^ A[1];
	B[1] = A[2] | A[3];
	B[2] = A[1] & A[2];
	B[3] = A[0] ^ A[3];
	C[0] = B[0] & B[1];
	C[1] = B[2] | B[3];
	cout<<(C[0]^C[1])<<endl;
}

F. Crunching Numbers Just for You

整数列が与えられる。頑張って昇順に並び替えよ。

1秒以上かけてソートする。

int N;
int A[101];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	int B=0;
	
	clock_t S,E;
	
	cin>>N;
	FOR(i,N) cin>>A[i];
	
	sort(A,A+N);
	FOR(i,N) _P("%d%c",A[i],(i==N-1)?'\n':' ');
	S = clock();
	while(clock()-S < CLOCKS_PER_SEC*1.3);
	
}

G. BF Calculator

数式が与えられるので、その出力を返すBrainfuckのプログラムを返せ。

式の計算自体はevalを使える言語で行ってしまおう。あとは計算後の値を出力するコードを吐けばよい。

S=raw_input()
T=str(eval(S))

R=""
for c in T:
	for a in range(int(c)+48):
		R+="+"
	R+=".>"

print R

まとめ

yukicoderの方が面白かったな…。