メモ

yukicoderでゆるふわgolf

yukicoder No.405 ローマ数字の腕時計

問題はこちら
No.405 ローマ数字の腕時計 - yukicoder


負の数の剰余にだけ注意すれば良い

char a[][5]={"I","II","III","IIII","V","VI","VII","VIII","IX","X","XI","XII"},b[];
i;
main(x){
	for(scanf("%s%d",b,&x);strcmp(b,a[i++]););
	i=!puts(a[(x+i+1199)%12]);
}

思考停止で作ったこれが162Bだからコレよりは短くできないとお話にならない

ということでこんな方針で
入力:ローマ数字を数に変換してsに保存
'I'が来たらs+=1
'V'が来たらs+=5
'X'が来たら、sが0のときはs+=10、そうでないときはs+=8
出力:出力すべき数をsに保存
s=0なら終わり
s=9なら"IX"を出力して終わり
s≧10なら'X'を出力してs-=10
s≧5なら'V'を出力してs-=5
さもなくば'I'を出力してs-=1

最下位bitをみれば'I'と'V''X'は区別でき、下から2つめのbitを見れば'V'と'X'は区別できる

s;
main(x){
	for(;!scanf("%d",&x);s+=x&1?:x&2?5:s?8:10)x=getchar();
	for(s=(s+x+1199)%12;s-8?~s:!puts("IX");putchar(s>8?s-=10,88:s-->3?s-=4,86:73));
	//上記説明とはsが1ずれている事に注意
}

144B