メモ

yukicoderでゆるふわgolf

yukicoder No.542 1円玉と5円玉

問題はこちら
No.542 1円玉と5円玉 - yukicoder

5*b+4円以下の範囲については1円玉を5枚以上使うことなく作れるので、その範囲については2重ループ
それ以上は5円玉を全て使った上で1円玉で調整する

main(){
	int a,b;
	scanf("%d%d",&a,&b);
	for(int i=0;i<=b;i++)for(int j=0;j<=4&&j<=a;j++){
		if(i==0&&j==0)continue;
		printf("%d\n",5*i+j);
	}
	for(int j=5;j<=a;j++)printf("%d\n",5*b+j);
}

まあそんなことしなくても、金額ごとに作れるかチェックすれば単純なループで書ける
作れる金額の最大は5*b+a円。これ以下の範囲については、i%5>aとなるようなi円は作れず、それ以外はすべて作れる。

i;main(a,b){for(scanf("%d%d",&a,&b);i++<5*b+a;i%5>a||printf("%d\n",i));}

72B

yukicoder No.536 人工知能

問題はこちら
No.536 人工知能 - yukicoder

後ろ2文字が"ai"かどうかで分ける

char s[99];
int n;
main(){
	gets(s);
	n=strlen(s);
	if(s[n-2]=='a'&&s[n-1]=='i'){
		s[n-2]='A';
		s[n-1]='I';
	}else{
		s[n]='-';
		s[n+1]='A';
		s[n+2]='I';
	}
	puts(s);
}

で、この方針で縮めるとこうなって98B

char s[];
main(f){
	f=strlen(gets(s));
	strcmp(s+f-2,"ai")?s[f]=45,f+=3:0;
	s[f-2]=65,s[f-1]=73;
	puts(s);
}

でもsを編集するより、出力文字数をいじった方が短くなった

char s[];
main(f,g){
	f=strlen(gets(s));
	g=!strcmp(s+f-2,"ai");
	write(1,s,f-2*g);
	puts("-AI"+g);
}

91B
存在は知っていたが使ったことのなかったwrite関数を初めて使った。
文字列の途中までを字数を指定して出力するときに便利

yukicoder No.532 Possible or Impossible

問題はこち
No.532 Possible or Impossible - yukicoder

M+0*(残り) の形が作れれば十分
●M≧4のとき
M+(3-2-1)*(残り)
●M=3のとき
・N=3のとき:3*(2-1)
・N=4のとき:4+2-1*3
・N≧5のとき:3+(5-4-1)*(残り)
●M=2のとき
・N=2のとき:2*1
・N=3のとき:3-2+1
・N≧4のとき:2+(4-3-1)*(残り)
●M=1のとき
・N=1のとき:1
・N=2のとき:2-1
・N=3のとき:3-2*1
・N=4のとき:1*2+3-4
・N≧5のとき:1+(5-3-2)*(残り)
●M=0のとき
・N≦2のとき:無理
・N≧3のとき:(3-2-1)*(残り)

ということで、不可能なのはM=0かつN≦2のときのみ

n,m;
main(){
	scanf("%d%d",&n,&m);
	if(m==0 && n<=2)put("Impossible");
	else puts("Possible");
}

ぎゅ
定数2のところにscanfの返り値が使える

main(n,m){puts(scanf("%d%d",&n,&m)<n|m?"Possible":"Impossible");}

65B

yukicoder No.531 エヌスクミ島の平和協定

問題はこち
No.531 エヌスクミ島の平和協定 - yukicoder

m≧nなら全員で船に乗れば1日で移動できる。そうでないとする。
1回目の移動で船に乗るグループと乗らないグループに分けると、これはどちらも非空集合なので、動物1が船に乗り、動物2が船に乗らないとして一般性を失わない。
このとき「捕食者⇒被捕食者」の対偶「被捕食者でない⇒捕食者でない」から、動物3は船に乗る。
以下帰納的に奇数番目の動物は船に乗り、偶数番目の動物は乗らないことになる。
nが奇数のとき動物nが捕食者でありながら被捕食者でないのでダメ。
nが偶数のときグループ分けはうまくいくが、m<n/2のときは該当する動物が船に乗ることができないのでダメ。
よって「nが偶数かつm≧n/2」が可能であるための必要条件であり、実際にこのときグループ分けに従って、1日目に奇数番、2日目に偶数番の動物が移動することで2日で移動ができる。
m<nなので移動が可能ならば2日が最短である。

n,m,ans;
main(){
	scanf("%d%d",&n,&m);
	if(m>=n)ans=1;
	else if(n%2==0 && m>=n/2)ans=2;
	else ans=-1;
	printf("%d",ans);
}

ぎゅ

main(n,m){scanf("%d%d",&n,&m);printf("%d",n>m?n%2|m<n/2?-1:2:1);}

65B

yukicoder No.530 年齢って毎年変わるし覚えるの難しいよね

問題はこち
No.530 年齢って毎年変わるし覚えるの難しいよね - yukicoder

日付を気にしなくていいので、簡単

y;
main(){
	scanf("%d",&y);
	printf("%d",2017-y);
}

ぎゅ

n;main(){printf("%d",2017-atoi(gets(&n)));}

43B