みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

真面目にHTML16進カラーコードを変換

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

真面目にHTML16進カラーコードを変換

投稿記事 by みけCAT » 14年前

今のコードゴルフの問題はHTML16進カラーコードの変換ですが、これを真面目に実装してみました。

CODE:

#include 
#include 
#include 

/*16進数の文字1文字から数値に変換する*/
int hex2num(char hex) {
	if(hex>='0' && hex='A' && hex='a' && hex<='f')return hex-'a'+10;
	return 0;
}

/*HTMLカラーコードから色に変換する*/
int colhenkan(int* red,int* green,int* blue,const char* code) {
	int i;
	int len;
	/*長さを調べる*/
	len=strlen(code);
	/*長さチェック*/
	if(len!=4 && len!=7)return 0;
	/*先頭の文字チェック*/
	if(code[0]!='#')return 0;
	/*文字チェック*/
	for(i=1;i<len;i++) {
		if(!isxdigit(code[i]))return 0;
	}
	/*変換*/
	if(len==4) {
		/* #FFF のような形式 */
		*red=hex2num(code[1])*17;
		*green=hex2num(code[2])*17;
		*blue=hex2num(code[3])*17;
	} else {
		/* #FFFFFF のような形式 */
		*red=hex2num(code[1])*16+hex2num(code[2]);
		*green=hex2num(code[3])*16+hex2num(code[4]);
		*blue=hex2num(code[5])*16+hex2num(code[6]);
	}
	return 1;
}

/*改行を付けずに標準入力から一行読み込む*/
char* readline(char *buf,int bufsize) {
	char* kai;
	/*読み込めなかったらNULLを返す*/
	if(!fgets(buf,bufsize,stdin))return NULL;
	/*改行の位置を調べる*/
	kai=strchr(buf,'\n');
	/*改行があれば消す*/
	if(kai)*kai=0;
	/*fgetsに合わせる*/
	return buf;
}

/*メイン関数*/
int main(void) {
	char input[1000];
	int red,green,blue;
	/*読み込める間*/
	while(readline(input,sizeof(input))) {
		/*変換できたら*/
		if(colhenkan(&red,&green,&blue,input)) {
			/*結果を出力する*/
			printf("%d,%d,%d\n",red,green,blue);
		} else {
			/*エラー*/
			puts("error");
		}
	}
	/*正常終了*/
	return 0;
}
ちなみに1628B。
コードゴルフの入力例で正しい出力が出ることも確認しています。
http://ideone.com/9GsNO

本家コードゴルフの方は、まだ2人しか投稿していないようなので、是非みなさんにも頑張って欲しいです。

コメントはまだありません。