メモ

yukicoderでゆるふわgolf

yukicoder No.548 国士無双

問題はこちら
No.548 国士無双 - yukicoder

「a~mのうち、いずれか1種を2つ、残りの12種を1つ含む」というのは「a~mのうち、13種いずれもを1つ以上含み、これら以外を含まない」と同値
よって、与えられた13文字にa~mを加えたものが条件をみたすかをチェックする

s,f;
main(){
	for(int i=0;i<13;i++)s|=1<<(getchar()-'a');
	for(int i=0;i<13;i++)if((s|1<<i)==0x1FFF){
		printf("%c\n",'a'+i);
		f++;
	}
	if(f==0)puts("Impossible");
}

まとめやすくするためにちょっといじる

s,f;
main(i){
	for(;i<14;i++)s|=1<<getchar()-97;
	for(;i<27;i++)(s|1<<i-14)-8191||printf("%c\n",f=83+i);
	f||puts("Impossible");
}

まとめる

s,f;
main(i){
	for(;i<27;(s|1<<i++-14)-8191||printf("%c\n",f=82+i))s|=(i<14)<<getchar()-97;
	f||puts("Impossible");
}

ふと思ってiの増減を逆にしたら2B縮んだ

s,f;main(i){for(;i<27;(s|1<<i++-14)-8191||printf("%c\n",f=96+i))s|=(i<14)<<getchar()-97;f||puts("Impossible");}
s,i=26,f;main(){for(;i;(s|1<<i)-8191||printf("%c\n",f=109-i))s|=--i/13<<109-getchar();f||puts("Impossible");}
//iをmainの引数に入れられない+1B
//8191との一致チェック-3B
//入出力時の定数+2B
//入力時の括弧省略-2B

ということで

s,i=26,f;
main(){
	for(;i;(s|1<<i)-8191||printf("%c\n",f=109-i))s|=--i/13<<109-getchar();
	f||puts("Impossible");
}

108B