カメヲラボ

主にプログラミングとお勉強全般について書いてます

Sticks(8)

準備

コードを短縮するには、通常のプログラミングで「だめ!」と言われていることをやっていかなければならない。ここからはプログラミングというよりパズルの問題。いかに少ない文字数で、同等の処理をさせられるか。
まず、手始めにシンボル名をすべて一文字にする。
また、配列の初期化はどうしても文字数が増えてしまうため初期化の代わりに新しく宣言しなおすことにする*1


改行コード・空白を省くと330byte程度。まだまだ短縮可能だ。


int L,F,*I;

c(n,l,p,j){
--I[p];
if(n==0)F=1;
if(!F){
if(l-=p){
for(j=l<p?l:p;j>0;--j)
if(I[j])c(n,l,j);
} else {
for(j=50;!I[j];)--j;
c(n-1,L,j);
}
}
++I[p];
}

main(s,b,m){
for(;s;printf("%d\n",L-1)){
int w[51]={s=m=F=0};
scanf("%d",I=&w[0]);
if(w[0]==0)break;
for(;w[0]--;){
scanf("%d",&b);
++w[b]; s+=b; if(m<b)m=b;
}
for(L=m;!F;++L)if(s%L==0)c(s/L,L,m);
}
}

*1:ちなみにこれはロベールさんのアイデア