カメヲラボ

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

Superlong sums(3)

最短コード106B

kurimuraさんが110バイトを切るコードを編み出したhttp://d.hatena.ne.jp/kurimura/20060301


このコードのすばらしいところは、終了判定が*pで可能なことだ。110バイトのコードでは終了判定にgets(p)&&*pとしているため、次のループで*p=0と書かなければならない。*p=0が省略できるということだけで、単純に「4バイトは縮むかな」と私は思った。kurimuraさんのコードは107バイトだが、GCCだし、a[-1]にアクセスした位じゃ落ちないんじゃないカナ?と思ったので以下の様にしてみたらAcceptされた。これで106B。



a['!!!'];
main(char*p){
for(gets(p=a);gets(p),*p;*(int*)p++%=85);
for(;*--p;)*p+=*p>52?++p[-1],-5:5;
puts(a);
}


int*へのキャストが気になってしまうのだが、たとえば


a['!!!'];*d;
main(char*p){
for(gets(p=a);gets(p),*p;*d%=85)d=p++;
for(;*--p;)*p+=*p>52?++p[-1],-5:5;
puts(a);
}
のように書いてもコード短縮にはならない。


私のアイデアではこれが限界だ。というわけで一応最短コードとして公開することにする。これらのコードを参考にして105B以下のコードが通ったらまた教えて下さい > Short Coders