AOJ 1601 Short PhraseをShort Codingする
AOJ 1601 Short PhraseのShort Coding - cookies.txt .scr
cookiesくんがショートコーディングをしていたのでそれに対抗してみる。
#include<bits/stdc++.h> main(){ for(char s[50],i,j,p,q;p=atoi(gets(s));printf("%d\n",i)){ for(i=0;i<p;s[i++]=strlen(gets(s+i))); for(i=j=0;j<7;) for(p=i++,j=q=1;q>0;) for(q=j++>5?0:j-2&&j-4?8:6;q>1;q-=s[p++]); } }
s[50],j,p,q; main(i){ for(;p=atoi(gets(s));printf("%d\n",i)){ for(i=0;i<p;s[i++]=strlen(gets(s+i))); for(i=j=0;j<7;) for(p=i++,j=q=1;q>0;) for(q=j++>5?0:j-2&&j-4?8:6;q>1;q-=s[p++]); } }
C++よりCのほうが、「#include
q=j++>5?0:j-2&&j-4?8:6
とあるが、これは、
if(j>5){ q=0; j++; } else{ j++; if(j!=2 && j!=4)q=8; else q=6; }
みたいな挙動をしてて、要は、
int x[10]={1,6,8,6,8,8}; q = x[j++];
みたいなことをしてる。
cookiesくんのほうはdefineとgotoでうまいこと制御しているが、
ショートコーディング理論(C/C++編) - Cozy Ozy
によれば、ちゃんとやればdefine文を使わない方が短くなるらしいのでがんばってdefineなしで縮めみた。
ショートコーディングをすると常識がばんばん破壊されるのでよい。
2016/6/29 22:00 修正と追記
クッキー君より、
p=atoi(gets(s)),p;
のとこ、
p=atoi(gets(s));
でよいのでは、と言われたので修正。2byte縮む。(こういうのが盲点に入ってしまうのでたちがわるい)
あと、コードについての解説を追加しました。
2016/7/7 0:00 追記
なんやかんややってて、更に11byte縮んだので追記。 166byte。
http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1893982#1
s[50],j,p,q; main(i){ for(;j=i=atoi(gets(s));printf("%d\n",i)){ for(;i;)s[j-i--]=strlen(gets(s+j)); for(;j;) for(p=i++,j=q=6;q>0;) for(q=6842496>>--j*4&15;q>1;) q-=s[p++]; } } // 6842496は0x686880 のこと。 // x>>--j*4&15 は (x>>(--j)*4))&15 の意 // (奇跡的に演算子の優先順位がぴったりはまって括弧がひとつも要らなくなった)
あと、for(;i;) とか、 for(;j;) とかのあたり、初期化子や判定文を削りに削っているとこが見どころですかね。(前のと比べてだいぶ短くなった)
2016/7/7 13:00 追記
まだ縮んだ。158byte。
http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1903254#1
s[50],j,p,q; main(i){ for(;j=i=atoi(gets(s));printf("%d\n",i)){ for(;i;)s[j-i--]=strlen(gets(s+j)); for(;q>0||j&&(p=i++,j=117933);j/=9) for(q=j%9;q>1;) q-=s[p++]; }}
前回からの進歩として、
「9進法を採用した」(16進法だとj/=16とかq=j%16とかになるので2byte伸びる)(117933は9進法で188686)
「for文がひとつ分なくなった」(まあ、||と&&と()が要るようになったので収支1byteの得ですが)
というのがでかいかと。
皆様の挑戦をお待ちしております。