コードを短く書く人のブログ

コードゴルフを稀に取り上げるブログ

AOJ0047 Cup Game

3つのカップがふせて置かれています。カップの置かれている場所を、順にA,B,C と呼ぶことにします。最初はA に置かれているカップの中にボールが隠されているとします。入れ替える2つのカップの位置を保存したデータがあります。このデータを読み込んで、最終的にどの場所のカップにボールが隠されているかを出力して終了するプログラムを作成してください。ただし、カップの位置を入れ替える際には、中に入っているボールも一緒に移動するものとします。

という問題を今回は短くしてみました。

#include <stdio.h>

int main(void)
{
	char cups[4] = {0};
	char swap_a, swap_b;
	int i;
	
	cups[0] = 1;
	
	while (scanf(" %c,%c", &swap_a, &swap_b) != EOF){
		if (cups[swap_a - 'A'] == 1){
			cups[swap_b - 'A'] = 1;
			cups[swap_a - 'A'] = 0;
			continue;
		}
		if (cups[swap_b - 'A'] == 1){
			cups[swap_a - 'A'] = 1;
			cups[swap_b - 'A'] = 0;
		}
	}
	
	for (i = 0; i < 4; i++){
		if (cups[i] == 1){
			 break;
		}
	}
	
	printf("%c\n", 'A' + i);
	
	return (0);
}

こんなかんじで若干残念に書いたわけですよ。
この時点で464byte

ここで色々犠牲にすることによって

p;main(s,a,b){for(;~scanf("%X,%X",&a,&b);p=(p<=s?s-p:p)%3)s=a+b-20;p=!printf("%c\n",65+p);}

91byteまで削ることができました。
結構無茶をしたので解説できないです。

この問題の1位は23byteで、"C"だけを返すソースで憤慨しました。
1月3日に訂正されたようです。情報有り難うございます。

まだまだ、頑張らないといけないです。